Estou procurando fazer uma classificação nos meus dados de texto. Tenho 300 classes
200 documentos de treinamento por turma (mais ou menos 60000 documents in total
) e é provável que isso resulte em dados dimensionais muito altos (podemos estar olhando além das dimensões de 1 milhão ).
Gostaria de executar as seguintes etapas no pipeline (apenas para lhe dar uma idéia de quais são meus requisitos):
- Convertendo cada documento para caracterizar vetor (
tf-idf
ouvector space model
) Feature selection
(deMutual Information
preferência, ou qualquer outro padrão)- Treinar o classificador (
SVM
,Naive Bayes
,Logistic Regression
ouRandom Forest
) - Prevendo dados não vistos com base no modelo do classificador treinado.
Portanto, a pergunta é quais ferramentas / estrutura eu uso para lidar com esses dados de alta dimensão? Estou ciente dos suspeitos do costume (R, WEKA ...), mas no que diz respeito ao meu conhecimento (posso estar errado), possivelmente nenhum deles pode lidar com dados tão grandes. Existe alguma outra ferramenta disponível para venda?
Se eu tiver que paralelizar, devo olhar para o Apache Mahout ? Parece que ainda não fornece a funcionalidade necessária.
Agradecemos antecipadamente a todos.
Atualização: eu procurei neste site , na lista de discussão R e na internet em geral. Parece-me que os seguintes problemas podem surgir na minha situação:
(1) O pré-processamento dos meus dados usando o R ( em particular o pacote tm ) pode ser impraticável , pois tm
será proibitivamente lento.
(2) Como eu precisarei usar um conjunto de pacotes R (pré-processamento, matrizes esparsas, classificadores etc.), a interoperabilidade entre os pacotes pode se tornar um problema, e posso incorrer em uma sobrecarga adicional na conversão de dados de um formato para outro . Por exemplo, se eu fizer meu pré-processamento usando tm
(ou uma ferramenta externa como WEKA), precisarei descobrir uma maneira de converter esses dados em um formato que as bibliotecas HPC no R possam ler. E, novamente, não está claro para mim se os pacotes classificadores receberiam diretamente os dados, conforme fornecidos pelas bibliotecas HPC.
Estou no caminho certo? E mais importante, estou fazendo sentido?
fonte
foreach
biblioteca para escrever código paralelo em R. Isso funciona especialmente bem em conjunto com florestas aleatórias, que são inerentemente fáceis de paralelizar.Respostas:
Isso deve ser possível fazê-lo funcionar desde que os dados sejam representados como uma estrutura de dados esparsa, como
scipy.sparse.csr_matrix
instância em Python. Eu escrevi um tutorial para trabalhar com dados de texto . É ainda possível reduzir ainda mais o uso da memória, aproveitando o truque de hash: adapte-o para usar o emHashingVectorizer
vez deCountingVectorizer
ou oTfidfVectorizer
. Isso é explicado na seção de documentação, extração de recursos de texto .As florestas aleatórias são em geral muito mais caras que os modelos lineares (como máquinas de vetores de suporte linear e regressão logística) e Bayes multinomial ou Bernoulli ingênuo e para a maioria dos problemas de classificação de texto que não trazem precisão preditiva significativamente melhor do que os modelos mais simples.
Se o scikit-learn acabar não sendo capaz de escalar para o seu problema, o Vowpal Wabbit fará (e provavelmente mais rápido que o sklearn), embora não implemente todos os modelos dos quais você está falando.
Editado em abril de 2015 para refletir o estado atual da biblioteca scikit-learn e corrigir links quebrados.
fonte
Gensim para Python é mágico. E como está no Python, você pode usá-lo em conjunto com a sugestão do @ ogrisel.
fonte
Para não tocar minha buzina, fiz uma série de vídeos bastante popular sobre análise de texto com o Rapidminer. Você pode vê-lo aqui:
http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html
Você provavelmente pode evitar a seleção de recursos, basta usar um classificador que não cria uma matriz de milhões * milhões na memória :)
A regressão logística sufocará em muitas dimensões. Naive Bayes assume dimensões independentes, então você ficará bem. O SVM não depende do número de dimensões (mas do número de vetores de suporte), portanto também será bom.
300 são muitas classes, no entanto. Eu começaria com apenas alguns e subisse.
fonte
Primeiro, com base nos seus comentários, eu trataria isso como 300 problemas de classificação binária (sim / não). Existem muitos alunos de classificador binário de código aberto fáceis de usar, e isso permite que você troque tempo pela memória.
SVMs e regressão logística são provavelmente as abordagens mais populares para classificação de texto. Ambos podem lidar facilmente com 1000000 dimensões, uma vez que implementações modernas usam estruturas de dados esparsas e incluem configurações de regularização que evitam o ajuste excessivo.
Vários conjuntos de aprendizado de máquina de código aberto, incluindo WEKA e KNIME , incluem SVMs e regressão logística. As implementações independentes de SVMs incluem libSVM e SVMlight . Para regressão logística, conectarei o BXRtrain e o BXRclassify , que desenvolvi com Madigan, Genkin e outros. O BXRclassify pode criar um índice na memória de milhares de modelos de regressão logística e aplicá-los simultaneamente.
Quanto à conversão de texto em atributo de forma vetorial, de alguma forma sempre acabo escrevendo um pouco de Perl para fazer isso do zero. :-) Mas acho que as suítes de aprendizado de máquina que mencionei incluem código de tokenização e vetorização. Outra rota seria usar um conjunto de ferramentas de linguagem natural como o LingPipe , embora isso possa ser um exagero para você.
fonte
Desde o Sklearn 0.13, existe de fato uma implementação do HashingVectorizer .
Edição: Aqui está um exemplo completo de tal aplicativo de sklearn docs
Basicamente, este exemplo demonstra que você pode classificar texto em dados que não cabem na memória principal do computador (mas no disco / rede / ...).
fonte