(この答えのほとんどはすでにいくつかの答えで書いていると思いますが、今は見つけられません。誰かがその答えに出くわした場合は、リンクしてください)。ここでは、2つの異なるアプローチがありますが、どちらも賢明だと思います。
しかし、最初のいくつかの用語:
- 適用されたフィールドから来て、私にとって(適合/訓練された)モデルはすぐに使用できます。つまり、モデルには、新しいデータの予測を生成するために必要なすべての情報が含まれています。したがって、モデルにはhyperparametersも含まれます。ご覧のとおり、この観点は、以下のアプローチ2と密接に関連しています。
- OTOH、私の経験でのトレーニングアルゴリズムは次の意味で十分に定義されていません。ただし、ハイパーパラメーターも修正する必要があります。私のアプリケーションの観点からは、パラメーターとハイパーパラメーターの間に実際には大きな違いはありません。どちらもモデルの一部であり、トレーニング中に推定/決定する必要があります。
これらの違いは、通常、トレーニングアルゴリズムのクラスをステアリングパラメーター(ハイパーパラメーター)アプリケーション/ドメインの知識がなくても、修正するのが難しい/不可能(または、少なくともそれらの決定/推定方法を修正するのが難しい)。
アプローチ1:安定した最適化結果が必要
このアプローチでは、「モデルトレーニング」は「通常の」モデルパラメーターの適合であり、ハイパーパラメーターが与えられます。内部のクロス検証などがハイパーパラメーターの最適化を処理します。
ハイパーパラメーターセットを選択する必要があるジレンマを解決するための重要なステップ/仮定は、最適化が安定していることを要求することです。検証目的の相互検証では、すべての代理モデルが最終モデル(データセット全体に適用された同じトレーニングアルゴリズムによって得られた)に十分に類似していることを前提として、それら自体を(最終モデルと同様に)同等に処理できるようにします。この仮定が崩れ、
サロゲートモデルは依然として最終モデルと同等(または同等)ですが、最終的なモデルとは異なります。クロス検証の悲観的なバイアスについてはよく知られています。
また、サロゲートモデルが互いに等しくない/等しい場合、不安定性に問題があります。
内側のループの最適化の結果では、最適化が安定していれば、ハイパーパラメーターの選択に競合はありません。また、内部クロス検証の結果でかなりの変動が見られる場合、最適化は安定していません。不安定なトレーニング状況には、どのハイパーパラメーターセットを選択するかを決定することよりもはるかに悪い問題があります。
ただし、ここには例外があります。最適化には、実際の目的で同等のパフォーマンスをもたらすいくつかの極小値がある場合があります。また、安定性を確保するための選択を必要とすることは、不必要な強力な要件かもしれませんが、このジレンマから抜け出す方法はわかりません。
すべてのモデルが同じ勝利パラメーターセットを生成しない場合は、ここで一般化エラーとして外部ループ推定を使用しないでください。
- p
- しかし、すべてのスプリットが同じパラメーターを生成したため、決定が含まれていない限り、これは外側のループの独立性を破ります:各スプリットのテストデータは、他のすべてのスプリットのトレーニングデータであるため、どのパラメーターセットが勝つかの決定をすでに入力しているため、使用されますパラメータを最適化します。
アプローチ2:ハイパーパラメーターチューニングをモデルトレーニングの一部として扱う
このアプローチは、「トレーニングアルゴリズム開発者」とトレーニングアルゴリズムの応用ユーザーの視点を橋渡しします。
トレーニングアルゴリズム開発者は、「裸の」トレーニングアルゴリズムを提供しますmodel = train_naked (trainingdata, hyperparameters)
。適用されるユーザーのニーズに応じ tunedmodel = train_tuned (trainingdata)
て、ハイパーパラメーターの修正も行います。
train_tuned
たとえば、クロス検証ベースのオプティマイザーをネイキッドトレーニングアルゴリズムにラップすることで実装できますtrain_naked
。
train_tuned
その後、ハイパーパラメータ入力を必要としない他のトレーニングアルゴリズムと同様に使用できます。たとえば、その出力tunedmodel
を相互検証することができます。これで、クロス検証の評価の一部として「通常の」パラメーターの安定性をチェックする必要があるのと同様に、ハイパーパラメーターの安定性がチェックされます。
これは、実際には、個々のパラメーターセットに関係なく、すべての受賞モデルのパフォーマンスを平均化する場合に、ネストされたクロス検証で実行および評価することです。
違いは何ですか?
最終的に、これらの2つのアプローチをとるさまざまな最終モデルになります。
- アプローチ1の最終モデルは
train_naked (all data, hyperparameters from optimization)
- 一方、アプローチ2は次を使用します
train_tuned (all data)
。-より大きなデータセットでハイパーパラメーターの最適化を再度実行するため、ハイパーパラメーターの別のセットで終わる可能性があります。
ただし、ここでも同じロジックが適用されます。最終モデルのパラメーターが相互検証サロゲートモデルとは大幅に異なることがわかった場合、それは仮定1に違反しているという症状です。私見では、ここでも競合はありませんが、(暗黙の)仮定が正当化されるかどうかのチェックがあります。そうでない場合は、とにかくその最終モデルのパフォーマンスを適切に推定することにあまり賭けるべきではありません。
多くの人がアプローチ1を行うネストされたクロス検証について考える印象もあります(CVで同様の質問/混乱の数を見てください)。しかし、一般化エラーは通常アプローチ2に従って推定されるので、最終モデルも同様です。
アイリスの例
要約:最適化は基本的に無意味です。使用可能なサンプルサイズでは、ここでのパラメーターセットのパフォーマンスを区別できません。
しかし、アプリケーションの観点から見ると、4つのパラメーターセットのどれを選択するかは問題ではありません。これはそれほど悪いニュースではありません。比較的安定したパラメーターのプラトーが見つかりました。チューニングされたモデルの適切なネストされた検証の利点があります。それが最適なモデルであると主張することはできませんが、アプローチ2を使用してデータ全体に基づいて構築されたモデルは約97%の精度(150のテストケースのうち145の正解に対する95%の信頼区間:92-99%)
アプローチ1も見た目ほど遠くないことに注意してください-以下を参照してください:結びつきのために最適化が比較的明確な「勝者」を誤って見逃しました(これは実際にサンプルサイズの問題の別の非常に明白な症状です)。
ここでは、C = 1が適切な選択であることを「見る」ほどSVMに深くは入っていませんが、より制限的な線形カーネルを使用します。また、最適化を行ったように、すべてのパラメーターセットが実質的に同等のパフォーマンスにつながることを認識していても、勝者のパラメーターセットを選択しても問題はありません。
ただし、将来的には、経験から期待できるパフォーマンスの大まかな推測値が得られるかどうか、おおよそどのモデルが良い選択になるかを検討してください。次に、そのモデルを(手動で固定されたハイパーパラメーターを使用して)構築し、そのパフォーマンスの信頼区間を計算します。これを使用して、最適化を試みることが賢明かどうかを判断します。(私は主に、10個の独立したケースを取得するのが簡単ではないデータで作業している-あなたが大きな独立したサンプルサイズのフィールドにいる場合、物事ははるかに良く見えると付け加えるかもしれません)
ロングバージョン:
例については、iris
データセットでの結果。iris
150のケースがあり、2 x 2パラメーターのグリッド(2カーネル、ペナルティーの2桁)を持つSVM C
が考慮されます。
内側のループには、129(2x)と132(6x)のケースが分割されています。「最良の」パラメータセットは、C = 1の場合、線形カーネルとrbfカーネルの間で未決定です。ただし、内部テストの精度はすべて(常に失われるC = 10を含む)、観測精度94〜98.5%以内です。分割の1つにある最大の違いは、C = 1対10のrbfの3対8エラーです。
これが重要な違いになる方法はありません。CVの個々のケースの予測を抽出する方法はわかりませんが、3つのエラーが共有され、C = 10モデルでさらに5つのエラーが発生したと仮定しても:
> table (rbf1, rbf10)
rbf10
rbf1 correct wrong
correct 124 5
wrong 0 3
> mcnemar.exact(rbf1, rbf10)
Exact McNemar test (with central confidence intervals)
data: rbf1 and rbf10
b = 5, c = 0, p-value = 0.0625
alternative hypothesis: true odds ratio is not equal to 1
2 x 2グリッドには6つのペアワイズ比較があるため、複数の比較についても修正する必要があることに注意してください。
アプローチ1
rbfが線形カーネルで「勝った」4つの外部分割のうち3つでは、実際には同じ推定精度がありました(タイの場合、minは最初の適切なインデックスを返します)。
グリッドをparams = {'kernel':['linear', 'rbf'],'C':[1,10]}
yieldに変更
する
({'kernel': 'linear', 'C': 1}, 0.95238095238095233, 0.97674418604651159)
({'kernel': 'rbf', 'C': 1}, 0.95238095238095233, 0.98449612403100772)
({'kernel': 'linear', 'C': 1}, 1.0, 0.97727272727272729)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.96212121212121215)
アプローチ2:
これclf
が最終モデルです。でrandom_state = 2
、C = 1のrbfが勝ちます:
In [310]: clf.grid_scores_
[...snip warning...]
Out[310]:
[mean: 0.97333, std: 0.00897, params: {'kernel': 'linear', 'C': 1},
mean: 0.98000, std: 0.02773, params: {'kernel': 'rbf', 'C': 1},
mean: 0.96000, std: 0.03202, params: {'kernel': 'linear', 'C': 10},
mean: 0.95333, std: 0.01791, params: {'kernel': 'rbf', 'C': 10}]
(5回に1回、6回に1回linear
、rbf
with C = 1
がランク1に結び付けられます)