2016-09-19 63 views
-2

我有一个数据集,其中包含1000个点,每个点有2个输入和1个输出。它已被分为80%的培训和20%的测试目的。我正在使用sklearn支持向量回归器来训练它。训练集的准确率达到了100%,但测试集的结果并不理想。我认为这可能是因为过度配合。请你能建议我解决问题。Sklearn过度拟合

+0

是否有任何理由SVR的选择呢? – LouisBBBB

+0

这是因为它有各种数量的内核,可以用来适当地适应非线性数据。 –

+0

机器学习算法背后的主要思想是创建非线性模型。 SVR收敛速度很慢。 SVR有很多内核,每一个都有不同的参数,这使得它更慢(因为你没有真正的选择,只能做一个网格搜索,测试所有参数组合)。这就是为什么我问你这个选择背后的想法。 – LouisBBBB

回答

2

您可能是对的:如果您的模型在训练数据上得分非常高,但对测试数据表现不佳,通常是过度拟合的症状。你需要在不同的情况下重新训练你的模型。我假设你正在使用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的东西来生成基于现有非线性特征的新非线性特征,并查看它是否可以提高模型质量。

1

尝试使用训练数据拆分Sklearn K-Fold交叉验证,这将为您提供公平的数据拆分和更好的模型,尽管以性能为代价,这对小数据集和优先级应该很重要是准确的。

1

一些提示:

  • 因为你只有两个输入,它会如果你绘制你的数据是巨大的。尝试使用alpha = 0.3的散点图或热图。
  • 尝试GridSearchCV,如@shahins所述。
    • 特别是,为C参数尝试不同的值。正如在docs中所提到的,如果你有很多噪音观察,你应该减少它。它对应于更多的预测。
    • 如果时间太长,您也可以尝试RandomizedSearchCV
    • 作为@shahins回答(我不允许添加注释)的一个注意事项,两种实现方式都不相同。 GridSearchCV更好,因为它在用于调整超参数的训练集中执行交叉验证。不要使用测试集来调整超参数!
  • 不要忘了扩展您的数据