Desde la perspectiva comercial, los falsos negativos conducen a costos diez veces más altos (dinero real) que los falsos positivos. Dados mis modelos de clasificación binaria estándar (logit, bosque aleatorio, etc.), ¿cómo puedo incorporar esto en mi modelo?
¿Tengo que cambiar (peso) la función de pérdida a favor del error 'preferido' (FP)? Si es así, ¿cómo hacer eso?
Hay varias opciones para ti:
Como se sugiere en los comentarios, class_weight
debería impulsar la función de pérdida hacia la clase preferida. Esta opción es compatible con varios estimadores, incluidos sklearn.linear_model.LogisticRegression
, sklearn.svm.SVC
, sklearn.ensemble.RandomForestClassifier
y otros. Tenga en cuenta que no hay un límite teórico para la relación de peso, por lo que incluso si 1 a 100 no es lo suficientemente fuerte para usted, puede continuar con 1 a 500, etc.
También puede seleccionar un umbral de decisión muy bajo durante la validación cruzada para elegir el modelo que proporcione la recuperación más alta (aunque posiblemente de baja precisión). El recuerdo cercano a 1.0
significa efectivamente false_negatives
cercanos a 0.0
, que es lo que se desea. Para eso, usa las funciones sklearn.model_selection.cross_val_predict
y sklearn.metrics.precision_recall_curve
:
y_scores = cross_val_predict(classifier, x_train, y_train, cv=3, method="decision_function") precisions, recalls, thresholds = precision_recall_curve(y_train, y_scores)
Si traza las precisions
y recalls
contra los thresholds
, debería ver la imagen como esta:
Después de elegir el mejor umbral, puede usar las puntuaciones sin procesar del método classifier.decision_function()
para su clasificación final.
Finalmente, intente no optimizar en exceso su clasificador, porque puede terminar fácilmente con un clasificador const trivial (que obviamente nunca está mal, pero es inútil).
Como mencionó @Maxim, hay 2 etapas para realizar este tipo de ajuste: en la etapa de entrenamiento del modelo (como pesos personalizados) y la etapa de predicción (como reducir el umbral de decisión).
Otro ajuste para la etapa de entrenamiento del modelo es el uso de un anotador de recuperación . puede usarlo en su validación cruzada de búsqueda en cuadrícula ( GridSearchCV ) para ajustar su clasificador con el mejor hiperparámetro hacia un alto recuerdo.
El parámetro de puntuación de GridSearchCV puede aceptar la cadena 'recordar' o la funciónrecall_score .
Dado que está utilizando una clasificación binaria, ambas opciones deberían funcionar de inmediato y llamar arecall_score con sus valores predeterminados que se adaptan a una clasificación binaria:
Si necesita personalizarlo, puede envolver un marcador existente, o uno personalizado, con make_scorer y pasarlo al parámetro de puntuación .
Por ejemplo:
from sklearn.metrics import recall_score, make_scorer recall_custom_scorer = make_scorer( lambda y, y_pred, **kwargs: recall_score(y, y_pred, pos_label='yes')[1] ) GridSearchCV(estimator=est, param_grid=param_grid, scoring=recall_custom_scorer, ...)