2016-02-06 23 views
8

私はPython sklearn(バージョン0.17)を使用してデータセットの理想的なモデルを選択しています。python sklearn:accuracy_scoreとlearning_curveのスコアの違いは何ですか?

  1. スプリットtest_size = 0.2cross_validation.train_test_splitを使用してデータセット:これを行うには、私はこれらの手順に従いました。
  2. GridSearchCVを使用して、トレーニングセットで理想的なk-nearest-neighborsクラシファイアを選択します。
  3. GridSearchCVから返された分類器をplot_learning_curveに渡します。 plot_learning_curveは以下のプロットを示した。
  4. 得られたテストセットでGridSearchCVが返す分類子を実行します。

プロットからは、トレーニングのサイズは約0.43です。このスコアはsklearn.learning_curve.learning_curve関数によって返されたスコアです。

しかし、私はテストセットで最高の分類器を実行するとsklearn.metrics.accuracy_score(正しく予測されたラベル/ラベルの数)によって返された私は、0.61の精度スコアを取得した画像に

リンク:graph plot for KNN classifier

この私が使用しているコードです。私はplot_learning_curve関数を含んでいないので、多くのスペースが必要です。私はhereからplot_learning_curveを取っ

import pandas as pd 
import numpy as np 
from sklearn.neighbors import KNeighborsClassifier 
from sklearn.metrics import accuracy_score 
from sklearn.metrics import classification_report 
from matplotlib import pyplot as plt 
import sys 
from sklearn import cross_validation 
from sklearn.learning_curve import learning_curve 
from sklearn.grid_search import GridSearchCV 
from sklearn.cross_validation import train_test_split 


filename = sys.argv[1] 
data = np.loadtxt(fname = filename, delimiter = ',') 
X = data[:, 0:-1] 
y = data[:, -1] # last column is the label column 


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2) 

params = {'n_neighbors': [2, 3, 5, 7, 10, 20, 30, 40, 50], 
      'weights': ['uniform', 'distance']} 

clf = GridSearchCV(KNeighborsClassifier(), param_grid=params) 
clf.fit(X_train, y_train) 
y_true, y_pred = y_test, clf.predict(X_test) 
acc = accuracy_score(y_pred, y_test) 
print 'accuracy on test set =', acc 

print clf.best_params_ 
for params, mean_score, scores in clf.grid_scores_: 
    print "%0.3f (+/-%0.03f) for %r" % (
     mean_score, scores.std()/2, params) 

y_true, y_pred = y_test, clf.predict(X_test) 
#pred = clf.predict(np.array(features_test)) 
acc = accuracy_score(y_pred, y_test) 
print classification_report(y_true, y_pred) 
print 'accuracy last =', acc 
print 

plot_learning_curve(clf, "KNeighborsClassifier", 
       X, y, 
       train_sizes=np.linspace(.05, 1.0, 5)) 

これは正常ですか?私はスコアに多少の違いがあるかもしれませんが、これは0.18の差であることが分かります。パーセントに換算すると61%に対して43%です。 classification_reportは、平均0.61回のリコールも行います。

何か間違っていますか? learning_curveが得点を計算する方法に違いはありますか?私もscoring='accuracy'learning_curveに渡してみましたが、それが精度スコアと一致するかどうかを確認する機能はありましたが、何の違いもありませんでした。

アドバイスは非常に役に立ちます。

ワイン品質(白)data set from UCIを使用していて、コードを実行する前にヘッダーも削除しました。

+1

ここで、plot_learning_curve()のコードはありますか?これが不一致がどこにあるかのようです。 GridSearchCVのクロスバリデーション精度スコアは、テストセットで計算された精度にかなり近くなります。 – SPKoder

+0

@ SPKoder私は彼がsklearnのウェブサイトから関数を使用したと推測しています:http://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html#example-model-selection-plot-learning-curve-py。 Btw、私はいくつかのテストをしてきました。私は説明を見つけたと確信しています。あなたはそれをチェックして、私の仮説を再確認できます。 –

答えて

8

learning_curve関数を呼び出すと、データ全体に対して相互検証が実行されます。 cvパラメータを空のままにすると、3倍のクロスバリデーション分割戦略になります。 「推測子が分類子である場合、またはyがバイナリでもマルチクラスでもない場合、KFoldが使用されている」というドキュメントに記載されているように、ここでは難しい部分があります。あなたの見積もりは分類子です。

KFoldとStratifiedKFoldの違いは何ですか?

k個の連続折り畳み(デフォルトによってシャフリング無し )に

KFold =分割データセット

StratifiedKFold =「折り目がクラス毎のサンプルの割合を維持することによって作製されます。「

は、簡単な例を作ってみましょう:

  • あなたのデータラベルは、成層ない3倍[4.0、4.0、4.0、5.0、5.0、5.0、6.0、6.0、6.0]
  • ですk-1(3-2)の部分集合を1回ずつ有効にして、各折りたたみを一度有効にして使用する[4.0,4.0,4.0]、[5.0,0.05.0]、[6.0、6.0、6.0]
  • 、 [5.0、5.0、5.0、6.0、6.0、6.0]でのトレーニングと[4.0,4.0,4.0]での検証の両方を行うことができます。

これはあなたの学習曲線を描く低精度を説明しています(約0.43%)。もちろん、これはの極端な例であるですが、あなたのデータは何とか構造化されており、シャッフルする必要があります。

しかし、〜61%の精度を得た場合は、データをシャッフルして比率を維持する方法train_test_splitによってデータを分割しています。

ちょうど私が私の仮説をサポートするための簡単なテストを行ってきた、これを見て:あなたはあなたのデータX,yのすべてとlearning_curveを与え、あなたの例では

X_train2, X_test2, y_train2, y_test2 = train_test_split(X, y, test_size=0., random_state=2) 

を。私はちょっとここでちょっとしたことをやっています。これはデータを分割することです。test_size=0.はすべてのデータがtrainの変数にあることを意味します。この方法ではまだすべてのデータを保持していますが、それはtrain_test_split関数を実行するときにシャッフルされます。その後、私はしかし、シャッフルデータを使用してプロット関数と呼ばれてきました

plot_learning_curve(clf, "KNeighborsClassifier",X_train2, y_train2, train_sizes=np.linspace(.05, 1.0, 5)) 

は今の代わり0.43の最大num個の学習サンプルとの出力は、あなたのGridSearch結果でより多くの意味があります0.59です。

観察:私は学習曲線をプロットの全体のポイントは、トレーニングに、より多くのサンプルを追加する天気をを決定することだと思いますが、当社の推定があるとき(あなたがたとえば決めることができ、より良い実行するかをすることができます設定しましたより多くの例を追加する必要はありません)。 train_sizesのように、ちょうど値np.linspace(.05, 1.0, 5) --> [ 0.05 , 0.2875, 0.525 , 0.7625, 1. ]を供給しています。これがあなたがこの種のテストで追求している使い方であるとは必ずしも分かりません。

関連する問題