Estoy tratando de resolver una tarea llamada detección de peatones y entreno clasifer binario en dos categorías positivas - personas, negativas - antecedentes.
Tengo un conjunto de datos:
- cantidad de positivos = 3752
- número de negativos = 3800
Uso train \ test split 80 \ 20% y RandomForestClassifier de scikit-learn con parámetros:
RandomForestClassifier(n_estimators=100, max_depth=50, n_jobs= -1)
Obtengo puntaje: 95.896757%
prueba de datos de entrenamiento (funciona perfectamente):
true positive: 3005
false positive: 0
false negative: 0
true negative: 3036
prueba en datos de prueba:
true positive: 742
false positive: 57
false negative: 5
true negative: 707
Mi pregunta es cómo reducir el número de falsos positivos (antecedentes clasificados como personas). Además, ¿por qué tengo más errores positivos falsos que falsos negativos?
Intenté usar el class_weight
parámetro, pero en algún momento el rendimiento se degrada (como puede ver en 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 %
También vale la pena señalar que RandomForest parece no sufrir un conjunto de datos desequilibrado:
pos = 3752 neg = 10100
class_weight = {0: 1,1: 1} verdadero positivo: 3007 falso positivo: 0 falso negativo: 0 verdadero negativo: 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 %
Respuestas:
No soy un experto cuando se trata de bosques aleatorios, los leí hace poco. Pero por lo que me parece, estás sobreajustando el bosque al azar. Lo que haría es utilizar la técnica en la que utiliza las observaciones Fuera de la bolsa para hacer predicciones. Puede encontrar el procedimiento en estas diapositivas: https://lagunita.stanford.edu/c4x/HumanitiesScience/StatLearning/asset/trees.pdf
Otra cosa que sugeriría también se menciona en estas diapositivas llamadas la máquina de aumento de gradiente (GBM) también mencionada en esta sección. Siento que GBM es más intuitivo que el bosque aleatorio.
Edit1 : lo revisé de nuevo y parece que bootstrapping es el primer paso de GBM. Además, no tengo problemas con bootstrapping per se, es bueno y bueno. El único problema es que puede usarse muy mal.
fuente