相互検証、学習曲線、最終評価のためにデータセットを分割する方法は?


70

データセットを分割するための適切な戦略は何ですか?

私は、次のアプローチにフィードバックを求める(ないような個々のパラメータのtest_sizen_iter、私が使用している場合XyX_trainy_trainX_test、およびy_test適切かつシーケンスは理にかなっている場合):

(scikit-learnドキュメントからこの例を拡張)

1.データセットをロードする

from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target

2.トレーニングとテストセットに分割(例:80/20)

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

3.推定量を選択

from sklearn.svm import SVC
estimator = SVC(kernel='linear')

4.相互検証イテレーターを選択します

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)

5.ハイパーパラメーターの調整

トレーニングセットで相互検証イテレータを適用する

from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)

6.学習曲線を使用したアルゴリズムのデバッグ

X_trainトレーニングとテストセットに10回ランダムに分割されn_iter=10ます()。トレーニングスコア曲線の各ポイントは、モデルが最初のi個のトレーニング例でトレーニングおよび評価された10個のスコアの平均です。交差検定スコア曲線の各ポイントは、モデルが最初のi個のトレーニング例でトレーニングされ、テストセットのすべての例で評価された10個のスコアの平均です。

from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()

学習曲線

plot_learning_curve()は、scikit-learnの現在の開発バージョン(0.15-git)にあります。

7.テストセットの最終評価

classifier.score(X_test, y_test)

7a。ネストされた交差検証を使用したモデル選択での過剰適合のテスト(データセット全体を使用)

from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)

追加の質問: 手順7を入れ子にした相互検証で置き換えることは理にかなっていますか?または、ネストされたcvは手順7を補完するものと見なされるべきです

(コードはscikit-learnのk-fold cross validationで機能するようですが、shuffle&splitでは機能cvしないようです。コードを機能させるには上記を変更する必要があります)

8.データセット全体で最終モデルをトレーニングする

classifier.fit(X, y)

編集:私は今、ステップ7aはこのシーケンスではあまり意味をなさないというcbeleitesに同意します。だから私はそれを採用しません。


どの精度スコアリングルールを使用していますか?分類の精度であれば、このような不適切なスコアリングルールは、行った作業の多くを元に戻します。
フランクハレル14

実際に分類精度であるデフォルトを使用しました。たとえば、F1の方が適切だと思います。しかし、ここでは、分割が正常に使用されるかどうかに興味があります。
tobip 14年

3
F1が古い概念の新しい名前であることはほぼ確実です。古いものに新しい名前を付けるのは逆効果だと思います。さらに重要なことは、不適切なスコアリングルールが不適切な機能を選択するだけでなく、プロセス全体に大量のノイズを追加することです。
フランクハレル

3
...いずれの場合でも、F1は@FrankHarrellが示唆する精度の問題を共有しています。フランクの適切なスコアリングルールの1つを取得するには、SVMの確率的出力に切り替えてから、精度ではなくブライアーのスコア(平均二乗誤差)を使用する必要があります。F1のMSEタイプバージョンも派生できると思います。実際、このような手段は、チューニング手順にとって優れているはずです。最終的なパフォーマンスを伝えるために、コミュニティのパフォーマンスを表現する一般的な方法(精度、F1など)も必要になる場合があります。
cbeleites

1
@ ta.ft:アプローチが間違っているかどうかは、あなたが間違っていると考えるものに依存します。プロポーションのグリッド検索は、途方もなく多数の独立したケースがない限り、スキミング分散の重大なリスクを抱えています。したがって、多くの状況で、グリッド検索が最適なモデルを生成するという主張は間違っています。ただし、適切にネストされた検証を行うと、外側の検証により、選択された「最適な」モデルのパフォーマンスを正直に測定できます。それは間違っていません。グリッド検索が最適なモデルを取得したという保証はありません。文献に関しては、回答を更新します。
cbeleites

回答:


41

ステップ7aで何をしたいのかわかりません。私が今理解しているように、それは私には意味がありません。

説明を理解する方法は次のとおりです。ステップ7では、ホールドアウトのパフォーマンスを、ステップ4〜6を含むクロスバリデーションの結果と比較します(つまり、ネストされたセットアップになります)。

この比較があまり意味がないと思う主なポイントは次のとおりです。

  • この比較では、実際に遭遇する過度に楽観的な検証結果の2つの主な原因を検出できません。

    • トレーニングデータとテストデータの間のデータリーク(依存)。これは、階層的な(クラスター化された)データ構造が原因であり、分割では考慮されません。私の分野では、通常、同じ患者または実験の生物学的複製の複数(時には数千)の読み取り値(=データマトリックスの行)があります。これらは独立していないため、検証の分割は患者レベルで行う必要があります。ただし、このようなデータリークは発生します。ホールドアウトセットの分割とクロス検証分割の両方で発生します。ホールドアウトは、クロス検証と同じくらい楽観的に偏っています。

    • データ行列全体で行われるデータの前処理。計算は各行ごとに独立しているのではなく、前処理の計算パラメーターに多数/すべての行が使用されます。典型的な例は、「実際の」分類の前のPCA投影などです。
      繰り返しますが、それはあなたのホールドアウトと外側のクロス検証の両方に影響するので、それを検出することはできません。

    私が使用しているデータの場合、両方のエラーにより誤分類の割合が簡単に過小評価される可能性があります!

  • このカウントされたテストケースタイプのパフォーマンスに制限されている場合、モデルの比較には、非常に多数のテストケースまたは真のパフォーマンスの途方もなく大きな違いが必要です。2つの分類器を無制限のトレーニングデータと比較することは、さらに読むための良い出発点です。

