私はPython sklearn(バージョン0.17)を使用してデータセットの理想的なモデルを選択しています。python sklearn:accuracy_scoreとlearning_curveのスコアの違いは何ですか?
- スプリット
test_size = 0.2
でcross_validation.train_test_split
を使用してデータセット:これを行うには、私はこれらの手順に従いました。 GridSearchCV
を使用して、トレーニングセットで理想的なk-nearest-neighborsクラシファイアを選択します。GridSearchCV
から返された分類器をplot_learning_curve
に渡します。plot_learning_curve
は以下のプロットを示した。- 得られたテストセットで
GridSearchCV
が返す分類子を実行します。
プロットからは、トレーニングのサイズは約0.43です。このスコアはsklearn.learning_curve.learning_curve
関数によって返されたスコアです。
しかし、私はテストセットで最高の分類器を実行するとsklearn.metrics.accuracy_score
(正しく予測されたラベル/ラベルの数)によって返された私は、0.61の精度スコアを取得した画像に
リンク:
この私が使用しているコードです。私は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を使用していて、コードを実行する前にヘッダーも削除しました。
ここで、plot_learning_curve()のコードはありますか?これが不一致がどこにあるかのようです。 GridSearchCVのクロスバリデーション精度スコアは、テストセットで計算された精度にかなり近くなります。 – SPKoder
@ SPKoder私は彼がsklearnのウェブサイトから関数を使用したと推測しています:http://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html#example-model-selection-plot-learning-curve-py。 Btw、私はいくつかのテストをしてきました。私は説明を見つけたと確信しています。あなたはそれをチェックして、私の仮説を再確認できます。 –