- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Python sklearn(0.17 版)在数据集上选择理想模型。为此,我遵循了以下步骤:
cross_validation.train_test_split
和 test_size = 0.2
拆分数据集。GridSearchCV
在训练集上选择理想的 k 最近邻分类器。GridSearchCV
返回的分类器传递给 plot_learning_curve
。 plot_learning_curve
给出了如下所示的图。GridSearchCV
返回的分类器。从图中,我们可以看到最大值的分数。训练大小约为0.43。这个分数是 sklearn.learning_curve.learning_curve
函数返回的分数。
但是当我在测试集上运行最好的分类器时,我得到了 0.61 的准确度分数,由 sklearn.metrics.accuracy_score
返回(正确预测的标签/标签数量)
图片链接:
这是我正在使用的代码。我没有包含 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 的差异,转换为百分比时是 43% 对 61%。 classification_report 还给出了平均 0.61 的召回率。
我做错了什么吗? learning_curve
计算分数的方式有区别吗?我还尝试将 scoring='accuracy'
传递给 learning_curve
函数以查看它是否与准确度分数匹配,但没有任何区别。
任何建议都会非常有帮助。
我用的是酒质(白)data set from UCI并在运行代码之前删除了 header 。
最佳答案
当您调用 learning_curve
函数时,它会对您的整个数据执行交叉验证。当您将 cv
参数留空时,它是一个 3 重交叉验证拆分策略。棘手的部分来了,因为如文档中所述“如果估计器是分类器,或者如果 y 既不是二进制也不是多类,则使用 KFold”。你的估计器是一个分类器。
那么,KFold 和 StratifiedKFold 有什么区别呢?
KFold = 将数据集拆分成 k 个连续的折叠(默认不打乱)
StratifiedKFold = "折叠是通过保留每个类别的样本百分比进行的。"
让我们举一个简单的例子:
这解释了您绘制学习曲线的低准确性 (~0.43%)。当然,这是一个极端示例来说明这种情况,但是您的数据在某种程度上是结构化的,您需要对其进行洗牌。
但是当您获得约 61% 的准确度时,您已经通过 train_test_split
方法拆分了数据,该方法默认对数据执行洗牌并保持比例。
看看这个,我做了一个简单的测试来支持我的假设:
X_train2, X_test2, y_train2, y_test2 = train_test_split(X, y, test_size=0., random_state=2)
在您的示例中,您向 learning_curve
提供了所有数据 X,y
。我在这里做了一个小技巧,即拆分数据告诉 test_size=0.
意味着所有数据都在 train
变量中。这样我仍然保留所有数据,但现在它在通过 train_test_split
函数时被打乱。
然后我调用了您的绘图函数,但使用的是随机数据:
plot_learning_curve(clf, "KNeighborsClassifier",X_train2, y_train2, train_sizes=np.linspace(.05, 1.0, 5))
现在,使用 max num training samples 而不是 0.43
的输出是 0.59
,这对您的 GridSearch 结果更有意义。
Observation: I think the whole point of plotting the learning curve is to determine wether adding more samples to the training set our estimator is able to perform better or not (so you can decide for example when there is no need to add more examples). As in the
train_sizes
you just feed the valuesnp.linspace(.05, 1.0, 5) --> [ 0.05 , 0.2875, 0.525 , 0.7625, 1. ]
I'm not entirely sure that this is the usage you are pursuing in this kind of test.
关于 python sklearn : what is the difference between accuracy_score and learning_curve score?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35242775/
我正在使用 Python sklearn(0.17 版)在数据集上选择理想模型。为此,我遵循了以下步骤: 使用 cross_validation.train_test_split 和 test_siz
Scikit 学习问题 l 无法使用 Sklearn 和 sklearn.grid_search 的 learning_curve。 当我执行import sklearn(有效)from sklear
我是一名优秀的程序员,十分优秀!