Python 在Scikit学习分类器上使用交叉验证

Python 在Scikit学习分类器上使用交叉验证,python,scikit-learn,cross-validation,Python,Scikit Learn,Cross Validation,我有一个工作分类器,数据集分为一个序列集(70%)和一个测试集(30%) 然而,我也想实现一个验证集(这样:70%的训练、20%的验证和10%的测试)。这些集合应该是随机选择的,结果应该是10个不同作业的平均值 有什么办法吗?以下是我仅使用列车和测试集的实现: def classifier(samples): # load the datasets dataset = samples data_train, data_test, target_train, target

我有一个工作分类器,数据集分为一个序列集(70%)和一个测试集(30%)

然而,我也想实现一个验证集(这样:70%的训练、20%的验证和10%的测试)。这些集合应该是随机选择的,结果应该是10个不同作业的平均值

有什么办法吗?以下是我仅使用列车和测试集的实现:

def classifier(samples):
    # load the datasets
    dataset = samples

    data_train, data_test, target_train, target_test = train_test_split(dataset["data"], dataset["target"], test_size=0.30, random_state=42)

    # fit a k-nearest neighbor model to the data
    model = KNeighborsClassifier()
    model.fit(data_train, target_train)
    print(model)

    # make predictions
    expected = target_test
    predicted = model.predict(data_test)

    # summarize the fit of the model
    print(metrics.classification_report(expected, predicted))
    print(metrics.confusion_matrix(expected, predicted))
对于k-fold交叉验证(注意,这与kNN分类器的k不同),将训练设置划分为k个部分。让我们以5为起点。您将在培训数据上创建5个模型,每个模型针对一部分进行测试。这意味着您的模型将针对培训集中的每个数据点进行培训和测试。维基百科比我在这里给出的描述要详细得多

然后可以根据测试集进行测试,根据需要进行调整,最后根据验证集进行检查


Scikit Learn对此有详细的文档记录。

对于您所描述的内容,您只需要在其结果上使用以下分割

在那里调整教程,从以下内容开始:

import numpy as np
from sklearn import cross_validation
from sklearn import datasets
from sklearn import svm

iris = datasets.load_iris()
iris.data.shape, iris.target.shape
((150, 4), (150,))
然后,如图所示,进行初始列车/测试分区:

X_train, X_test, y_train, y_test = cross_validation.train_test_split(iris.data, iris.target, test_size=0.1, random_state=0)
现在,您只需将列车数据的0.9分为另外两部分:

X_train_cv_train, X_test_cv_train, y_train_cv_train, y_test_cv_train = \
cross_validation.train_test_split(X_train, y_train, test_size=0.2/0.9)
如果您想要10个随机训练/测试cv集,请将最后一行重复10次(这将为您提供重叠的集合)

或者,您可以将最后一行替换为10倍验证(请参阅)

重点是从初始列车/测试分区的列车部分构建CV集