【问题标题】:Different accuracy for cross_val_score and train_test_splitcross_val_score 和 train_test_split 的不同精度
【发布时间】:2022-11-03 01:10:03
【问题描述】:

我正在 sklearn 的简单数据集上测试 RandomForestClassifier。当我用 train_test_split 拆分数据时,我得到准确度 = 0.89。如果我使用具有相同分类器参数的 cross_val_score 进行交叉验证,则准确度会更小 - 大约为 0.83。为什么?

这是代码:

from sklearn.model_selection import cross_val_score, StratifiedKFold,GridSearchCV,train_test_split
from sklearn.metrics import accuracy_score,f1_score,make_scorer
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_circles



np.random.seed(42)


#create dataset:
x, y = make_circles(n_samples=500, factor=0.1, noise=0.35, random_state=42)

#initialize stratified split:
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

#create classifier:

clf = RandomForestClassifier(random_state=42, max_depth=12,n_jobs=-1, 
oob_score=True,n_estimators=100,min_samples_leaf=10)


#average accuracy on cross-validation:
results = np.mean(cross_val_score(clf, x, y, cv=skf,scoring=make_scorer(accuracy_score)))
print("ACCURACY WITH CV = ",results)#prints 0.832

#use train_test_split

xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.2)

clf=RandomForestClassifier(random_state=42, max_depth=12,n_jobs=-1, oob_score=True,n_estimators=100,min_samples_leaf=10)
clf.fit(xtrain,ytrain)
ypred=clf.predict(xtest)
print("ACCURACY WITHOUT CV = ",accuracy_score(ytest,ypred))#prints 0.89

我得到了什么: CV = 0.83 时的准确度 没有 CV 的精度 = 0.89

【问题讨论】:

    标签: python scikit-learn random-forest cross-validation


    【解决方案1】:

    这只是随机森林分类器的分裂和随机状态的机会。尝试将random_state=42 放在外面,让它适合几次,你会得到不同精度的差异。偶然地,我有一个没有“只是” 0.78 的 CV!相比之下,简历会给你和平均值(你计算的平均值)加上一个关于你的准确性可能会在多大程度上变化的想法。

    【讨论】:

      【解决方案2】:

      交叉验证用于对不同的数据拆分运行多个实验,然后平均它们的结果。这是为了确保实验结果不会像您的情况那样受到一次拆分的偏差。

      你选择的种子加上一些运气给了你一个测试火车分裂,它的准确度高于平均水平。较高的准确度是进行拆分时随机采样的产物,而不是模型性能更好的指标。

      简单的说:

      • 交叉验证对数据进行多次拆分。您的模型经过训练 在所有这些不同的拆分上,然后性能是 平均。

      • 如果您选择其中一个拆分,您可能会很幸运,并且可能会有 测试和训练集中的数据点之间有良好的重叠。您的 在这种情况下,模型将具有很高的准确性。

      • 或者你可能会很不走运,并且两者之间可能没有很高的重叠 测试和训练集中的数据点。您的模型将具有较低的 在这种情况下的准确性。

      因此,交叉验证用于平均各种此类拆分的结果(在您的情况下为 5 个)。

      这是您在 google colab notebook 中运行的代码:

      https://colab.research.google.com/drive/16-NotF-_WVLESmvGMONSGSZigxrT3KLx?usp=sharing

      最后一个单元格进行 5 次不同的拆分,然后平均它们的准确度。请注意,这与您从交叉验证中获得的相同。另请注意,有些拆分的准确度较高,有些拆分的准确度较低。

      【讨论】:

        猜你喜欢
        • 2017-06-11
        • 2015-11-22
        • 1970-01-01
        • 2015-02-06
        • 2021-01-28
        • 2023-03-30
        • 2013-02-21
        • 2014-03-12
        • 1970-01-01
        相关资源
        最近更新 更多