Aprendizado de Máquina usando Python

53

Estou pensando em usar bibliotecas Python para fazer minhas experiências de Machine Learning. Até agora, eu confiava no WEKA, mas fiquei bastante insatisfeito. Isso ocorre principalmente porque achei que o WEKA não é tão bem suportado (muito poucos exemplos, a documentação é escassa e o apoio da comunidade é menos do que desejável em minha experiência) e me encontrei em situações difíceis sem ajuda futura. Outro motivo pelo qual estou contemplando essa mudança é porque realmente gosto de Python (sou novo em Python) e não quero voltar a codificar em Java.

Então, minha pergunta é: quais são as mais

  1. compreensivo
  2. escalável (recursos de 100 mil, exemplos de 10 mil) e
  3. bibliotecas bem suportadas para fazer ML em Python por aí?

Estou particularmente interessado em fazer a classificação de texto e, portanto, gostaria de usar uma biblioteca que tenha uma boa coleção de classificadores, métodos de seleção de recursos (ganho de informação, Chi-quadrado etc.) e recursos de pré-processamento de texto (remoção, remoção de palavras de parada , tf-idf etc.).

Com base nos tópicos de e-mail anteriores aqui e em outros lugares, estive analisando PyML, scikits-learn e Orange até agora. Como têm sido as experiências das pessoas com relação às três métricas acima mencionadas?

Alguma outra sugestão?

Andy
fonte
Muito obrigado a todos por seus comentários. Acho que por enquanto irei com o NLTK + scikit-learn e verei para onde as coisas vão.
21711 Andy
11
Não posso deixar de propor que você olhe para o R , que tem uma biblioteca ML muito maior e (sendo feito especialmente para esse trabalho) fornece um ambiente muito mais homogêneo. O pacote de mineração de texto de R é apresentado aqui .
@mbq: Sim, eu estou muito ciente do R, mas como tenho que fazer muita programação "não estatística" antes de fazer a mineração de texto real, acho que vou me ater ao Python por enquanto.
28511 Andy
11
Você pode usar o Python e o R. Uma opção é usar um método de armazenamento de idioma neutro, como um banco de dados, para manter os resultados entre as etapas do processamento de dados.
Faheem Mitha 08/12/11
Você pode usar o Weka no seu código Python: dimitri-christodoulou.blogspot.com/2012/03/…

Respostas:

40

Sobre a opção scikit-learn: os recursos de 100k (esparsos) e as amostras de 10k são razoavelmente pequenos o suficiente para caber na memória, portanto são perfeitamente possíveis com o scikit-learn (mesmo tamanho dos 20 grupos de dados de newsgroups).

Aqui está um tutorial que eu dei no PyCon 2011 com um capítulo sobre classificação de texto com exercícios e soluções:

Também dei uma palestra sobre o tópico, que é uma versão atualizada da versão que dei no PyCon FR. Aqui estão os slides (e o vídeo incorporado nos comentários):

Quanto à seleção de recursos, dê uma olhada nesta resposta no quora, em que todos os exemplos são baseados na documentação do scikit-learn:

Ainda não temos extração de recursos de disposição no scikit-learn. Use o nltk e o nltk-trainer para fazer isso nesse meio tempo:

ogrisel
fonte
Obrigado. Esse parece ser um bom caminho a seguir. Eu vou tentar isso.
21711 Andy
@ogrisel, alguns links apodrecem com os três primeiros links (o vídeo no link quatro também está ausente). Aqui está um link para o novo domínio Scikit scikit-learn.org
xtian
14

Em termos de trabalho com texto, dê uma olhada no NLTK. Muito, muito bem suportado e documentado (há até um livro on-line ou em papel, se você preferir) e fará o pré-processamento necessário. Você pode achar o Gensim útil também; a ênfase está na modelagem de espaço vetorial e tem implementações escalonáveis ​​de LSI e LDA (acho que o pLSI também) se forem de interesse. Ele também fará a seleção por tf-idf - não tenho certeza de que o NLTK o faça. Eu usei peças em corpora de ~ 50k sem muita dificuldade.

NLTK: http://www.nltk.org/

Gensim: http://nlp.fi.muni.cz/projekty/gensim/

Infelizmente, quanto ao principal objetivo de sua pergunta, não estou familiarizado com as bibliotecas específicas que você faz referência (embora eu já tenha usado partes de scikits-learn antes).

JMS
fonte
3
+1 para NLTK. Olivier Grisel, que está pesquisando Machine Learning e Processamento de linguagem natural, tem alguns bons tutoriais e slides pela web. Eu posso pensar em Aprendizado Estatístico e Classificação de Texto com NLTK e scikit-learn (PyCON FR 2010), por exemplo.
chl 27/03
@chi Obrigado por esse tutorial, eu ando bisbilhotando um pouco e parece que ele tem muito material interessante por aí. Também exibe uma matriz de confusão com um mapa de calor em seus slides;)
JMS
9

O Python possui uma ampla variedade de bibliotecas ML (consulte mloss.org também). No entanto, sempre tenho a sensação de que é mais útil para pesquisadores de ml do que para praticantes de ml.

Numpy / SciPy e matplotlib são excelentes ferramentas para o trabalho científico com Python. Se você não tem medo de invadir a maioria das fórmulas matemáticas, não ficará desapontado. Além disso, é muito fácil usar a GPU com cudamat ou gnumpy - experimentos que levaram dias antes agora são concluídos em horas ou até minutos.

