我有一个包含1000个点的数据集,每个点有2个输入和1个输出。其中80%用于培训,20%用于测试。我正在用sklearn支持向量回归器训练它。我用训练集得到了100%的准确率,但是用测试集得到的结果不太好。我想可能是因为过度拟合。你能给我一些建议来解决这个问题吗?
你可能是对的:如果你的模型在训练数据上得分很高,但在测试数据上表现很差,这通常是过度拟合的症状。您需要在不同的情况下重新训练您的模型。我假设您正在使用sklearn中提供的train_testrongplit,或者类似的机制来保证您的分割是公平和随机的。因此,您需要调整SVR的超参数并创建几个模型,看看哪一个在您的测试数据上表现最好。
如果您查看SVR文档,您将看到可以使用几个输入参数启动它,每个参数都可以设置为多个不同的值。为了简单起见,让我们假设您只处理两个要调整的参数:'kernel'和'C',同时将第三个参数'degree'设置为4。您正在考虑内核的'rbf'和'线性',以及c的0.1,1,10。一个简单的解决方案是:
for kernel in ('rbf', 'linear'):
for c in (0.1, 1, 10):
svr = SVR(kernel=kernel, C=c, degree=4)
svr.fit(train_features, train_target)
score = svr.score(test_features, test_target)
print kernel, c, score
这样,你可以生成6个模型,看看哪个参数导致最好的分数,哪个将是最好的模型选择,给定这些参数。
一个更简单的方法是让sklearn为你做大部分的工作,使用GridSearchCV(或RandomizedSearchCV):
parameters = {'kernel':('linear', 'rbf'), 'C':(0.1, 1, 10)}
clf = GridSearchCV(SVC(degree=4), parameters)
clf.fit(train_features, train_target)
print clf.best_score_
print clf.best_params_
model = clf.best_estimator_ # This is your model
我正在开发一个小工具,以简化在小型项目中使用sklearn,并使其成为配置一个yaml文件的问题,并让该工具为您完成所有工作。它可以在我的github帐户。你可能想看看它是否有帮助。
最后,数据可能不是线性的。在这种情况下,你可能想尝试使用像多项式特征这样的东西来基于现有的非线性特征生成新的非线性特征,看看它是否能提高你的模型质量。
尝试使用训练数据分割Sklearn K-Fold交叉验证来拟合您的数据,这为您提供了一个公平的数据分割和更好的模型,尽管以性能为代价,这对于小型数据集和优先级为准确性的地方应该很重要。
几点提示:
- 因为你只有两个输入,如果你绘制你的数据将是伟大的。尝试使用alpha = 0.3的散点或热图。
- 试试GridSearchCV,正如@shahins提到的。
- 尤其要尝试不同的
C
参数值。正如在文档中提到的,如果你有很多嘈杂的观察,你应该减少它。它更符合正则化估计。 - 如果花费的时间太长,你也可以尝试RandomizedSearchCV
- 作为@shahins回答的旁注(我不允许添加评论),两种实现是不等同的。GridSearchCV更好,因为它在调整超参数的训练集中执行交叉验证。不要使用测试集调优超参数!
- 尤其要尝试不同的
- 不要忘记缩放数据