交叉验证和模型选择

6

我正在使用sklearn进行SVM训练。我使用交叉验证来评估估计器并避免过度拟合模型。

我将数据分成两部分:训练数据和测试数据。以下是代码:

import numpy as np
from sklearn import cross_validation
from sklearn import datasets
from sklearn import svm

X_train, X_test, y_train, y_test = cross_validation.train_test_split(
    iris.data, iris.target, test_size=0.4, random_state=0
)
clf = svm.SVC(kernel='linear', C=1)
scores = cross_validation.cross_val_score(clf, X_train, y_train, cv=5)
print scores

现在我需要在X_test上评估估计器clf
clf.score(X_test, y_test)

这里,我收到一个错误提示说

the model is not fitted using fit()

但通常在cross_val_score函数中,模型是拟合的吗?问题出在哪里?


在进行交叉验证时,您需要使用X_trainy_train训练模型,然后在X_testy_test上评估其性能。在未经过训练的情况下评估分类器的性能是没有意义的。 - ali_m
@ali_m,cross_validation.cross_val_score()是做什么的?通常它会先训练模型。我很清楚地看到并理解了你所说的。对于我的情况,我需要一种早停来避免过拟合。我将数据集分成三个部分,例如训练、验证和测试。我在训练部分上训练模型,然后在验证部分上进行调整。一旦我获得了合理的训练和验证误差,我就在测试部分上进行测试。就这样! - Jeanne
1个回答

8

cross_val_score是对sklearn 交叉验证迭代器的便捷包装。您提供一个分类器和整个(训练+验证)数据集,它会自动执行一次或多次交叉验证,将您的数据分成随机的训练/验证集,拟合训练集,并计算验证集上的得分。在此处查看示例和更多解释。

clf.score(X_test, y_test)引发异常的原因是因为cross_val_score在拟合时使用了估计器的副本而不是原始估计器(请参见源代码这里clone(estimator)的用法)。因此,在函数调用外部,clf保持不变,因此当您调用clf.fit时,它未被正确初始化。


谢谢,我明白了。但是在这种情况下,如果这个函数在交叉验证后没有返回“好”的估计值,那么它有什么用呢?它的作用就是浪费时间进行交叉验证,然后我们却没有得到拟合的模型!然而,如果有一种方法可以克隆估计器,那么它将变得重要并且有意义。 - Jeanne
3
交叉验证的目的是估计分类器在未见过的数据上的表现如何。如果你直接在训练集上评估其性能,那么你很可能会得到一个不切实际的高分数。交叉验证本身并没有对提高分类器性能做出任何贡献。然而,在优化学习策略时,你通常会将交叉验证分数作为性能度量标准,例如通过调整分类器的元参数(如SVM中的Cgamma)来实现。 - ali_m
我用另一种方式来表述我的问题。假设我有两个数据集,它们具有相同的分布但具有不同的维度。假设我需要在大数据集上进行预训练,然后在更小的第二个数据集上仅对生成的分类器参数进行微调。 - Jeanne
1
没有必要返回任何参数 - 正如我所说,仅通过交叉验证本身并不能给出任何“最佳参数” - 它只为分类器提供更真实的评分。如果您想调整元参数,则可以执行以下操作:1)选择元参数的值,例如 C,2)将分类器拟合到一组随机训练示例中,3)在保留的测试示例上评估分类器,4)对要测试的每个 C 值重复此过程,5)选择给您提供最佳交叉验证得分的 C 值。 - ali_m
Scikit-learn还提供了一些方便的方法,使用交叉验证来执行元参数优化。请查看此处的文档[http://scikit-learn.org/stable/modules/grid_search.html#grid-search]以获取一些示例。 - ali_m
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接