在 Scikit-Learn 分类器上使用交叉验证

Using Cross-Validation on a Scikit-Learn Classifer

我有一个工作分类器,其数据集分为训练集 (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))

For k-fold cross validation(注意这和你的kNN分类器不一样k),划分你的训练集最多分为 k 个部分。让我们假设 5 作为起点。您将在训练数据上创建 5 个模型,每个模型都针对一部分进行测试。这意味着您的模型将针对训练集中的每个数据点进行训练和测试。维基百科对 cross-validation 的描述比我在这里给出的更详细。

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

Scikit Learn 对此有详细的记录 method

对于您所描述的内容,您只需要使用 train_test_split 并对其结果进行以下拆分。

调整那里的教程,从这样的事情开始:

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,))

然后,就像那里一样,创建初始 train/test 分区:

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 个随机的 train/test cv 集,请将最后一行重复 10 次(这将为您提供重叠的集)。

或者,您可以将最后一行替换为 10 倍验证(参见 the relevant classes)。

重点是从初始 train/test 分区的训练部分构建 CV 集。