Sklearn过度拟合

时间:2016-09-19 05:22:34

标签: scikit-learn

我有一个包含1000个点的数据集,每个点有2个输入和1个输出。它已分为80%用于培训,20%用于测试目的。我正在使用sklearn支持向量回归器进行训练。我在训练集上有100%的准确率但是用测试集得到的结果并不好。我想这可能是因为过度拟合。请问您可以建议我解决问题。

3 个答案:

答案 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)

一些提示:

  • 由于您只有两个输入,因此绘制数据会很棒。尝试使用alpha = 0.3的散点图或热图。
  • 尝试GridSearchCV,如@shahins所述。
    • 特别是,请为C参数尝试不同的值。正如docs中提到的,如果你有很多嘈杂的观察,你应该减少它。它对应于更多地规范估计。
    • 如果花费的时间过长,您也可以尝试RandomizedSearchCV
    • 作为@shahins回答的旁注(我不允许添加评论),两种实现都不相同。 GridSearchCV更好,因为它在训练集中执行交叉验证以调整超参数。不要使用测试集来调整超参数!
  • 不要忘记扩展数据