scikit-learn cross_validation过度拟合或不合适

时间:2013-12-03 17:25:04

标签: scikit-learn

我正在使用scikit-learn cross_validation(http://scikit-learn.org/stable/modules/cross_validation.html)并获得0.82平均分(r2_scorer)。 我怎么知道使用scikit-learn函数我是否过度拟合或不合适?

2 个答案:

答案 0 :(得分:6)

不幸的是,我确认没有内置工具来比较CV设置中的列车和测试分数。 cross_val_score工具仅报告测试分数。

您可以使用train_test_split功能设置自己的循环,如Ando的答案,但您也可以使用任何其他CV方案。

import numpy as np
from sklearn.cross_validation import KFold
from sklearn.metrics import SCORERS

scorer = SCORERS['r2']
cv = KFold(5)
train_scores, test_scores = [], []
for train, test in cv:
    regressor.fit(X[train], y[train])
    train_scores.append(scorer(regressor, X[train], y[train]))
    test_scores.append(scorer(regressor, X[test], y[test]))

mean_train_score = np.mean(train_scores)
mean_test_score = np.mean(test_scores)

如果您使用交叉验证计算平均训练和测试分数,则可以查明您是否:

  • 不合适:火车得分远远低于满分(r2为1.0)
  • 过度拟合:火车和考试成绩并不接近另一个(平均考试成绩明显低于平均火车成绩)。

注意:如果您的模型不合适且数据太嘈杂,您可能会同时显着不足和过度拟合。

答案 1 :(得分:0)

您应该在测试培训和测试数据时比较您的分数。如果分数接近相等,则可能不合适。如果它们相隔很远,则可能过度拟合(除非使用随机森林等方法)。

要计算列车和测试数据的分数,您可以使用以下内容(假设您的数据位于变量X和Y中):

from sklearn import cross_validation

#do five iterations
for i in range(5):

    X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, Y, test_size=0.4)
    #Your predictor, linear SVM in this example
    clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)

    print "Test score", clf.score(X_test, y_test)   
    print "Train score", clf.score(X_train, y_train)   
相关问题