Comment réduire le nombre de faux positifs?

12

J'essaie de résoudre une tâche appelée détection des piétons et j'entraîne le clasifer binaire sur deux catégories positives - personnes, négatives - en arrière-plan.

J'ai un ensemble de données:

  • nombre de positifs = 3752
  • nombre de négatifs = 3800

J'utilise train \ test split 80 \ 20% et RandomForestClassifier forme scikit-learn avec des paramètres:

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

J'obtiens un score: 95,896757%

test sur les données d'entraînement (fonctionne parfaitement):

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

test sur les données de test:

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

Ma question est de savoir comment réduire le nombre de faux positifs (antécédents classés comme personnes)? Aussi pourquoi j'ai plus de faux positifs que de faux négatifs?

J'ai essayé d'utiliser le class_weightparamètre, mais à un moment donné les performances se dégradent (comme vous pouvez le voir sur 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 %

Il convient également de noter que RandomForest ne semble pas souffrir d'un ensemble de données déséquilibré:

pos = 3752 neg = 10100

class_weight = {0: 1,1: 1} vrai positif: 3007 faux positif: 0 faux négatif: 0 vrai négatif: 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
la source

Réponses:

7

Je ne suis pas un expert en matière de forêts aléatoires, je les ai lues tout récemment. Mais à mon avis, vous surestimez la forêt aléatoire. Ce que je ferais, c'est d'utiliser la technique où vous utilisez les observations hors du sac pour faire des prédictions. Vous pouvez trouver la procédure sur ces diapositives: https://lagunita.stanford.edu/c4x/HumanitiesScience/StatLearning/asset/trees.pdf

Une autre chose que je suggérerais est également mentionnée dans ces diapositives appelée la machine de renforcement de gradient (GBM) également mentionnée dans cette section. Je pense que GBM est plus intuitif que la forêt aléatoire.

Edit1 : je l'ai vérifié à nouveau et il semble que l'amorçage soit la toute première étape de GBM. De plus, je n'ai pas de problèmes de bootstrapping en soi, c'est agréable et bon. Le seul problème, c'est qu'il peut être très mal utilisé.

Nitin Aggarwal
la source