2017-02-06 11 views
1
私が使用してクロスバリデーションについて学んだ

後のスコアデータセットscikitは-学ぶ(http://scikit-learn.org/stable/modules/cross_validation.htmlScikitlearn - クロスバリデーション

マイコード:私はクロスバリデーションで、我々は全体に使用できることを理解

from sklearn.cross_validation import train_test_split 
from sklearn.cross_validation import cross_val_score 
from sklearn import datasets 
from sklearn import svm 

iris = datasets.load_iris() 

# prepare sets 
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=0) 

# create model 
clf1 = svm.SVC(kernel='linear', C=1) 

# train model 
scores = cross_val_score(clf1, x_train, y_train, cv=5) 

# accuracy on train data 
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2)) 

# accuracy on yet-unseen data 
print clf1.score(x_test, y_test) 

scikit docの例のようにトレーニングおよび検証するためのデータセット。クロスバリデーション後にデータにスコアを付ける場合はどうすればよいですか?クロスバリデーションで学習した後、私のモデルは訓練されていると思います。 score()を使用している間、私はcross_val_predictが言及されていると私はそれを使用することができますが、私はただの正確さを確認したい一方で、私は(数倍である)CV引数を必要とする理由方法の段落3.1.1.1があるdocに

raise NotFittedError(msg % {'name': type(estimator).__name__}) 
sklearn.utils.validation.NotFittedError: This SVC instance is not fitted yet. Call 'fit' with appropriate arguments before using this method. 

を取得します訓練されたモデル?

私はどんなヒントにも感謝します。

+0

あなたが望むものを決めるには、多くの種類のスコアがあります。あなたはsci kitのラーニングドキュメントをチェックすることができます。しかし、この状況では、クロスバリデーションメトリックをチェックすることができます:http://scikit-learn.org/stable/modules/cross_validation.html、これが役立つことを願っています!@PawelPawel –

+0

'cross_val_score'は渡すモデルオブジェクトを引数としてフィットさせますが、各折りたたみを独立に保つようにコピーを作成します。実際にモデルを実際に手動でフィットさせる必要があります。また、あなたのデータを 'cross_val_score'に渡す前にあなたのデータを訓練とテストセットに分割しないでください。それはあなたのためになります... –

+2

クロス検証の目的が何であるかを理解する必要があります。 *一般化可能なメトリック*、つまり、あなたのモデルは見えないデータに対してどのように実行されますか?あなたは "相互認証を使ってモデルを訓練する"というわけではありません、 –

答えて

1

ここでは、どのように動作するかを段階的に説明しながら作業を完了させるコードを示します。そもそも

、私たちは必要なモジュールをインポートしてみましょう:

In [204]: from sklearn.model_selection import cross_val_score, StratifiedKFold 

In [205]: from sklearn import datasets 

In [206]: from sklearn import svm 

あなたはscikit-学ぶそうでない場合、次のコードは動作しない場合があります、0.18がインストールされている特定すべきです。私がsklearn.cross_validationの代わりにsklearn.model_selectionを使用していることに注意してください。後者はバージョン0.18では非推奨です。

そして我々はC-サポートベクトル分類クラスのインスタンスを作成する次のステップで

In [207]: iris = datasets.load_iris() 

In [208]: X, y = iris.data, iris.target 

それぞれ、虹彩データセットをロードし、特徴及びラベルで配列Xyを作成する:

In [209]: clf = svm.SVC(kernel='linear', C=1) 

データセットを5つの互いに素なサブセット、すなわちA、B、C、DおよびEに分割する層別K-フォールドバリデータを作成します。これらの5つのフォールドは階層化されています。つまり、eacのサンプルA、B、C、D、Eのhクラスは全体のデータセットと同じです。

In [210]: skf = StratifiedKFold(n_splits=5, random_state=0) 

最後に、我々は5分類試験を通して一般化精度を見積もる:

In [211]: scores = cross_val_score(clf, X, y, cv=skf) 

In [212]: scores 
Out[212]: array([ 0.9667, 1. , 0.9667, 0.9667, 1. ]) 

In [213]: scores.mean() 
Out[213]: 0.98000000000000009 
次のように

5-折り畳みクロスバリデーションをまとめることができる:それは明らかから出

Classification No. Training Samples Test Samples Accuracy 
1     A + B + C + D  E    0.9667 
2     A + B + C + E  D    1. 
3     A + B + D + E  C    0.9667 
4     A + C + D + E  B    0.9667 
5     B + C + D + E  A    1. 

各サンプルはトレーニングのために4回使用され、1回だけテストされます。あなたの追加のコメントに

回答:

  1. 相互検証の主な利点は、すべてのサンプルは、トレーニングとテストの両方に使用されていることである、すなわちクロスバリデーションが最大のモデリングおよびテスト機能を提供します、これは、データセットが小さい場合に特に重要です。
  2. オーバーフィッティングを回避する1つの方法は、トレーニングとテストに異なるサンプルを使用することです。
  3. モデルパラメータをチェーニングするための一般的なアプローチは、異なるパラメータセットのモデルを検証し、分類精度を最大にする値を選択することです。
+0

詳細な回答ありがとうございます。私はそれがどのように動作するかについてのコメントからアイディアを得ました。クロスバリデーションは実際に学習の方法であることを覚えていたので、私の誤解でした。私の質問は、クロスバリデーションがどのように使われるかです。小さなデータセットの場合になぜ役立つのですか?トレーニングのためにデータセット全体を使用できるからです。クロス適合は、過適合を避けるためにモデルの正しいパラメータを選択するために使用されますか?この例を読んだ後、私はこのように思えます: http://scikit-learn.org/stable/auto_examples/exercises/plot_cv_diabetes.html答えてくれてありがとう! – PawelPawel

関連する問題