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

时间:2015-06-18 15:32:00

标签: 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_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))

2 个答案:

答案 0 :(得分:2)

对于您所描述的内容,您只需使用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,))

然后,就像那里一样,进行初始训练/测试分区:

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倍验证替换最后一行(请参阅the relevant classes)。

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

答案 1 :(得分:1)

对于 k - 交叉验证(请注意,这与您的kNN分类器不同 k ),将您的训练集划分为 k 部分。让我们说5作为起点。您将在训练数据上创建5个模型,每个模型都针对一部分进行测试。这意味着您的模型将针对训练集中的每个数据点进行训练和测试。维基百科对cross-validation的详细描述比我在这里给出的更详细。

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

Scikit Learn为此提供了详细记录method