gpt4 book ai didi

python sklearn : what is the difference between accuracy_score and learning_curve score?

转载 作者:太空狗 更新时间:2023-10-29 20:22:45 25 4
gpt4 key购买 nike

我正在使用 Python sklearn(0.17 版)在数据集上选择理想模型。为此,我遵循了以下步骤:

  1. 使用 cross_validation.train_test_splittest_size = 0.2 拆分数据集。
  2. 使用 GridSearchCV 在训练集上选择理想的 k 最近邻分类器。
  3. GridSearchCV 返回的分类器传递给 plot_learning_curveplot_learning_curve 给出了如下所示的图。
  4. 在获得的测试集上运行 GridSearchCV 返回的分类器。

从图中,我们可以看到最大值的分数。训练大小约为0.43。这个分数是 sklearn.learning_curve.learning_curve 函数返回的分数。

但是当我在测试集上运行最好的分类器时,我得到了 0.61 的准确度分数,由 sklearn.metrics.accuracy_score 返回(正确预测的标签/标签数量)

图片链接: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 的差异,转换为百分比时是 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 = "折叠是通过保留每个类别的样本百分比进行的。"

让我们举一个简单的例子:

  • 你的数据标签是 [4.0, 4.0, 4.0, 5.0, 5.0, 5.0, 6.0, 6.0, 6.0]
  • 按未分层的 3 倍划分子集:[4.0, 4.0, 4.0],[5.0, 5.0, 5.0],[6.0, 6.0, 6.0]
  • 然后每个折叠使用验证集一次,而剩余的 k - 1 (3-2) 个折叠来自训练集。因此,例如,将在 [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_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 values np.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com