Jak wybrać algorytmy uczenia się

21

Muszę wdrożyć program, który klasyfikuje rekordy na 2 kategorie (prawda / fałsz) na podstawie niektórych danych szkoleniowych i zastanawiałem się, na jaki algorytm / metodologię powinienem patrzeć. Wygląda na to, że jest ich wiele do wyboru - sztuczna sieć neuronowa, algorytm genetyczny, uczenie maszynowe, optymalizacja bayesowska itp. Itd. I nie byłem pewien od czego zacząć. Moje pytania brzmią zatem: jak wybrać algorytm uczenia się, którego powinienem użyć w przypadku mojego problemu?

Jeśli to pomoże, oto problem, który muszę rozwiązać.


Dane treningowe:
Dane treningowe składają się z wielu takich wierszy:

Precursor1, Precursor2, Boolean (true/false)

Bieg
dostanę kilka prekursorów.
Następnie,

  1. Wybieram algorytm A spośród różnych algorytmów (lub dynamicznie generuję algorytm) i stosuję go do każdej możliwej kombinacji tych prekursorów i zbieram emitowane „rekordy”. „Rekord” składa się z kilku par klucz-wartość *.
  2. Stosuję niesamowity algorytm i klasyfikuję te rekordy do 2 kategorii (prawda / fałsz).

  3. Wygeneruję tabelę, która ma ten sam format co dane pociągu:
    Precursor1, Precursor2, Boolean

Cały program jest oceniany na podstawie tego, ile prawd / fałszów mam rację.

*: „Record” będzie wyglądać tak (mam nadzieję, że to ma sens)

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

Istnieje tylko skończona liczba możliwych kluczy. Rekordy zawierają różne podzbiory tych kluczy (niektóre rekordy mają key1, key2, key3 ... inne rekordy mają key3, key4 ... itd.).

Potrzebuję 2 nauki. Jednym z nich jest krok 1. Muszę mieć moduł, który przegląda pary Prekursorów itp. I decyduję, jaki algorytm zastosować, aby wysłać rekord do porównania. Kolejny dotyczy kroku 2. Potrzebuję modułu, który analizuje zbiór rekordów i kategoryzuje je na 2 kategorie (prawda / fałsz).

Z góry dziękuję!

Enno Shioji
źródło

Odpowiedzi:

16

Istnieje pakiet dla „ R ” zwany „ karetką ”, który oznacza „testy klasyfikacji i regresji”. Myślę, że byłoby to dobre miejsce na rozpoczęcie, ponieważ z łatwością pozwoli ci zastosować kilkanaście różnych algorytmów uczenia się do twoich danych, a następnie zweryfikować je krzyżowo, aby oszacować, jak dokładne są każde z nich.

Oto przykład, który możesz zmodyfikować za pomocą własnych danych / innych metod:

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

Innym pomysłem byłoby podzielenie danych na zestaw szkoleniowy i testowy, a następnie porównanie działania każdego modelu na zestawie testowym. Jeśli chcesz, mogę ci pokazać, jak to zrobić.

Zach
źródło
8

TXYI

Y

P(Y|T,X,I)

Teraz możemy zastosować dowolną z zasad teorii prawdopodobieństwa, aby przekształcić to w rzeczy, które wiemy, jak obliczyć. Korzystając z twierdzenia Bayesa, otrzymujesz:

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

P(Y|T,I)YY

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)jest rozkładem tylnym parametrów w modelu - jest to część, którą określą dane treningowe. I prawdopodobnie tam pójdzie większość pracy.

θ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

Do tego momentu wszystkie wyniki są dokładne i optymalne (jest to opcja 2 - zastosuj niesamowity algorytm do danych). Ale to trudne zadanie do podjęcia. W prawdziwym świecie wymagana matematyka może być niewykonalna w praktyce - więc będziesz musiał iść na kompromis. zawsze powinieneś „wypróbować” dokładne równania, ponieważ każda matematyka, którą możesz uprościć, pozwoli Ci zaoszczędzić czas na komputerze. Jednak ten pierwszy krok jest ważny, ponieważ określa „cel” i wyjaśnia, co należy zrobić. W przeciwnym razie pozostaniesz (tak, jak się wydaje) z całą masą potencjalnych opcji, bez możliwości wyboru między nimi.

Teraz na tym etapie wciąż jesteśmy w świecie „logiki symbolicznej”, w którym nic tak naprawdę nie ma sensu. Musisz więc powiązać je z konkretnym problemem:

  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¯

Note that the equations will simplify enormously if a) one model is a clear winner, so that P(Mj|Y,T,I)1 and b) within this model, its parameters are very accurate, so the integrand resembles a delta function (and integration is very close to substitution or plug-in estimates). If both these conditions are met you have:

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

Which is the "standard" approach to this kind of problem.

probabilityislogic
źródło