交叉验证 Python Sklearn

Posted

技术标签:

【中文标题】交叉验证 Python Sklearn【英文标题】:Cross Validation Python Sklearn 【发布时间】:2018-08-16 10:47:45 【问题描述】:

我想先对我的 SVM 分类器进行交叉验证,然后再在实际测试集上使用它。我想问的是我是在原始数据集上还是在训练集上做交叉验证,这是train_test_split()函数的结果?

import pandas as pd
from sklearn.model_selection import KFold,train_test_split,cross_val_score
from sklearn.svm import SVC

df = pd.read_csv('dataset.csv', header=None)
X = df[:,0:10]
y = df[:,10]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=40)

kfold = KFold(n_splits=10, random_state=seed)

svm = SVC(kernel='poly')
results = cross_val_score(svm, X, y, cv=kfold) #Cross validation on original set

import pandas as pd
from sklearn.model_selection import KFold,train_test_split,cross_val_score
from sklearn.svm import SVC

df = pd.read_csv('dataset.csv', header=None)
X = df[:,0:10]
y = df[:,10]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=40)

kfold = KFold(n_splits=10, random_state=seed)

svm = SVC(kernel='poly')
results = cross_val_score(svm, X_train, y_train, cv=kfold) #Cross validation on training set

【问题讨论】:

【参考方案1】:

最好始终保留一个仅在您对模型感到满意时才使用的测试集,然后再部署它。你的训练/测试拆分也是如此,然后将测试放在一边。我们不会碰它。

仅对训练集执行交叉验证。对于每个 k 折,您将使用训练集的一部分进行训练,其余的作为验证集。一旦您对模型和超参数的选择感到满意。然后使用测试集来获得最终的基准。

您的第二段代码是正确的。

【讨论】:

我的数据集不平衡(每个类之间的样本数量不同)。交叉验证的结果还可靠吗? @AkhmadZaki 对于不平衡的数据集,您应该使用StratifiedKFold 并在train_test_split 中使用stratify 参数

以上是关于交叉验证 Python Sklearn的主要内容,如果未能解决你的问题,请参考以下文章

python sklearn:使用交叉验证调整参数

python sklearn:使用交叉验证调整参数

sklearn 中的交叉验证

Python 中的逻辑回归和交叉验证(使用 sklearn)

在带有分组约束的 sklearn (python 2.7) 中创建训练、测试和交叉验证数据集?

sklearn:用户定义的时间序列数据交叉验证