ただし、モデルの品質を比較すると、「最適な」モデルの内側のクロスバリデーションの主張と外側のクロスバリデーションまたはホールドアウトバリデーションが意味をなします。不一致が大きい場合、グリッド検索の最適化が機能したかどうかは疑問です。パフォーマンス測定値の高い分散によるスキミングされた分散)。この比較は、内側の推定値が他の推定値と比べてとてつもなく良い場合に問題を見つけることができるため、簡単です。そうでない場合、最適化についてそれほど心配する必要はありません。しかし、いずれにしても、パフォーマンスの外側(7)の測定値が正直で健全な場合、最適かどうかにかかわらず、少なくとも取得したモデルの有用な推定値が得られます。

学習曲線を測定する私見は、まだ別の問題です。私はおそらく、別々にそれに対処するだろう、と私はあなたがより明確に(あなたのための学習曲線を必要としないためにあなたが学習曲線を必要とするものを定義する必要があると思う与えられた問題、データのデータセット、および分類方法や学習曲線以下のために、この)問題、データ、および分類mehtod特定のデータセット、さらに意思決定の束(例えば学習サンプルサイズの関数としてモデルの複雑さに対処する方法?最適化もう一度、固定ハイパーを使用し、上の決定トレーニングセットのサイズに応じてハイパーパラメーターを修正する機能?)

(私のデータは通常、学習曲線の測定を実際に使用するのに十分な精度を得るための独立したケースがほとんどありませんが、1200行が実際に独立している場合はより良いかもしれません)


更新:scikit-learnの例の「誤り」とは何ですか?

まず、ここでネストされた相互検証には何も問題はありません。ネストされた検証は、データ駆動型の最適化にとって最も重要であり、相互検証は非常に強力なアプローチです(特に反復/反復の場合)。

次に、何かが間違っているかどうかはあなたの視点に依存します:正直なネスト検証(外部テストデータを厳密に独立に保つ)を行う限り、外部検証は「最適な」モデルのパフォーマンスの適切な尺度です。それについて何も問題はありません。

しかし、SVMのハイパーパラメーターチューニングのためのこれらの比例タイプのパフォーマンス測定値のグリッド検索では、いくつかのことが間違っている可能性があります。基本的に、彼らはあなたが(おそらく?)最適化に頼ることができることを意味します。それにも関わらず、外側の分割が適切に行われている限り、たとえモデルが最良ではない場合でも、得られたモデルのパフォーマンスを正直に見積もることができます。

最適化がうまくいかない理由を直感的に説明しようと思います。

  • p^np
    Var(p^)=p(1p)n

    リコール、精度(機械学習パフォーマンスセンス)を推定するために必要な精度(バイアス/分散感覚)を達成するためには、途方もなく膨大な数のケース(少なくとも通常持っているケースの数と比較して)が必要です。もちろん、これはそのような比率から計算する比率にも適用されます。二項比率の信頼区間を見てください。それらは驚くほど大きいです!多くの場合、ハイパーパラメーターグリッドのパフォーマンスの真の改善よりも大きくなります。統計的に言えば、グリッド検索は大規模な多重比較の問題です。評価するグリッドのポイントが多いほど、評価している列車/テストの分割に偶然非常によく似ているハイパーパラメーターの組み合わせを見つけるリスクが高くなります。これが、スキミング分散の意味です。

  • 直感的に、ハイパーパラメーターの仮想的な変化を考えてみましょう。これにより、モデルが徐々に劣化します。1つのテストケースが決定境界に向かって移動します。「ハード」な割合のパフォーマンス測定では、ケースが境界を越えて反対側になるまでこれを検出しません。しかし、その後、ハイパーパラメーターの無限に小さな変化に対してすぐに完全なエラーを割り当てます。
    数値の最適化を行うには、パフォーマンス測定が適切に機能する必要があります。つまり、比例タイプのパフォーマンス測定値の急激な(連続微分不可能な)部分も、そのジャンプ以外の実際に発生する変化が検出されないという事実も、最適化に適していません。
    適切なスコアリングルールは、最適化に特に適した方法で定義されます。予測された確率が、問題のクラスに属する各ケースの真の確率と一致する場合、それらはグローバルな最大値を持ちます。

  • SVMには、パフォーマンス測定だけでなくモデルもこの急激な反応をするという追加の問題があります。ハイパーパラメーターを少し変更しても、何も変わりません。モデルが変更されるのは、ハイパーパラメーターが、サポートベクターであるのを停止するか、サポートベクターになるのに十分な変更がある場合のみです。繰り返しますが、そのようなモデルは最適化が困難です。

