CDBr

Sua fonte de informação em Ciência de Dados

Classificação multirrótulo com o Scikit-Learn do Python

Ilustração de Classificação Multirrótulo com Scikit-Learn em Python

Multilabel Classification: Uma Introdução com o Scikit-Learn do Python

Aprenda a desenvolver um Classificador Multilabel em seu trabalho

Na área de aprendizado de máquina, a classificação é um método de aprendizado supervisionado utilizado para prever rótulos com base nos dados de entrada. Por exemplo, desejamos prever se alguém tem interesse na oferta de vendas utilizando suas características históricas. Ao treinar o modelo de aprendizado de máquina com os dados de treinamento disponíveis, podemos realizar tarefas de classificação para os dados de entrada. Vamos ver a Classificação Multirrótulo.

Frequentemente, nos deparamos com tarefas clássicas de classificação, como classificação binária (dois rótulos) e classificação multiclasse (mais de dois rótulos). Nesse caso, treinamos o classificador, e o modelo tenta prever um dos rótulos dentre todos os rótulos disponíveis. O conjunto de dados usado para a classificação é similar à imagem abaixo.

Imagem representando a importância da mentoria em ciência de dados para alcançar o sucesso profissional

Classificação Multirrótulo: Uma Introdução com o Scikit-Learn do Python

A imagem acima mostra que o alvo (Oferta de Vendas) contém dois rótulos na Classificação Binária e três na Classificação Multiclasse. O modelo será treinado com as características disponíveis e, em seguida, produzirá apenas um rótulo como saída.

A Classificação Multirrótulo difere da Classificação Binária ou Multiclasse. Na Classificação Multilabel, não tentamos prever apenas um rótulo de saída. Em vez disso, a Classificação Multirrótulo tenta prever dados com o maior número possível de rótulos que se apliquem aos dados de entrada. A saída pode variar de nenhum rótulo até o número máximo de rótulos disponíveis.

A Classificação Multilabel é frequentemente utilizada em tarefas de classificação de dados de texto. Por exemplo, aqui está um conjunto de dados de exemplo para Classificação Multilabel.

No exemplo acima, imagine que Texto 1 a Texto 5 são frases que podem ser categorizadas em quatro categorias: Evento, Esporte, Cultura Pop e Natureza. Com os dados de treinamento acima, a tarefa de Classificação Multilabel prevê qual rótulo se aplica à frase fornecida. Cada categoria não é oposta às outras, pois elas não são mutuamente exclusivas; cada rótulo pode ser considerado independente.

Para mais detalhes, podemos ver que o Texto 1 possui os rótulos Esporte e Cultura Pop, enquanto o Texto 2 possui os rótulos Cultura Pop e Natureza. Isso mostra que cada rótulo é mutuamente exclusivo, e a Classificação Multilabel pode ter uma saída de previsão com nenhum rótulo ou todos os rótulos simultaneamente.

Com essa introdução, vamos tentar construir um Classificador Multilabel com o Scikit-Learn.

Classificação Multilabel com o Scikit-Learn

Este tutorial usará o conjunto de dados de Classificação Multilabel da Biomedicina disponível publicamente no Kaggle. O conjunto de dados contém várias características, mas usaremos apenas a característica abstractText juntamente com sua classificação MeSH (A: Anatomia, B: Organismo, C: Doenças, etc.). Os dados de amostra são mostrados na imagem abaixo.

O conjunto de dados acima mostra que cada artigo pode ser classificado em mais de uma categoria, o que são casos de Classificação Multilabel. Com esse conjunto de dados, podemos construir um Classificador Multilabel com o Scikit-Learn. Vamos preparar os dados antes de treinar o modelo.

pythonCopy code
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

df = pd.read_csv('Conjunto de Dados de Classificação Multilabel da PubMed Processado.csv')
df = df.drop(['Título', 'meshMajor', 'pmid', 'meshid', 'meshroot'], axis=1)

X = df["abstractText"]
y = np.asarray(df[df.columns[1:]])

