GridSearchの出力を使用する方法は?


23

現在、PythonとScikitの学習を分類の目的で使用しています。GridSearchを読んでいると、推定器のパラメーターを最適化して最良の結果を得るのに最適な方法だと思いました。

私の方法論はこれです:

  1. データをトレーニング/テストに分割します。
  2. GridSearchと5Fold Cross検証を使用して、推定器(ランダムフォレスト、勾配ブースト、SVCなど)をトレーニングおよびテストし、最適なハイパーパラメーターの組み合わせで最適な推定器を取得します。
  3. 次に、テストセットを使用して分類を予測し、実際のクラスラベルと比較して、Precision、Recall、FMeasure、Matthews Correlation Coefficientなどの各推定器のメトリックを計算します。

奇妙な振る舞いを見たのはこの段階であり、どうすればいいかわかりません。GridSearchから.best_estimator_を取得し、これをグリッド検索からの「最適な」出力として使用し、この推定器を使用して予測を実行しますか?これを行うと、すべてのトレーニングデータをトレーニングしてテストセットでテストする場合よりも、ステージ3メトリックが通常はるかに低いことがわかります。または、出力GridSearchCVオブジェクトを新しい推定器として単純に取得しますか?これを行うと、ステージ3メトリックのスコアが向上しますが、目的の分類子(ランダムフォレストなど)の代わりにGridSearchCVオブジェクトを使用すると奇妙に思えます...

編集: 私の質問は、返されたGridSearchCVオブジェクトと.best_estimator_属性の違いは何ですか?これらのどれを使用して、さらにメトリックを計算する必要がありますか?この出力を通常の分類子のように(たとえば、predictを使用して)使用できますか、またはどのように使用する必要がありますか?

回答:


27

立ち去って、私の質問を満足させる答えを見つけて、不思議に思う人のためにここに書き留めることにしました。

.best_estimator_属性は、指定されたモデルタイプのインスタンスであり、param_gridの指定されたパラメーターの「最適な」組み合わせを持ちます。このインスタンスが有用かどうかは、refitパラメーターがTrueに設定されているかどうかによって決まります(デフォルトでは有効です)。例えば:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
optimised_random_forest = clf.best_estimator_
return optimised_random_forest

RandomForestClassifierを返します。これはすべてドキュメントから明らかです。ドキュメントから明らかでないのは、ほとんどの例が具体的に.best_estimator_を使用せず、代わりにこれを行う理由です。

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
return clf

この2番目のアプローチは、GridSearchCVのすべての機能(.best_estimator _ 、. best_paramsなど)を含むGridSearchCVインスタンスを返します。

Optimised Random Forest Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]
GridSearchCV Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]

予測を行うときに、同じ最適な推定器インスタンスを使用するだけです。したがって、特にエスティメータインスタンス自体のみが必要でない限り、実際にはこれら2つの間に違いはありません。サイドノートとして、メトリックの私の違いは無関係であり、バグのあるクラスの重み関数にまで及びました。


@Danの投稿をありがとう、とても助かります。明確化をお願いします。私が持っている場合は後者のケースでは、refit=Falseその後、clf.fit最良の分類器で行うことがないのだろうか?
Poete Maudit

@PoeteMaudit refitパラメーターは、見つかった最適なパラメーターを取得し、データセット全体でそれらのパラメーターを使用してモデルを再トレーニングするようにGridSearchCV関数に指示します。改装はその後、偽= best_estimatorマニュアルに従って、利用できない場合:scikit-learn.org/stable/modules/generated/...
ダン・カーター

0

GridSearchCVでは、推定器とグリッド検索プリアンブルを組み合わせて、ハイパーパラメーターを調整できます。このメソッドは、グリッド検索から最適なパラメーターを選択し、ユーザーが選択した推定量で使用します。GridSearchCVは分類子からメソッドを継承するため、はい、GridSearchCVインターフェースを介して.score、.predictなどのメソッドを直接使用できます。グリッド検索で特定された最適なハイパーパラメーターを抽出する場合は、.best_params_を使用できます。これにより、最適なハイパーパラメーターが返されます。その後、このハイパーパラメータを推定器に個別に渡すことができます。

.predictを直接使用すると、.best_param_を介して最適なハイパーパラメーターを取得し、それをモデルで使用するのと同じ結果が得られます。グリッド検索の下線の仕組みを理解することで、なぜそうなのかがわかります。


グリッド検索

この手法は、アルゴリズムで使用する最適なパラメーターを見つけるために使用されます。これは重みやモデルではなく、データを使用して学習されます。これは明らかに紛らわしいので、1つのハイパーパラメーターを呼び出して、これらのパラメーターを区別します。

ハイパーパラメーターは、k最近傍(k-NN)のkに似ています。k-NNでは、距離を計算するときに考慮する近傍を選択する必要があります。次に、アルゴリズムはパラメータ、しきい値を調整して、新しい例が学習した分布内に収まるかどうかを確認します。これはデータを使用して行われます。

kをどのように選択しますか?

一部の人々は、データタイプの過去の研究に基づいて単に推奨事項を採用しています。その他はグリッド検索を使用します。この方法は、データに使用するのに最適なkを最適に判断できます。

どのように機能しますか?

[12310]

これは、テストデータを使用しないという原則に反します!!

n-fold交差検定は、トレーニングセットを取得し、それを n部品。それから訓練するn1折り目と、省略された折り目のテスト。グリッド内の各値に対して、アルゴリズムが再トレーニングされますn折りたたむたびに 次に、各フォールド全体のパフォーマンスが平均化され、それがそのハイパーパラメーター値に対して達成されたパフォーマンスです。

選択されたハイパーパラメーター値は、n倍で最高の平均パフォーマンスを達成するものです。アルゴリズムに満足したら、テストセットでテストできます。テストセットに直行すると、過剰適合のリスクがあります。


こんにちは、これは良い答えですが、私の質問の答えについてはまだ賢明ではありません。質問のタイトルと質問自体を更新して、物事をより明確にしようとしています。
ダンカーター

独自のグリッド検索を作成します。文字通り配列を作成し、モデルの周りにforループを追加します。次に、forループの最後に、結果のパフォーマンスを配列に記録します。グリッド内のすべての可能な値を確認したら、パフォーマンスの配列を見て、最適なものを選択します。それがハイパーパラメーターの最適値です。データサイエンスでは、基本的な機能を組み込み関数に依存することはお勧めできません。データは非常に多様であり、管理するのに最適です!
-JahKnows

最適化するハイパーパラメーターが1つしかない場合は良い提案ですが、4つある場合はどうでしょうか。5?4/5回ネストされたforループは見苦しく、ここで車輪を再発明する必要はないと思います。これは時間の無駄であり、このようなパッケージが存在する理由です。
ダンカーター

GridSearchCVでは、推定器とGridSearchCV設定を組み合わせることができます。ですから、今説明したとおりのことを行います。次に、最適なパラメーターを選択し、選択した推定器で使用します。GridSearchCVは分類子からメソッドを継承するため、はい、GridSearchCVインターフェイスを介して.score、.predictなどのメソッドを直接使用できます。ただし、これを行うことはお勧めしません。ツールが簡単なため、制御が難しくなります。グリッド検索のような単純なものについては、自分でコーディングするだけです。
JahKnows

1
この回答は、GridSearchCVの使用に関する質問には対応していません。
ホッブズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.