Scikit-learnにはグリッド検索と相互検証を行うのに非常に役立つクラスGridSearchCVがありますが、相互検証を行いたくありません。相互検証なしでグリッド検索を実行し、データ全体を使用してトレーニングしたいと考えています。具体的には、グリッド検索時にRandomForestClassifierで作成したモデルを「oobスコア」で評価する必要があります。それを行う簡単な方法はありますか?または自分でクラスを作るべきですか?
ポイントは
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
1つの方法は、ParameterGrid
を使用して必要なパラメーターのイテレーターを作成し、ループすることです。
実行できるもう1つのことは、実際にGridSearchCVを構成して必要なことを実行することです。これは不必要に複雑なので、あまりお勧めしません。
あなたがする必要があるのは:
cv
を使用して、すべてのインデックスを持つタプルを生成するジェネレーターを提供します(トレインとテストが同じになるようにします)。scoring
引数を変更して、ランダムフォレストから提供されたoobを使用します。質問は数年前に解決されましたが、私は他の手段(ParameterGrid()など)の代わりにGridSearchCV()を使用することを主張する場合、より自然な方法を見つけました(ParameterGrid()など):
次に、GridSearchCVはtest_foldで定義されている1つのtrain-validation分割のみを生成します。
このリンクを参照してください: https://stackoverflow.com/a/44682305/2202107
彼はcv=[(slice(None), slice(None))]
を使用しましたが、これはsklearnの作者には推奨されません。