我正在使用scikit-learn cross_validation(http://scikit-learn.org/stable/modules/cross_validation.html)并获得0.82平均分(r2_scorer)。 我怎么知道使用scikit-learn函数我是否过度拟合或不合适?
答案 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)
如果您使用交叉验证计算平均训练和测试分数,则可以查明您是否:
注意:如果您的模型不合适且数据太嘈杂,您可能会同时显着不足和过度拟合。
答案 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)