web-dev-qa-db-ja.com

Pythonで相互検証せずにグリッド検索する簡単な方法はありますか?

Scikit-learnにはグリッド検索と相互検証を行うのに非常に役立つクラスGridSearchCVがありますが、相互検証を行いたくありません。相互検証なしでグリッド検索を実行し、データ全体を使用してトレーニングしたいと考えています。具体的には、グリッド検索時にRandomForestClassifierで作成したモデルを「oobスコア」で評価する必要があります。それを行う簡単な方法はありますか?または自分でクラスを作るべきですか?

ポイントは

  • 簡単な方法でグリッド検索をしたいのですが。
  • 相互検証を行いたくありません。
  • トレーニングにはデータ全体を使用する必要があります(トレーニングデータとテストデータを分離したくない)。
  • グリッド検索中に評価するためにoobスコアを使用する必要があります。
24
ykensuke9

OOBを使用してモデルを評価しないことをお勧めしますが、GridSearchCV()の外でグリッド検索を実行する方法を知っていると便利です(これを頻繁に行うので、最適なグリッドからCV予測を保存できます簡単なモデルスタッキング)。最も簡単な方法は、ParameterGrid()を使用してパラメーターのグリッドを作成し、パラメーターのすべてのセットをループすることです。たとえば、「grid」という名前のグリッド辞書とRF「rf」という名前のモデルオブジェクトがあるとすると、次のようになります。

for g in ParameterGrid(grid):
    rf.set_params(**g)
    rf.fit(X,y)
    # save if best
    if rf.oob_score_ > best_score:
        best_score = rf.oob_score_
        best_grid = g

print "OOB: %0.5f" % best_score 
print "Grid:", best_grid
36
David

1つの方法は、ParameterGridを使用して必要なパラメーターのイテレーターを作成し、ループすることです。

実行できるもう1つのことは、実際にGridSearchCVを構成して必要なことを実行することです。これは不必要に複雑なので、あまりお勧めしません。
あなたがする必要があるのは:

  • docs のarg cvを使用して、すべてのインデックスを持つタプルを生成するジェネレーターを提供します(トレインとテストが同じになるようにします)。
  • scoring引数を変更して、ランダムフォレストから提供されたoobを使用します。
2
AbdealiJK

質問は数年前に解決されましたが、私は他の手段(ParameterGrid()など)の代わりにGridSearchCV()を使用することを主張する場合、より自然な方法を見つけました(ParameterGrid()など):

  1. sklearn.model_selection.PredefinedSplit()を作成します。これは、リストであり、入力データと同じサイズのtest_foldというパラメーターを受け取ります。リストでは、トレーニングセットに属するすべてのサンプルを-1として設定し、他のサンプルをとして設定します。
  2. Cv = "the created PredefinedSplit object"でGridSearchCVオブジェクトを作成します。

次に、GridSearchCVはtest_foldで定義されている1つのtrain-validation分割のみを生成します。

1
Masanarok

このリンクを参照してください: https://stackoverflow.com/a/44682305/2202107

彼はcv=[(slice(None), slice(None))]を使用しましたが、これはsklearnの作者には推奨されません。

1
Sida Zhou