web-dev-qa-db-fra.com

Comment définir un seuil pour un classificateur sklearn basé sur les résultats ROC?

J'ai formé un ExtraTreesClassifier (index gini) en utilisant scikit-learn et cela convient à mes besoins de manière équitable. Pas si bonne précision, mais en utilisant une validation croisée 10 fois, l'ASC est de 0,95. Je voudrais utiliser ce classificateur sur mon travail. Je suis assez nouveau en ML, alors pardonnez-moi si je vous demande quelque chose de mal sur le plan conceptuel.

J'ai tracé quelques courbes ROC, et par lui, il semble que j'ai un seuil spécifique où mon classificateur commence à bien fonctionner. Je voudrais définir cette valeur sur le classificateur ajusté, donc à chaque fois que j'appelle predire, les classificateurs utilisent ce seuil et je peux croire aux taux FP et TP).

Je suis également venu à ce poste ( scikit .predict () seuil par défaut ), où il a déclaré qu'un seuil n'est pas un concept générique pour les classificateurs. Mais comme ExtraTreesClassifier a la méthode Predict_Proba et que la courbe ROC est également liée à la définition des seuils, il me semble que je devrais être disponible pour la spécifier.

Je n'ai trouvé aucun paramètre, ni aucune classe/interface à utiliser pour le faire. Comment puis-je définir un seuil pour cela pour un ExtraTreesClassifier formé (ou tout autre) en utilisant scikit-learn?

Merci beaucoup, Colis

16
Colis

Voici ce que j'ai fait:

model = SomeSklearnModel()
model.fit(X_train, y_train)
predict = model.predict(X_test)
predict_probabilities = model.predict_proba(X_test)
fpr, tpr, _ = roc_curve(y_test, predict_probabilities)

Cependant, je suis ennuyé que Predict choisisse un seuil correspondant à 0,4% de vrais positifs (les faux positifs sont nuls). La courbe ROC montre un seuil que j'aime mieux pour mon problème où les vrais positifs sont d'environ 20% (faux positifs autour de 4%). Je scanne ensuite les predict_probabilities pour trouver quelle valeur de probabilité correspond à mon point ROC préféré. Dans mon cas, cette probabilité est de 0,21. Ensuite, je crée mon propre tableau de prédiction:

predict_mine = np.where(rf_predict_probabilities > 0.21, 1, 0)

et voilà:

confusion_matrix(y_test, predict_mine)

retourne ce que je voulais:

array([[6927,  309],
       [ 621,  121]])
16
famargar

Il est difficile de fournir une réponse exacte sans exemples de code spécifiques. Si vous effectuez déjà une validation croisée, vous pouvez envisager de spécifier l'AUC comme paramètre à optimiser:

shuffle = cross_validation.KFold(len(X_train), n_folds=10, shuffle=True)
scores = cross_val_score(classifier, X_train, y_train, cv=shuffle, scoring='roc_auc')
0
E.J. White