Python 在Scikit学习分类器上使用交叉验证
我有一个工作分类器,数据集分为一个序列集(70%)和一个测试集(30%) 然而,我也想实现一个验证集(这样:70%的训练、20%的验证和10%的测试)。这些集合应该是随机选择的,结果应该是10个不同作业的平均值 有什么办法吗?以下是我仅使用列车和测试集的实现: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
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集