web-dev-qa-db-ja.com

cross_val_scoreとscoring = 'roc_auc'とroc_auc_scoreの違いは何ですか?

Cross_val_scoreスコアリングメトリック 'roc_auc'と、直接インポートして直接呼び出すことができるroc_auc_scoreの違いについて混乱しています。

ドキュメント( http://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter )は、scoring = 'roc_auc'を指定するとsklearn.metrics.roc_auc_scoreを使用することを示しています。ただし、GridSearchCVまたはcross_val_scoreをscoring = 'roc_auc'で実装すると、roc_auc_scoreを直接呼び出す場合とは非常に異なる数値を受け取ります。

ここに私が見るものを示すのを助ける私のコードがあります:

# score the model using cross_val_score

rf = RandomForestClassifier(n_estimators=150,
                            min_samples_leaf=4,
                            min_samples_split=3,
                            n_jobs=-1)

scores = cross_val_score(rf, X, y, cv=3, scoring='roc_auc')

print scores
array([ 0.9649023 ,  0.96242235,  0.9503313 ])

# do a train_test_split, fit the model, and score with roc_auc_score

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
rf.fit(X_train, y_train)

print roc_auc_score(y_test, rf.predict(X_test))
0.84634039111363313 # quite a bit different than the scores above!

ここには非常に単純なものが欠けているように感じます-おそらく、スコアリングメトリックの1つを実装/解釈する方法の間違いです。

2つのスコアリングメトリックの不一致の理由を誰かが明らかにすることはできますか?

11
MichaelHood

これは、roc_auc_scoreで確率の代わりに予測されたyを指定したためです。この関数は、分類されたラベルではなく、スコアを取ります。代わりにこれを試してください:

print roc_auc_score(y_test, rf.predict_proba(X_test)[:,1])

それはcross_val_scoreからの以前の結果と同様の結果を与えるはずです。 詳細については、この投稿を参照してください

11
George Liu

私はちょうど同様の問題に遭遇しました ここ 。そこで得られた重要なポイントは、cross_val_scoreは、デフォルトのパラメーターを使用して KFold 戦略を使用してtrain-testを分割します。つまり、シャッフルではなく連続したチャンクに分割します。 train_test_split一方、シャッフル分割を行います。

解決策は、分割戦略を明示的にして、次のようにシャッフルを指定することです。

shuffle = cross_validation.KFold(len(X), n_folds=3, shuffle=True)
scores = cross_val_score(rf, X, y, cv=shuffle, scoring='roc_auc')
4