Como escolher entre algoritmos de aprendizagem

21

Preciso implementar um programa que classifique os registros em duas categorias (verdadeiro / falso), com base em alguns dados de treinamento, e fiquei pensando em qual algoritmo / metodologia eu deveria estar olhando. Parece haver muitos deles para escolher - Rede Neural Artificial, Algoritmo Genético, Aprendizado de Máquina, Otimização Bayesiana etc. etc., e eu não sabia por onde começar. Portanto, minhas perguntas são: Como devo escolher um algoritmo de aprendizado que devo usar para o meu problema?

Se isso ajudar, aqui está o problema que preciso resolver.


Os dados de treinamento:
Os dados de treinamento consistem em muitas linhas como esta:

Precursor1, Precursor2, Boolean (true/false)

Na corrida
, receberei um monte de precursores.
Então,

  1. Escolho um algoritmo A de diferentes algoritmos (ou gere dinamicamente um algoritmo) e aplico-o em todas as combinações possíveis desses precursores e coleto os "registros" emitidos. O "registro" consiste em vários pares de valores-chave *.
  2. Aplico um algoritmo impressionante e classifico esses registros em 2 categorias (verdadeiro / falso).

  3. Vou gerar uma tabela que tem o mesmo formato que os dados do trem:
    Precursor1, Precursor2, Boolean

E todo o programa é pontuado com base em quantas verdadeiras / falsas eu acertei.

*: "Record" s terá esta aparência (espero que isso faça sentido)

Record         [1...*] Score
-Precursor1             -Key
-Precursor2             -Value

Há apenas um número finito de chaves possíveis. Os registros contêm subconjuntos diferentes dessas chaves (alguns registros possuem chave1, chave2, chave3 ... outros registros possuem chave3, chave4 ... etc.).

Na verdade, eu preciso de 2 aprendizados. Uma é para a etapa 1. Preciso ter um módulo que analise os pares de precursores etc. e decida qual algoritmo aplicar para emitir um registro para a comparação. Outra é a etapa 2. Preciso de um módulo que analise a coleção de registros e os categorize nas 2 categorias (verdadeiro / falso).

Agradeço antecipadamente!

Enno Shioji
fonte

Respostas:

16

Existe um pacote para " R " chamado " sinal de intercalação ", que significa "teste de classificação e regressão". Eu acho que seria um bom lugar para você começar, pois permitirá facilmente aplicar uma dúzia de algoritmos de aprendizado diferentes aos seus dados e validá-los cruzadamente para estimar a precisão deles.

Aqui está um exemplo que você pode modificar com seus próprios dados / outros métodos:

install.packages('caret',dependencies = c('Depends','Suggests'))
library(caret)

set.seed(999)
Precursor1 <- runif(25)
Precursor2 <- runif(25)
Target <- sample(c('T','F'),25,replace=TRUE)
MyData <- data.frame(Precursor1,Precursor2,Target)
str(MyData)

#Try Logistic regression
model_Logistic <- train(Target~Precursor1+Precursor2,data=MyData,method='glm')

#Try Neural Network
model_NN <- train(Target~Precursor1+Precursor2,data=MyData,method='nnet',trace=FALSE)

#Try Naive Bayes
model_NB <- train(Target~Precursor1+Precursor2,data=MyData,method='nb')

#Try Random Forest
model_RF <- train(Target~Precursor1+Precursor2,data=MyData,method='rf')

#Try Support Vector Machine
model_SVM<- train(Target~Precursor1+Precursor2,data=MyData,method='svmLinear')

#Try Nearest Neighbors
model_KNN<- train(Target~Precursor1+Precursor2,data=MyData,method='knn')

#Compare the accuracy of each model
cat('Logistic:',max(model_Logistic$results$Accuracy))
cat('Neural:',max(model_NN$results$Accuracy))
cat('Bayes:',max(model_NB$results$Accuracy))
cat('Random Forest:',max(model_RF$results$Accuracy))
cat('Support Vector Machine:',max(model_SVM$results$Accuracy))
cat('Nearest Neighbors:',max(model_KNN$results$Accuracy))

#Look at other available methods
?train

Outra idéia seria dividir seus dados em um conjunto de treinamento e um conjunto de testes e comparar o desempenho de cada modelo no conjunto de testes. Se você quiser, eu posso lhe mostrar como fazer isso.

Zach
fonte
8

TXYI

Y

P(Y|T,X,I)

Agora podemos usar qualquer uma das regras da teoria da probabilidade para manipular isso em coisas que sabemos como calcular. Então, usando o teorema de Bayes, você obtém:

P(Y|T,X,I)=P(Y|T,I)P(X|Y,T,I)P(X|T,I)

P(Y|T,I)YY

Para o segundo mandato P(X|Y,T,I)P(X|T,I)YY¯Y

O(Y|T,X,I)=P(Y|T,X,I)P(Y¯|T,X,I)=P(Y|T,I)P(Y¯|T,I)P(X|Y,T,I)P(X|Y¯,T,I)

Y

P(X|Y,T,I)θY

P(X|Y,T,I)=P(X,θY|Y,T,I)dθ=P(X|θY,Y,T,I)P(θY|Y,T,I)dθY

P(X|θY,Y,T,I)=P(X|θY,Y,I)TP(θY|Y,T,I)é a distribuição posterior dos parâmetros no modelo - essa é a parte que os dados de treinamento determinariam. E é provavelmente aqui que a maior parte do trabalho irá.

θYMiθY(i)

P(X|Y,T,I)=iP(Mi|Y,T,I)P(X|θY(i),Mi,Y,T,I)P(θY(i)|Mi,Y,T,I)dθY(i)
P(Mi|Y,T,I)=P(Mi|Y,I)P(θY(i)|Mi,Y,I)P(T|θY(i),Mi,Y,I)dθY(i)

Mi

Agora, até este ponto, todos os resultados são exatos e ideais (esta é a opção 2 - aplique algum algoritmo impressionante aos dados). Mas esta é uma tarefa assustadora para empreender. No mundo real, a matemática necessária pode não ser viável na prática - então você terá que se comprometer. você deve sempre tentar fazer as equações exatas, pois qualquer matemática que você possa simplificar poupará tempo no PC. No entanto, este primeiro passo é importante, pois define "o alvo" e deixa claro o que deve ser feito. Caso contrário, você ficará (como parece) com toda uma série de opções em potencial, sem nada para escolher entre elas.

Agora, neste estágio, ainda estamos no mundo da "lógica simbólica", onde nada realmente faz sentido. Então, você precisa vinculá-los ao seu problema específico:

  1. P(Mi|Y,I)
  2. P(θY(i)|Mi,Y,I)
  3. P(T|θY(i),Mi,Y,I)
  4. P(θY(i)|T,Mi,Y,I)
  5. P(Mi|Y,T,I)

Y¯

P(Mj|Y,T,I)1

P(X|Y,T,I)P(X|θY(j),Mj,Y,T,I)θY(j)=θ^Y(j)

Qual é a abordagem "padrão" para esse tipo de problema.

probabilityislogic
fonte