在sklearn的python中,需要理解cross_val_score的帮助。

9

我目前正在尝试使用Python中的sklearn实现分类中的K-FOLD交叉验证。我理解K-FOLD和交叉验证的基本概念。然而,我不明白cross_val_score是什么以及它是如何工作的,CV迭代在获取我们得到的分数数组中扮演着什么角色。下面是来自sklearn官方文档页面的示例。

**Example 1**
from sklearn import datasets, linear_model
from sklearn.model_selection import cross_val_score
diabetes = datasets.load_diabetes()
X = diabetes.data[:150]
y = diabetes.target[:150]
lasso = linear_model.Lasso()
print(cross_val_score(lasso, X, y, cv=3))  
***OUPUT***
[0.33150734 0.08022311 0.03531764]

看一下示例1,输出在一个数组中生成了3个值。我知道当我们使用kfold时,n_split是生成折叠次数的命令。那么在这个示例中,cv是做什么的呢?

**My Code**
kf = KFold(n_splits=4,random_state=seed,shuffle=False)
print('Get_n_splits',kf.get_n_splits(X),'\n\n')
for train_index, test_index in kf.split(X):
print('TRAIN:', train_index, 'TEST:', test_index)
x_train, x_test = df.iloc[train_index], df.iloc[test_index]
y_train, y_test = df.iloc[train_index], df.iloc[test_index]

print('\n\n')

# use train_test_split to split into training and testing data
x_train, x_test, y_train, y_test = cross_validation.train_test_split(X, y,test_size=0.25,random_state=0)

# fit / train the model using the training data
clf = BernoulliNB()
model = clf.fit(x_train, y_train)
y_predicted = clf.predict(x_test)

scores = cross_val_score(model, df, y, cv=4)
print('\n\n')
print('Bernoulli Naive Bayes Classification Cross-validated Scores:', scores)
print('\n\n')

看我的代码,我正在使用4倍交叉验证对伯努利朴素贝叶斯分类器进行评分,并在score中使用cv=4,如下所示: scores = cross_val_score(model, df, y, cv=4) 以上一行给我提供了一个包含4个值的数组。但是,如果我将其更改为cv=8,如下所示: scores = cross_val_score(model, df, y, cv=8) 那么将生成一个包含8个值的数组作为输出。那么cv在这里有什么作用呢?
我已经反复阅读了文档并搜索了许多网站,但由于我是新手,我真的不理解cv的作用和得分是如何生成的。
非常感谢您的任何帮助。
提前致谢。

1
cross_val_score 在你的所有示例中执行完全相同的操作。它接受特征 df 和目标 y,将其分成 k 折(即 cv 参数),在 (k-1) 折上进行拟合并在最后一折上进行评估。它会执行这个过程 k 次,这就是为什么你的输出数组中有 k 个值的原因。 - Troy
for循环:for train_index, test_index in kf.split(X): print('TRAIN:', train_index, 'TEST:', test_index) x_train, x_test = df.iloc[train_index], df.iloc[test_index] y_train, y_test = df.iloc[train_index], df.iloc[test_index])将df分成4个折叠,然后训练4个模型,其中每个折叠都用作测试集。那么cv是否以与for循环中df拆分相同的方式拆分df,还是不同?我询问的目的是重新验证每个折叠的准确性。此外,确认一下cross_val_score是否调用模型的score属性? - Stevi G
2个回答

6
在K-FOLD交叉验证中,按照以下步骤进行:
  1. 使用K-1个fold作为训练数据进行模型训练
  2. 使用剩余的数据对结果模型进行验证
这个过程会重复K次,并且会在每一步计算性能度量,例如"准确率"
请查看下面的图片以获得更清晰的了解。该图来自Scikit-Learn的交叉验证模块。

交叉验证

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1)
>>> scores = cross_val_score(clf, iris.data, iris.target, cv=5)
>>> scores                                              
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
>>> print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
Accuracy: 0.98 (+/- 0.03)

这里计算单个平均分数。默认情况下,每个CV迭代计算的得分是评估器的得分方法。

我从下面提到的链接中获得了帮助。

  1. "https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html#sklearn.model_selection.cross_val_score"

  2. 'https://scikit-learn.org/stable/modules/cross_validation.html#cross-validation'


0
交叉验证涉及将数据分为训练集和验证集。模型在训练集上进行训练,然后在验证集上进行评估。这个过程会多次重复,每次模型都会在不同的数据子集上进行训练。最终的评估分数是各个交叉验证折叠的分数的平均值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接