Jak zmniejszyć liczbę fałszywych trafień?

12

Próbuję rozwiązać zadanie zwane wykrywaniem pieszych i trenuję binarny clasifer na dwóch kategoriach pozytywnych - ludzie, negatywne - tło.

Mam zestaw danych:

  • liczba wyników dodatnich = 3752
  • liczba ujemna = 3800

Używam train \ test split 80 \ 20% i RandomForestClassifier z scikit-learn z parametrami:

RandomForestClassifier(n_estimators=100, max_depth=50, n_jobs= -1)

Otrzymuję wynik: 95.896757%

test danych treningowych (działa idealnie):

true positive:  3005
false positive:  0
false negative:  0
true negative:  3036

test na danych testowych:

true positive:  742
false positive:  57
false negative:  5
true negative:  707

Moje pytanie brzmi: jak zmniejszyć liczbę fałszywych trafień (tło sklasyfikowane jako ludzie)? Również dlaczego mam więcej fałszywie dodatnich błędów niż fałszywie ujemnych?

Próbowałem użyć class_weightparametru, ale w pewnym momencie wydajność spadła (jak widać w class_weight = {0: 1,1: 4}).

class_weight= {0:1,1:1}
true positive:  3005
false positive:  0
false negative:  0
true negative:  3036

true positive:  742
false positive:  55
false negative:  5
true negative:  709
score: 96.029120 %

class_weight= {0:1,1:2}
true positive:  3005
false positive:  0
false negative:  0
true negative:  3036

true positive:  741
false positive:  45
false negative:  6
true negative:  719
score: 96.624752 %

class_weight= {0:1,1:3}
true positive:  3005
false positive:  0
false negative:  0
true negative:  3036

true positive:  738
false positive:  44
false negative:  9
true negative:  720
score: 96.492389 %

class_weight= {0:1,1:4}
true positive:  3005
false positive:  13
false negative:  0
true negative:  3023

true positive:  735
false positive:  46
false negative:  12
true negative:  718
score: 96.161482 %

class_weight= {0:1,1:5}
true positive:  3005
false positive:  31
false negative:  0
true negative:  3005

true positive:  737
false positive:  48
false negative:  10
true negative:  716
score: 96.161482 %

class_weight= {0:1,1:6}
true positive:  3005
false positive:  56
false negative:  0
true negative:  2980

true positive:  736
false positive:  51
false negative:  11
true negative:  713
score: 95.896757 %

class_weight= {0:1,1:7}
true positive:  3005
false positive:  87
false negative:  0
true negative:  2949

true positive:  734
false positive:  59
false negative:  13
true negative:  705
score: 95.234944 %

Warto również zauważyć, że RandomForest wydaje się nie cierpieć na niezrównoważony zestaw danych:

pos = 3752 neg = 10100

class_weight = {0: 1,1: 1} prawdziwie dodatni: 3007 fałszywie dodatni: 0 fałszywie ujemny: 0 prawdziwie ujemny: 8074

true positive:  729
false positive:  71
false negative:  16
true negative:  1955
score: 96.860339 %

class_weight= {0:1,1:2}
true positive:  3007
false positive:  0
false negative:  0
true negative:  8074

true positive:  728
false positive:  59
false negative:  17
true negative:  1967
score: 97.257308 %

class_weight= {0:1,1:3}
true positive:  3007
false positive:  0
false negative:  0
true negative:  8074

true positive:  727
false positive:  58
false negative:  18
true negative:  1968
score: 97.257308 %
mrgloom
źródło

Odpowiedzi:

7

Nie jestem ekspertem od przypadkowych lasów, czytałem je całkiem niedawno. Ale z tego, jak mi się wydaje, pasujesz do przypadkowego lasu. Chciałbym użyć techniki, w której wykorzystujesz obserwacje poza torbą do przewidywania. Procedurę można znaleźć na tych slajdach: https://lagunita.stanford.edu/c4x/HumanitiesScience/StatLearning/asset/trees.pdf

Jedną inną rzecz, którą zasugerowałem, jest również wspomniana w tych slajdach, zwana maszyną zwiększania gradientu (GBM), również wspomnianą w tym rozdziale. Wydaje mi się, że GBM jest bardziej intuicyjny niż losowy las.

Edycja1 : Sprawdziłem to jeszcze raz i wydaje się, że ładowanie jest pierwszym krokiem GBM. Poza tym nie mam problemów z samo ładowaniem, jest fajnie i dobrze. Jedynym problemem jest to, że można go bardzo źle używać.

Nitin Aggarwal
źródło