【发布时间】:2013-12-19 21:31:43
【问题描述】:
我正在使用 scikit-learn cross_validation(http://scikit-learn.org/stable/modules/cross_validation.html) 并获得例如 0.82 平均分数 (r2_scorer)。 使用 scikit-learn 函数我怎么知道我是过拟合还是欠拟合?
【问题讨论】:
标签: scikit-learn
我正在使用 scikit-learn cross_validation(http://scikit-learn.org/stable/modules/cross_validation.html) 并获得例如 0.82 平均分数 (r2_scorer)。 使用 scikit-learn 函数我怎么知道我是过拟合还是欠拟合?
【问题讨论】:
标签: scikit-learn
很遗憾,我确认没有内置工具来比较 CV 设置中的训练和测试分数。 cross_val_score 工具只报告考试成绩。
您可以使用 Ando 的回答中的train_test_split 函数设置自己的循环,但您也可以使用任何其他 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)
如果您使用交叉验证计算平均训练和测试分数,您可以确定您是否是:
注意:如果您的模型不充分且数据过于嘈杂,您可能会同时出现严重欠拟合和过拟合。
【讨论】:
在对训练数据和测试数据进行测试时,您应该比较您的分数。如果分数接近相等,则您可能欠拟合。如果它们相距很远,您可能会过度拟合(除非使用随机森林等方法)。
要计算训练数据和测试数据的分数,您可以使用以下方法(假设您的数据位于变量 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)
【讨论】: