Estou tentando criar um classificador de várias etiquetas para atribuir tópicos a documentos existentes usando o scikit
Estou processando meus documentos passando-os TfidfVectorizer
pelos rótulos MultiLabelBinarizer
e criando um OneVsRestClassifier
com um SGDClassifier
como estimador.
No entanto, ao testar meu classificador, apenas recebo pontuações de 0,29, o que pelo que li é bastante baixo para problemas semelhantes. Tentei várias opções no TfidfVectorizer, como palavras irrelevantes, unigramas, stemming e nada parece mudar tanto o resultado.
Também usei GridSearchCV
para obter os melhores parâmetros para meu estimador e, atualmente, estou sem ideias sobre o que tentar em seguida.
Ao mesmo tempo, pelo que eu entendo que não posso usar scikit.metrics
com OneVsRestClassifier
assim como eu posso obter algumas métricas (F1, precisão, Recall etc), de modo a descobrir o que está errado?
Pode haver um problema com meu corpus de dados?
Update: Eu também tentei usar CountVectorizer
e HashingVectorizer
e canalizando-os para TfidfTransformer
, mas os resultados são semelhantes. Por isso, acho que a abordagem do pacote de palavras está fazendo o melhor no domínio da tokenização e o resto depende do classificador ...
fonte
score
no classificador,Returns the mean accuracy on the given test data and labels. In multi-label classification, this is the subset accuracy which is a harsh metric since you require for each sample that each label set be correctly predicted.
Respostas:
A precisão do subconjunto é de fato uma métrica severa. Para ter uma noção de quão bom ou ruim é 0,29, alguma idéia:
Você também pode calcular a pontuação de hamming, para ver se o seu classificador não tem noção ou é decentemente bom, mas tem problemas para prever todos os rótulos corretamente. Veja abaixo para calcular a pontuação de hamming.
Consulte Como calcular a precisão / recuperação para a classificação multiclass-multilabel? . Eu esqueci se o sklearn suporta, lembro que tinha algumas limitações, por exemplo, o sklearn não suporta rótulos múltiplos para matriz de confusão . Seria uma boa ideia ver esses números de fato.
Pontuação de Hamming :
Em uma configuração de classificação de vários rótulos ,
sklearn.metrics.accuracy_score
apenas calcula a precisão do subconjunto (3): ou seja, o conjunto de rótulos previsto para uma amostra deve corresponder exatamente ao conjunto de rótulos correspondente em y_true.Essa maneira de calcular a precisão é às vezes chamada, talvez menos ambiguamente, da proporção exata de correspondência (1):
Outra maneira típica de calcular a precisão é definida em (1) e (2), e menos ambiguamente referida como a pontuação de Hamming (4) (uma vez que está intimamente relacionada à perda de Hamming) ou precisão baseada em rótulo ). É calculado da seguinte forma:
Aqui está um método python para calcular a pontuação de Hamming:
Saídas:
(1) Sorower, Mohammad S. " Uma pesquisa bibliográfica sobre algoritmos para aprendizado de vários rótulos " . Oregon State University, Corvallis (2010).
(2) Tsoumakas, Grigorios e Ioannis Katakis. "Classificação multi-etiqueta: Uma visão geral. " Departamento de Informática, Universidade Aristóteles de Thessaloniki, Grécia (2006).
(3) Ghamrawi, Nadia e Andrew McCallum. "Classificação coletiva de rótulos múltiplos. " Anais da 14ª conferência internacional da ACM sobre gestão de informações e conhecimento. ACM, 2005.
(4) Godbole, Shantanu e Sunita Sarawagi. " Métodos discriminatórios para classificação com vários rótulos. " Avanços na descoberta de conhecimento e mineração de dados. Springer Berlin Heidelberg, 2004. 22-30.
fonte
hamming_score
função gera erros no Keras: <ipython-input-34-16066d66dfdd> em hamming_score (y_true, y_pred, normalize, sample_weight) 60 '' '61 acc_list = [] ---> 62 para i no intervalo (y_true.shape [ 0]): 63 set_true = set (np.where (y_true [i]) [0]) 64 set_pred = set (np.where (y_pred [i]) [0]) TypeError: índice retornado não int (tipo NoneType )A pontuação de 0,29 não é suficiente? Como é a sua matriz de confusão? Existem alguns tópicos que não podem ser separados talvez apenas olhando o conteúdo da palavra?
Caso contrário, tente inverter o problema: Imagine que as pontuações mais baixas são realmente o melhor que o seu classificador pode fazer nos seus dados. Isso significaria que seus documentos não são classificáveis usando essa abordagem.
Para testar esta hipótese, você precisa de um conjunto de documentos de teste com características conhecidas da palavra-chave (que você mesmo cria). Você deve obter 100% de pontuação.
Caso contrário, você tem um bug. Caso contrário, você precisará de uma abordagem diferente para classificar seus documentos. Pergunte a si mesmo: como os documentos das diferentes classes diferem entre si? Preciso examinar outros recursos dos meus documentos, etc.
fonte