文献:


更新II:スキミング分散

モデル比較の観点から余裕があるのは、明らかに独立したケースの数に依存します。ここで、スキミングの変動のリスクに関するいくつかの迅速で汚いシミュレーションを行ってみましょう。

scikit.learn彼らはdigitsデータに1797があると言います。

  • 10×10
  • 両方のパラメーター(範囲)がモデルにまったく影響しないと仮定します。
  • つまり、すべてのモデルの真のパフォーマンスは、たとえば97%(digitsデータセットの一般的なパフォーマンス)です。

  • 実行する104digits

    p.true = 0.97 # hypothetical true performance for all models
    n.models = 100 # 10 x 10 grid
    
    n.rows = 1797 # rows in scikit digits data
    
    sim.test <- replicate (expr= rbinom (n= nmodels, size= n.rows, prob= p.true), 
                           n = 1e4)
    sim.test <- colMaxs (sim.test) # take best model
    
    hist (sim.test / n.rows, 
          breaks = (round (p.true * n.rows) : n.rows) / n.rows + 1 / 2 / n.rows, 
          col = "black", main = 'Distribution max. observed performance',
          xlab = "max. observed performance", ylab = "n runs")
    abline (v = p.outer, col = "red")

以下は、最高のパフォーマンスを得るための分布です。

スキミング分散シミュレーション

赤い線は、すべての仮想モデルの真のパフォーマンスを示しています。平均して、100の比較されたモデルの中で見た目が最高のモデルの真のエラー率の2/3のみを観測します(シミュレーションでは、すべてが97%の正しい予測で同等に実行されることがわかります)。

このシミュレーションは明らかに非常に単純化されています。

  • テストサンプルサイズの分散に加えて、少なくともモデルの不安定性による分散があるため、ここでは分散を過小評価しています
  • モデルの複雑さに影響を与えるチューニングパラメーターは、通常、モデルが不安定であるために分散が大きいパラメーターセットをカバーします。
  • 例のUCI数字の場合、元のデータベースにはcaがあります。44人によって書かれた11000桁。データが執筆者に応じてクラスター化されている場合はどうなりますか?(つまり、誰かが3を書く方法を知っていれば、誰かが書いた8を簡単に認識できますか?)その場合、有効なサンプルサイズは44になります。
  • モデルのハイパーパラメーターを調整すると、モデル間に相関関係が生じる場合があります(実際、数値最適化の観点からは適切に動作すると見なされます)。その影響を予測することは困難です(そして、実際の分類器の種類を考慮しないとこれは不可能だと思います)。

ただし、一般に、独立したテストケースの数が少ない場合と、比較モデルの数が多い場合は、バイアスが増加します。また、Cawley and Talbotの論文は経験的に観察された挙動を示しています。


@cbleites:グリッド検索が最適なモデルを見つけるための適切な方法ではない場合、どの方法を選択する必要がありますか?
tobip

1
@ ta.ft:a)比較する必要があるモデルの数を大幅に削減するために、アプリケーションとデータに関する外部知識をモデリングに組み込む(=最適化する代わりにハイパーパラメーターを決定する)。本質的に意味のあるハイパーパラメーターを持つ分類器に変更する方が全体的に良いかもしれません。つまり、アプリケーションやデータ型からハイパーパラメーターが何であるかを知ることができます。b)適切なスコアリングルールにより、残りのいくつかのモデルを比較します。たとえば、ブライアーズスコアは、多くの分類子に対してはるかに優れた分散プロパティを持っています。
cbeleites

1
最適化をまったく拒否することもできます(決定(a)を介して)。十分な分類器を取得し、利用可能なサンプルサイズがある場合、別の分類器の優位性を証明する機会がないと主張できる場合(たとえば、いくつかのデモMcNemar計算を行い、仮説のより良い分類器の比率比較に必要なサンプルサイズを検索します-あります途方もなく大きな仮説的改善でも、これらが途方もなく大きい可能性が高い場合)、最適化は意味をなさず、単に過剰適合のリスクを引き起こすと主張できます。
cbeleites

「スキミング分散」については同意しません。ハイパーパラメーターの最適化のためにグリッドに多数のポイントがある場合、CVの1つのフォールドでポイントが日和見的にラッキーになることがあります。しかし、10倍のCVがある場合、パラメーターのセットがCVの10倍すべてで偶然ラッキーになることはまだありそうにありません。
RNA 14

1
@RNA:すべてのフォールドで「ラッキー」である確率は、ケースの総数(10フォールドすべて)に直接関係しており、通常、これらすべてのフォールドの平均のみが考慮されます。シナリオ例のかなりの偏りにすでに関連付けられている100個の最適なモデル(たとえば、各10ステップの2つのハイパーパラメーター)の仮想ピッキングのシミュレーションで回答を更新しました(エラー率が1/3すぎます) 。ここの多くの人々は、数千の独立したケースを手にすることはめったにありません。たとえば、完全なUCIディジットデータセットのためにディジットを書いた44人の個人さえほとんどいません。
cbeleites
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.