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_weight
paramè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 %
Réponses:
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é.
la source