vectorizer = TfidfVectorizer(max_features=2500, max_df=0.9)
vectorizer.fit(X)

No código acima, transformamos os dados de texto em uma representação TF-IDF para que nosso modelo Scikit-Learn possa utilizar os dados de treinamento. Também estou omitindo as etapas de pré-processamento, como a remoção de stopwords, para simplificar o tutorial.

Após a transformação dos dados, dividimos o conjunto de dados em conjuntos de treinamento e teste.

pythonCopy code
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=101)

X_train_tfidf = vectorizer.transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)

Após toda a preparação, começamos a treinar nosso Classificador Multilabel. No Scikit-Learn, usamos o objeto MultiOutputClassifier para treinar o modelo de Classificador Multilabel. A estratégia por trás desse modelo é treinar um classificador por rótulo. Basicamente, cada rótulo tem seu próprio classificador.

Usaremos a Regressão Logística como exemplo, e o MultiOutputClassifier os estenderá para todos os rótulos.

pythonCopy code
from sklearn.multioutput import MultiOutputClassifier
from sklearn.linear_model import LogisticRegression

clf = MultiOutputClassifier(LogisticRegression()).fit(X_train_tfidf, y_train)

Podemos alterar o modelo e ajustar os parâmetros do modelo passados para o MultiOutputClassifier, de acordo com suas necessidades. Após o treinamento, vamos usar o modelo para prever os dados de teste.

pythonCopy code
prediction = clf.predict(X_test_tfidf)
prediction

O resultado da previsão é uma matriz de rótulos para cada categoria MeSH. Cada linha representa a frase, e cada coluna representa o rótulo.

Por fim, precisamos avaliar nosso Classificador Multilabel. Podemos usar métricas de precisão para avaliar o modelo.

pythonCopy code
from sklearn.metrics import accuracy_score
print('Pontuação de Precisão: ', accuracy_score(y_test, prediction))

A pontuação de precisão é 0,145, o que mostra que o modelo só conseguiu prever a combinação exata de rótulos em menos de 14,5% das vezes. No entanto, a pontuação de precisão tem fraquezas para avaliar previsões multilabel. A pontuação de precisão exige que cada frase tenha a presença de todos os rótulos na posição exata, caso contrário, será considerada errada.

Por exemplo, a previsão da primeira linha difere apenas em um rótulo entre a previsão e os dados de teste.

Isso seria considerado uma previsão incorreta para a pontuação de precisão, já que a combinação de rótulos é diferente. É por isso que nosso modelo tem uma pontuação métrica baixa.

Para mitigar esse problema, devemos avaliar a previsão de rótulos em vez da combinação de rótulos. Nesse caso, podemos confiar na métrica de avaliação de Perda de Hamming. A Perda de Hamming é calculada tomando a fração de previsões erradas com o número total de rótulos. Como a Perda de Hamming é uma função de perda, quanto menor for a pontuação, melhor (0 indica nenhuma previsão errada e 1 indica que todas as previsões estão erradas).

pythonCopy code
from sklearn.metrics import hamming_loss
print('Perda de Hamming: ', round(hamming_loss(y_test, prediction), 2))

A Perda de Hamming do nosso Classificador Multilabel é 0,13, o que significa que nosso modelo terá uma previsão errada de 13% do tempo, independentemente. Isso significa que cada previsão de rótulo pode estar errada 13% do tempo.

Conclusão

A Classificação Multirrótulo é uma tarefa de aprendizado de máquina na qual a saída pode ser nenhum rótulo ou todos os rótulos possíveis, com base nos dados de entrada. É diferente da classificação binária ou multiclasse, onde a saída do rótulo é mutuamente exclusiva.

Usando o MultiOutputClassifier do Scikit-Learn, podemos desenvolver um Classificador Multilabel no qual treinamos um classificador para cada rótulo. Para a avaliação do modelo, é melhor usar a métrica de Perda de Hamming, pois a pontuação de precisão pode não fornecer a imagem completa corretamente.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima