在 Scikit-Learn 分类器上使用交叉验证
Posted
技术标签:
【中文标题】在 Scikit-Learn 分类器上使用交叉验证【英文标题】:Using Cross-Validation on a Scikit-Learn Classifer 【发布时间】:2015-09-04 08:24:47 【问题描述】:我有一个工作分类器,其数据集分为训练集 (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))
【问题讨论】:
【参考方案1】:对于您所描述的内容,您只需使用 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 集。
【讨论】:
【参考方案2】:对于 k-fold 交叉验证(请注意,这与您的 kNN 分类器不同 k),将您的训练集划分为 k em> 部分。假设 5 作为起点。您将在训练数据上创建 5 个模型,每个模型都针对一部分进行测试。这意味着您的模型将针对您的训练集中的每个数据点进行训练和测试。***对cross-validation 的描述比我在这里给出的要详细得多。
然后您可以针对您的测试集进行测试,根据需要进行调整,最后针对您的验证集进行检查。
Scikit Learn 对此有一个有据可查的 method。
【讨论】:
以上是关于在 Scikit-Learn 分类器上使用交叉验证的主要内容,如果未能解决你的问题,请参考以下文章
为啥 scikit-learn SVM 分类器交叉验证这么慢?
如何在 scikit-learn 中使用交叉验证获得预测概率
在 scikit-learn 中使用交叉验证时绘制 Precision-Recall 曲线