web-dev-qa-db-ja.com

ROCの結果に基づいてsklearn分類器のしきい値を設定するにはどうすればよいですか?

Scikit-learnを使用してExtraTreesClassifier(giniインデックス)をトレーニングしましたが、これは私のニーズにかなり合っています。それほど正確ではありませんが、10倍の交差検証を使用すると、AUCは0.95です。私は自分の仕事でこの分類器を使用したいと思います。私はMLを初めて使用するので、概念的におかしいことをお聞きした場合はご容赦ください。

いくつかのROC曲線をプロットしましたが、それによって、分類器がうまく機能し始める特定のしきい値があるようです。フィットした分類器にこの値を設定したいので、predictを呼び出すたびに、分類器はそのしきい値を使用し、FPおよびTPレートを信じることができます。

また、この投稿( scikit .predict()default threshold )に行きました。ここでは、しきい値は分類子の一般的な概念ではないと述べています。しかし、ExtraTreesClassifierにはpredict_probaメソッドがあり、ROC曲線もしきい値の定義に関連しているため、指定できるようになっているはずです。

パラメータも、そのために使用するクラス/インターフェイスも見つかりませんでした。 scikit-learnを使用して、トレーニング済みのExtraTreesClassifier(または他の任意のクラス)のしきい値を設定するにはどうすればよいですか?

どうもありがとう、コリス

14
Colis

これは私がやったことです:

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)

しかし、predictが真の陽性の0.4%に対応するしきい値を選択することに悩まされます(偽陽性はゼロです)。 ROC曲線は、真の陽性が約20%(約4%​​の偽陽性)である問題に対して、私が好むしきい値を示しています。次に、predict_probabilitiesをスキャンして、お気に入りのROCポイントに対応する確率値を見つけます。私の場合、この確率は0.21です。次に、独自の予測配列を作成します。

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

そしてそこに行きます:

confusion_matrix(y_test, predict_mine)

私が欲しかったものを返します:

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

特定のコード例を使用せずに正確な答えを提供することは困難です。既に相互検証を行っている場合は、最適化するパラメーターとしてAUCを指定することを検討できます。

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