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