Suponha que eu esteja trabalhando em algum problema de classificação. (A detecção de fraude e o spam de comentários são dois problemas nos quais estou trabalhando agora, mas estou curioso sobre qualquer tarefa de classificação em geral.)
Como sei qual classificador devo usar?
- Árvore de decisão
- SVM
- Bayesiano
- Rede neural
- K-vizinhos mais próximos
- Q-learning
- Algoritmo genético
- Processos de decisão de Markov
- Redes neurais convolucionais
- Regressão linear ou regressão logística
- Impulsionar, ensacamento, ensambling
- Escalada aleatória ou recozimento simulado
- ...
Em quais casos um deles é a primeira escolha "natural" e quais são os princípios para sua escolha?
Exemplos do tipo de respostas que estou procurando (do livro Introdução à recuperação de informações de Manning et al. ):
uma. Se seus dados estiverem rotulados, mas você tiver apenas uma quantidade limitada, use um classificador com alto viés (por exemplo, Naive Bayes) .
Suponho que isso ocorre porque um classificador de viés mais alto terá menor variação, o que é bom por causa da pequena quantidade de dados.
b. Se você tem uma tonelada de dados, o classificador não importa muito, então você provavelmente deve escolher um classificador com boa escalabilidade.
Quais são as outras diretrizes? Até respostas como "se você tiver que explicar seu modelo para alguém da alta gerência, talvez deva usar uma árvore de decisão, pois as regras de decisão são bastante transparentes" são boas. Eu me importo menos com questões de implementação / biblioteca, no entanto.
Além disso, para uma pergunta um pouco separada, além dos classificadores bayesianos padrão, existem métodos 'avançados' para detecção de spam de comentários (em oposição ao spam de email)?
Respostas:
Primeiro de tudo, você precisa identificar seu problema. Depende de que tipo de dados você possui e qual é a sua tarefa desejada.
Existem algoritmos diferentes em cada abordagem mencionada acima. A escolha de um algoritmo específico depende do tamanho do conjunto de dados.
Fonte: http://scikit-learn.org/stable/tutorial/machine_learning_map/
fonte
A seleção de modelo usando validação cruzada pode ser o que você precisa.
Validação cruzada
O que você faz é simplesmente dividir seu conjunto de dados em k subconjuntos (dobras) não sobrepostos, treinar um modelo usando dobras k-1 e prever seu desempenho usando a dobra que você deixou de fora. Isso é feito para cada combinação possível de dobras (primeiro deixe a 1ª dobra para fora, depois a 2ª, ..., depois ak e treine com as dobras restantes). Após o término, você estima o desempenho médio de todas as dobras (talvez também a variação / desvio padrão do desempenho).
Como escolher o parâmetro k depende do tempo que você tem. Os valores usuais para k são 3, 5, 10 ou até N, onde N é o tamanho dos seus dados (é o mesmo que validação cruzada de exclusão única ). Eu prefiro 5 ou 10.
Seleção de modelo
Digamos que você tenha 5 métodos (ANN, SVM, KNN, etc) e 10 combinações de parâmetros para cada método (dependendo do método). Você simplesmente precisa executar a validação cruzada para cada combinação de método e parâmetro (5 * 10 = 50) e selecionar o melhor modelo, método e parâmetros. Depois, você treina novamente com o melhor método e parâmetros em todos os seus dados e você tem seu modelo final.
Há mais algumas coisas a dizer. Se, por exemplo, você usa muitos métodos e combinações de parâmetros para cada um, é muito provável que você se ajuste demais. Em casos como esses, é necessário usar a validação cruzada aninhada .
Validação cruzada aninhada
Na validação cruzada aninhada , você executa a validação cruzada no algoritmo de seleção de modelo.
Novamente, você primeiro divide seus dados em k dobras. Após cada etapa, você escolhe k-1 como dados de treinamento e o restante como dados de teste. Em seguida, você executa a seleção do modelo (o procedimento que expliquei acima) para cada combinação possível dessas k dobras. Depois de terminar, você terá k modelos, um para cada combinação de dobras. Depois disso, você testa cada modelo com os dados restantes e escolhe o melhor. Novamente, depois de ter o último modelo, você treina um novo com o mesmo método e parâmetros em todos os dados que possui. Esse é o seu modelo final.
Claro, existem muitas variações desses métodos e outras coisas que não mencionei. Se você precisar de mais informações sobre isso, procure algumas publicações sobre esses tópicos.
fonte
O livro " OpenCV " possui ótimas duas páginas, nas páginas 462-463 . Pesquisando na pré-visualização da Amazon pela palavra "discriminativo" (provavelmente no Google Livros também), você verá as páginas em questão. Essas duas páginas são a maior jóia que encontrei neste livro.
Em resumo:
Reforço - geralmente eficaz quando uma grande quantidade de dados de treinamento está disponível.
Árvores aleatórias - geralmente muito eficazes e também podem executar regressão .
K-vizinhos mais próximos - a coisa mais simples que você pode fazer, geralmente eficaz, mas lenta e requer muita memória .
Redes neurais - lento para treinar, mas muito rápido para executar , ainda é um ótimo desempenho para reconhecimento de letras .
SVM - entre os melhores com dados limitados , mas perdendo contra o aumento ou árvores aleatórias somente quando grandes conjuntos de dados estão disponíveis.
fonte
As coisas que você pode considerar ao escolher qual algoritmo usar incluem:
Você precisa treinar de forma incremental (em vez de em lotes)?
Se você precisar atualizar seu classificador com novos dados com frequência (ou você tiver muitos dados), provavelmente desejará usar o bayesiano. Redes neurais e SVM precisam trabalhar com os dados de treinamento de uma só vez.
Seus dados são compostos apenas por categorias , apenas numéricos ou ambos ?
Eu acho que o Bayesian funciona melhor com dados categóricos / binomiais. As árvores de decisão não podem prever valores numéricos.
Você ou seu público precisa entender como o classificador funciona?
Use árvores bayesianas ou de decisão, pois elas podem ser facilmente explicadas para a maioria das pessoas. Redes neurais e SVM são "caixas negras" no sentido de que você não pode realmente ver como elas estão classificando os dados.
Quanta velocidade de classificação você precisa?
Os SVMs são rápidos quando se trata de classificação, pois eles precisam apenas determinar em que lado da "linha" seus dados estão. As árvores de decisão podem ser lentas, especialmente quando são complexas (por exemplo, muitos ramos).
Complexidade .
Redes neurais e SVMs podem lidar com classificação não linear complexa.
fonte
Como o professor Andrew Ng costuma afirmar: sempre comece implementando um algoritmo grosseiro e sujo e, em seguida, refine-o iterativamente .
Para a classificação, o Naive Bayes é um bom iniciador, pois apresenta bons desempenhos, é altamente escalável e pode se adaptar a quase qualquer tipo de tarefa de classificação. Além disso, 1NN (K-vizinhos mais próximos com apenas 1 vizinho) é um algoritmo de melhor ajuste sem problemas (porque os dados serão o modelo e, portanto, você não precisa se preocupar com o ajuste de dimensionalidade do seu limite de decisão), o único O problema é o custo de computação (quadrático, porque você precisa calcular a matriz de distância, portanto, pode não ser uma boa opção para dados de alta dimensão).
Outro bom algoritmo inicial é o Random Forests (composto de árvores de decisão), que é altamente escalável para qualquer número de dimensões e tem desempenhos geralmente aceitáveis. Finalmente, existem algoritmos genéticos , que escalam admiravelmente bem para qualquer dimensão e qualquer dado com conhecimento mínimo dos dados, sendo a implementação mais mínima e mais simples o algoritmo genético microbiano (apenas uma linha de código C! 1996) e um dos mais complexos sendo CMA-ES e MOGA / e-MOEA.
E lembre-se de que, frequentemente, você não pode realmente saber o que funcionará melhor em seus dados antes de experimentar os algoritmos de verdade.
Como observação lateral, se você deseja uma estrutura teórica para testar suas hipóteses e desempenho teórico dos algoritmos para um determinado problema, pode usar a estrutura de aprendizado do PAC (provavelmente aproximadamente correta) (cuidado: é muito abstrato e complexo!), Mas para Em resumo, a essência do aprendizado do PAC diz que você deve usar o algoritmo menos complexo, mas complexo o suficiente (a complexidade é a dimensionalidade máxima que o algo pode caber) que pode caber nos seus dados. Em outras palavras, use a navalha da Occam.
fonte
Sam Roweis costumava dizer que você deveria tentar Bayes ingênuo, regressão logística, vizinho mais próximo k e discriminante linear de Fisher antes de qualquer outra coisa.
fonte
Minha opinião é que você sempre executa primeiro os classificadores básicos para ter uma noção dos seus dados. Mais frequentemente do que não (pelo menos em minha experiência) eles foram bons o suficiente.
Portanto, se você tiver supervisionado dados, treine um classificador Naive Bayes. Se você tiver dados não supervisionados, tente o agrupamento k-means.
Outro recurso é um dos vídeos de palestras da série de vídeos Stanford Machine Learning , que eu assisti um tempo atrás. No vídeo 4 ou 5, acho que o palestrante discute algumas convenções geralmente aceitas ao treinar classificadores, vantagens / trocas, etc.
fonte
Você sempre deve levar em conta a compensação de inferência versus previsão .
Se você deseja entender o relacionamento complexo que está ocorrendo em seus dados, deve usar um rico algoritmo de inferência (por exemplo, regressão linear ou laço). Por outro lado, se você estiver interessado apenas no resultado, poderá usar algoritmos de alta dimensão e mais complexos (mas menos interpretáveis), como redes neurais.
fonte
A seleção do algoritmo depende do cenário e do tipo e tamanho do conjunto de dados. Existem muitos outros fatores.
Esta é uma breve folha de dicas para o aprendizado de máquina básico.
fonte
Primeiro de tudo, depende do tipo de problema com o qual você está lidando, seja classificação ou regressão. Em seguida, escolha seu modelo com sabedoria. Depende de um modelo específico. Um modelo específico supera outros modelos. Suponha que você esteja trabalhando no wine_dataset da biblioteca sklearn e primeiro tente treinar os dados com o kernel svm com linear e obtenha algum tipo de precisão e depois considere que isso não é satisfatório, e tente treinar seus dados com o DecisionTreeClassifier () e então você tentou com RandomForestClassifier (). Depois disso, qualquer precisão será melhor ou você pode dizer que se encaixa nos seus dados, você pode concluir isso. Há uma diferença sintática tão pequena que você encontrará enquanto continua alterando o modelo para teste. Então, tudo de melhor e entender bem o problema.
fonte