web-dev-qa-db-fra.com

Utilisation de la fonction Predict_proba () de RandomForestClassifier de manière sûre et correcte

J'utilise Scikit-learn pour appliquer l'algorithme d'apprentissage automatique sur mes ensembles de données. Parfois, j'ai besoin de disposer des probabilités d'étiquettes/classes des étiquettes/classes elles-mêmes. Au lieu d'avoir Spam/Not Spam comme étiquettes d'e-mails, je souhaite avoir seulement par exemple: 0,78 de probabilité qu'un e-mail donné soit du Spam.

À cette fin, j'utilise predict_proba () avec RandomForestClassifier comme suit:

clf = RandomForestClassifier(n_estimators=10, max_depth=None,
    min_samples_split=1, random_state=0)
scores = cross_val_score(clf, X, y)
print(scores.mean())

classifier = clf.fit(X,y)
predictions = classifier.predict_proba(Xtest)
print(predictions)

Et j'ai obtenu ces résultats:

 [ 0.4  0.6]
 [ 0.1  0.9]
 [ 0.2  0.8]
 [ 0.7  0.3]
 [ 0.3  0.7]
 [ 0.3  0.7]
 [ 0.7  0.3]
 [ 0.4  0.6]

Où la deuxième colonne est pour la classe: Spam. Cependant, j'ai deux problèmes principaux avec les résultats dont je ne suis pas sûr. Le premier problème est que les résultats représentent les probabilités des labels sans être affectés par la taille de mes données? Le deuxième problème est que les résultats ne montrent qu'un seul chiffre, ce qui n'est pas très spécifique dans certains cas où la probabilité de 0,701 est très différente de 0,708. Existe-t-il un moyen d'obtenir les 5 chiffres suivants par exemple?

Merci d'avance pour votre temps dans la lecture de ces deux numéros et de leurs questions.

19
Clinical
  1. J'obtiens plus d'un chiffre dans mes résultats, êtes-vous sûr que ce n'est pas dû à votre ensemble de données? (par exemple, l'utilisation d'un très petit ensemble de données donnerait des arbres de décision simples et donc des probabilités "simples"). Sinon, il se peut que l'affichage ne montre qu'un chiffre, mais essayez d'imprimer predictions[0,0].

  2. Je ne suis pas sûr de comprendre ce que vous entendez par "les probabilités ne sont pas affectées par la taille de mes données". Si vous craignez que vous ne vouliez pas prévoir, par exemple, trop de spams, ce qui est généralement fait est d'utiliser un seuil t de telle sorte que vous prédisez 1 if proba(label==1) > t. De cette façon, vous pouvez utiliser le seuil pour équilibrer vos prévisions, par exemple pour limiter la probabilité globale de spam. Et si vous souhaitez analyser globalement votre modèle, nous calculons généralement l'aire sous la courbe (AUC) de la courbe de caractéristique de fonctionnement du récepteur (ROC) (voir l'article wikipedia ici ). Fondamentalement, la courbe ROC est une description de vos prévisions en fonction du seuil t.

J'espère que ça aide!

5
Sebastien

Un RandomForestClassifier est une collection de DecisionTreeClassifier. Quelle que soit la taille de votre ensemble d'entraînement, un arbre de décision revient simplement: une décision. Une classe a une probabilité 1, les autres classes ont une probabilité 0.

Le RandomForest vote simplement parmi les résultats. predict_proba() renvoie le nombre de votes pour chaque classe (chaque arbre dans la forêt prend sa propre décision et choisit exactement une classe), divisé par le nombre d'arbres dans la forêt. Par conséquent, votre précision est exactement 1/n_estimators. Vous voulez plus de "précision"? Ajoutez d'autres estimateurs. Si vous voulez voir la variation au 5ème chiffre, vous aurez besoin de 10**5 = 100,000 estimateurs, ce qui est excessif. Normalement, vous ne voulez pas plus de 100 estimateurs, et souvent pas autant.

13
Andreus