web-dev-qa-db-ja.com

sklearnsのGridSearchCVベストスコアの解釈

GridSearchCVによって返されるスコアと以下のように計算されたR2メトリックの違いを知りたいのですが。その他の場合、グリッド検索スコアが非常に否定的であり(cross_val_scoreにも同じことが当てはまります)、それが何であるかを説明していただければ幸いです。

from sklearn import datasets
from sklearn.model_selection import (cross_val_score, GridSearchCV)
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import accuracy_score, r2_score
from sklearn import tree

diabetes = datasets.load_diabetes()
X = diabetes.data[:150]
y = diabetes.target[:150]
X = pd.DataFrame(X)

parameters = {'splitter':('best','random'), 
              'max_depth':np.arange(1,10), 
              'min_samples_split':np.arange(2,10), 
              'min_samples_leaf':np.arange(1,5)}

regressor = GridSearchCV(DecisionTreeRegressor(), parameters, scoring = 'r2', cv = 5)
regressor.fit(X, y)

print('Best score: ', regressor.best_score_)
best = regressor.best_estimator_
print('R2: ', r2_score(y_pred = best.predict(X), y_true = y))
6
abu

質問 コメントで@Davideによってリンクされているので、正の_R2_スコアが得られる理由がわかります-モデルのパフォーマンスは、一定の予測よりも優れています。同時に、他の状況では、モデルのパフォーマンスが悪い場合、負の値を取得する可能性があります。

値が異なる理由は、_regressor.best_score__が5分割の特定の折り畳みで評価されるのに対し、r2_score(y_pred = best.predict(X), y_true = y)は同じモデルを評価するためです(_regressor.best_estimator__)ただし、完全なサンプル(その推定量のトレーニングに使用された(5-1)倍のサブセットを含む)

2
Mischa Lisovyi

_regressor.best_score__は、最適なパラメーターの組み合わせの除外されたテストフォールドのr2スコアの平均です。

あなたの例では、cv = 5なので、データはトレインとテストフォールドに5回分割されます。モデルは電車に取り付けられ、テストで採点されます。これらの5つのテストスコアを平均してスコアを取得します。 ドキュメント を参照してください:

"best_score_:best_estimatorの平均相互検証スコア"

上記のプロセスは、すべてのパラメーターの組み合わせに対して繰り返されます。そして、そこからの最高の平均スコアが_best_score__に割り当てられます。

あなたは 私の他の答えで GridSearchCVの完全な動作を見ることができます

最適なパラメーターを見つけた後、モデルは完全なデータでトレーニングされます。

r2_score(y_pred = best.predict(X), y_true = y)

モデルがトレーニングされているのと同じデータ上にあるため、ほとんどの場合、より高くなります。

2
Vivek Kumar