O garoto mais recente do quarteirão é provavelmente Theano . É uma linguagem simbólica para expressões matemáticas que vem com opmitimzações, implementações de GPU e a diferenciação automática de über que não é nada menos que impressionante para métodos baseados em gradiente.

Além disso, até onde eu sei, o NLTK mencionado pelo JMS é basicamente a biblioteca de linguagem natural de código aberto número um por aí.

Python é a ferramenta certa para aprendizado de máquina.

bayerj
fonte
8

Deixe-me sugerir laranja

compreensivo

sim

escalável (100 mil recursos, 10 mil exemplos)

sim

bibliotecas bem suportadas para fazer ML em Python por aí?

sim

biblioteca que possui uma boa coleção de classificadores, métodos de seleção de recursos (ganho de informação, Chi-Sqaured etc.),

Tudo isso sai da caixa em Orange

e recursos de pré-processamento de texto (stemming, remoção de palavras irrelevantes, tf-idf etc.).

Eu nunca usei a Orange para processamento de texto, embora

Boris Gorelik
fonte
+1 para laranja. Eles possuem uma ótima documentação que mostra como acelerar rapidamente, e você pode usar a GUI de programação visual ou bibliotecas de chamadas do Python.
Josh Hemann 18/10/11
4

Não tenho certeza se isso é particularmente útil, mas há um guia para os programadores aprenderem estatísticas no Python disponíveis online. http://www.greenteapress.com/thinkstats/

Parece muito bom em minha breve varredura e parece falar sobre alguns métodos de aprendizado de máquina, portanto pode ser um bom lugar para começar.

richiemorrisroe
fonte
3

Confira libsvm .

Mike Lawrence
fonte
4
A libsvm não se adapta bem a um grande número de recursos e amostras. Melhor usar liblinear pelos mesmos autores. modelos lineares geralmente são bons o suficiente em espaço dimensional alto.
ogrisel
O libsvm não é o mecanismo svm para o scikits-learn e o Orange? Ou eles realmente voltam à liblinear no caso linear?
John Robertson
3

SHOGUN ( 将軍 ) é uma caixa de ferramentas de aprendizado de máquina em larga escala, o que parece promissor.

Wok
fonte
1

Como o @ogrisel destacou, o scikit-learn é um dos melhores pacotes de aprendizado de máquina disponíveis para o Python. É adequado para conjuntos de dados tão pequenos quanto recursos de 100k (esparsos) e amostras de 10k, e até mesmo para conjuntos de dados marginalmente maiores que podem conter mais de 200k linhas. Basicamente, qualquer conjunto de dados que caiba na memória.

Mas, se você estiver procurando por uma estrutura de aprendizado de máquina Python altamente escalável, eu recomendo o Pyspark MLlib. Como os conjuntos de dados hoje em dia podem crescer exponencialmente (dado o big data e a onda de aprendizado profundo), muitas vezes você precisa de uma plataforma que possa ser bem dimensionada e executada rapidamente, não apenas na fase de treinamento do modelo, mas também durante a fase de engenharia de recursos (transformação de recursos , seleção de recurso). Vejamos todas as três métricas da plataforma Spark Mllib em que você está interessado:

  1. Escalabilidade: se o seu conjunto de dados pode caber na memória, o scikit-learn deve ser sua escolha. Se for grande demais para caber na memória, o Spark é o caminho a percorrer. O importante a ser observado aqui é que o Spark funciona mais rápido apenas em uma configuração distribuída.

  2. Abrangência: o Sklearn é muito mais rico em termos de implementações decentes de um grande número de algoritmos comumente usados ​​em comparação com o spark mllib. O suporte para manipulação e transformação de dados também é mais rico no scikit-learn. O Spark Mllib possui módulos de transformação de dados suficientes que fazem o truque na maioria das vezes. Portanto, caso você acabe com o spark mllib por questões de escalabilidade, ainda poderá fazer o trabalho. Possui todo o suporte para análise de correlação, extração de recursos (tf-idf, word2vec, CountVectorizer), transformação de recursos (Tokenizer, StopWordsRemover, nn-gram, Binarizer, PCA etc.). Para uma lista detalhada, consulte o link abaixo:

Extraindo, transformando e selecionando recursos no Spark mllib

  1. Classificação: o Spark mllib possui a implementação de todos os principais algoritmos que você usaria na maioria das vezes (incluindo algos que funcionam bem para a classificação de texto). Para uma visão geral detalhada de quais algoritmos estão disponíveis no mllib, consulte o link abaixo.

Classificação e regressão de Mllib

Bônus: O Apache Spark tem suporte para Python, R, Java e Scala. Portanto, se amanhã você decidir experimentar um idioma diferente (como uma escolha pessoal ou por razões profissionais), não precisará aprender uma estrutura totalmente nova.

Abhishek Arora
fonte
0

Não sei se você ainda está procurando algum conselho (você fez essa pergunta há 5 meses ...). Eu comecei este livro e até agora está muito bem:

https://www.amazon.com.mx/dp/1491962291/ref=cm_cr_ryp_prd_ttl_sol_3

O autor mostra código, exemplos e explica alguma teoria e matemática "nos bastidores" dos algoritmos de ML. Estou achando isso muito instrutivo. Espero que isso possa ser o mesmo para você.

Alejandro Carrera
fonte