scikit learn中的SVM过拟合

Posted

技术标签:

【中文标题】scikit learn中的SVM过拟合【英文标题】:SVM overfitting in scikit learn 【发布时间】:2015-03-25 03:28:07 【问题描述】:

我正在使用 SVM 构建数字识别分类。我有 10000 个数据,我以 7:3 的比例将它们分成训练和测试数据。我使用线性内核。

结果表明,当更改训练示例数时,训练准确度始终为 1,但测试准确度仅为 0.9 左右(我希望准确度更高,至少为 0.95)。我认为结果表明过度拟合。但是,我研究了参数,例如 C、伽玛……它们不会对结果产生太大影响。

谁能帮我解决如何处理 SVM 中的过拟合问题?非常感谢您的时间和帮助。

以下是我的代码:

from sklearn import svm, cross_validation
svc = svm.SVC(kernel = 'linear',C = 10000, gamma = 0.0, verbose=True).fit(sample_X,sample_y_1Num)

clf = svc

predict_y_train = clf.predict(sample_X)
predict_y_test = clf.predict(test_X)    
accuracy_train = clf.score(sample_X,sample_y_1Num) 
accuracy_test =  clf.score(test_X,test_y_1Num)  

#conduct cross-validation 

cv = cross_validation.ShuffleSplit(sample_y_1Num.size, n_iter=10,test_size=0.2, random_state=None)
scores = cross_validation.cross_val_score(clf,sample_X,sample_y_1Num,cv = cv)
score_mean = mean(scores) 

【问题讨论】:

gamma 不是线性内核的参数,更改它不会改变您的结果。您尝试了C 的哪个范围?另外:你是如何将数据分成训练集和测试集的,你的交叉验证准确率是多少? 首先,感谢您的回复。我尝试了从 1 到 1000000 的 C。我以 7:3 的比例分割训练数据和测试数据。交叉验证准确度类似于测试准确度。 如果您认为自己过度拟合,请尝试使用较小的 C 值,例如 10^-3 【参考方案1】:

减少过度拟合的一种方法是添加更多的训练观察。由于您的问题是数字识别,因此可以通过稍微更改原始数据集中的观察结果来轻松综合生成更多训练数据。您可以通过将数字图像向左、向右、向上和向下移动一个像素,从每个现有观察中生成 4 个新观察。这将大大增加您的训练数据集的大小,并且应该帮助分类器学习泛化,而不是学习噪声。

【讨论】:

以上是关于scikit learn中的SVM过拟合的主要内容,如果未能解决你的问题,请参考以下文章

Scikit-Learn 逻辑回归严重过拟合数字分类训练数据

在 scikit-learn 中拟合分类器之前进行特征缩放的必要性

在调整参数时识别交叉验证的 SVM 中的过拟合

paper 123: SVM如何避免过拟合

GBDT scikit-learn相关参数

随机森林过拟合