我有一个包含1000个点的数据集,每个点有2个输入和1个输出。它分为80%用于培训,20%用于测试目的。我正在使用sklearn支持向量回归器对其进行训练。我用训练集得到了100%的准确率,但用测试集得到的结果并不好。我认为这可能是因为过度拟合。你能给我一些解决这个问题的建议吗?
发布于 2016-09-21 09:21:12
你可能是对的:如果你的模型在训练数据上得分很高,但在测试数据上表现不佳,这通常是过度拟合的症状。你需要在不同的情况下重新训练你的模型。我假设你使用的是sklearn中提供的train_test_split,或者一个类似的机制来保证你的拆分是公平和随机的。因此,您将需要调整SVR的超参数并创建几个模型,看看哪一个在测试数据上表现最好。
如果您查看SVR文档,您将看到可以使用几个输入参数来初始化它,每个输入参数都可以设置为许多不同的值。为简单起见,假设您只处理两个要调整的参数:' kernel‘和' C ',同时将第三个参数'degree’设置为4。您正在考虑'rbf‘和'linear’作为内核,0.1,1,10作为C。一个简单的解决方案是:
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帐户上使用。你可能想看一下,看看它是否有帮助。
最后,您的数据可能不是线性的。在这种情况下,您可能希望尝试使用PolynomialFeatures之类的工具在现有非线性特征的基础上生成新的非线性特征,并查看它是否提高了模型质量。
发布于 2016-11-20 20:14:37
尝试使用training data split Sklearn K-Fold交叉验证拟合您的数据,这为您提供了公平的数据拆分和更好的模型,但代价是性能,这对于小型数据集和准确性是非常重要的。
发布于 2017-05-02 01:48:43
以下是一些提示:
C
参数尝试不同的值。正如在docs中提到的,如果你有很多嘈杂的观察,你应该减少它。它对应于regularize more the estimation.
https://stackoverflow.com/questions/39565885
复制相似问题