我有一个包含1000个点的数据集,每个点有2个输入和1个输出。它已分为80%用于培训,20%用于测试目的。我正在使用sklearn支持向量回归器进行训练。我在训练集上有100%的准确率但是用测试集得到的结果并不好。我想这可能是因为过度拟合。请问您可以建议我解决问题。
答案 0 :(得分:2)
您可能是对的:如果您的模型在训练数据上得分很高,但在测试数据上表现不佳,则通常是过度拟合的症状。您需要在不同情况下重新训练模型。我假设您正在使用sklearn中提供的train_test_split,或类似的机制,以确保您的拆分是公平和随机的。因此,您需要调整SVR的超参数并创建多个模型,并查看哪个模型最适合您的测试数据。
如果查看SVR文档,您将看到它可以使用多个输入参数启动,每个参数都可以设置为多个不同的值。为简单起见,我们假设您只处理要调整的两个参数:'kernel'和'C',同时保持第三个参数'degree'设置为4.您正在考虑'rbf'和'linear'内核,以及0.1,1,10 for 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的内容来生成基于现有非线性要素的新非线性要素,并查看它是否可以提高模型质量。
答案 1 :(得分:1)
尝试使用训练数据分割Sklearn K-Fold交叉验证来拟合您的数据,这为您提供了公平的数据分割和更好的模型,但是以性能为代价,这对于小数据集而言应该是真正重要的,优先级是精度。
答案 2 :(得分:1)
一些提示:
C
参数尝试不同的值。正如docs中提到的,如果你有很多嘈杂的观察,你应该减少它。它对应于更多地规范估计。