sklearn - 模型保持过度拟合

Sim*_*mon 3 python signal-processing machine-learning svm scikit-learn

我正在寻找关于我当前机器学习问题的最佳前进方法的建议

问题的概要和我所做的如下:

  • 我有900多个EEG数据试验,每个试验的时间长达1秒.每个人都知道基本事实并将状态0和状态1分类(40-60%分裂)
  • 每个试验都经过预处理,我可以过滤和提取某些频段的功率,这些组成了一组特征(特征矩阵:913x32)
  • 然后我用sklearn训练模型.在我使用0.2的测试大小的地方使用cross_validation.使用rbf内核将分类器设置为SVC,C = 1,gamma = 1(我尝试了许多不同的值)

你可以在这里找到一个缩短版的代码:http://pastebin.com/Xu13ciL4

我的问题:

  • 当我使用分类器来预测我的测试集的标签时,每个预测都是0
  • 列车精度为1,而测试设定精度约为0.56
  • 我的学习曲线图看起来像这样:

在此输入图像描述

现在,这似乎是过度拟合的经典案例.然而,这里的过度拟合不太可能是由于样本的特征数量不成比例(32个特征,900个样本).我已经尝试了很多方法来缓解这个问题:

  • 我尝试过使用降维(PCA),因为我的样本数量太多了,但是准确度得分和学习曲线图看起来和上面一样.除非我将组件数量设置为低于10,否则列车精度开始下降,但鉴于您开始丢失信息,这是不是有点预期?
  • 我已经尝试了规范化和标准化数据.标准化(SD = 1)无助于改变训练或准确度分数.归一化(0-1)会将训练精度降低到0.6.
  • 我已经为SVC尝试了各种C和gamma设置,但它们不会改变任何一个分数
  • 尝试使用像GaussianNB这样的其他估算器,甚至像adaboost这样的集成方法.没变
  • 试图使用linearSVC设置正则化方法,但没有改善这种情况
  • 我尝试使用theano通过神经网络运行相同的功能,我的列车精度约为0.6,测试值约为0.5

我很高兴继续思考这个问题,但此时我正在寻找正确方向的推动力.我的问题可能在哪里,我可以做些什么来解决它?

完全有可能我的一组功能只是不区分这两个类别,但我想在跳到这个结论之前尝试其他一些选项.此外,如果我的功能没有区分,那么这将解释低测试组分数,但在这种情况下如何获得完美的训练集分数?那可能吗?

Mar*_*ard 5

我首先尝试对参数空间进行网格搜索,但同时也在训练集上使用k折交叉验证(并将测试集保持在一边).然后选择一组参数,而不是从k折交叉验证中推广出最佳参数.我建议将GridSearchCVStratifiedKFold一起使用(当将分类器作为估计器传递时,它已经是GridSearchCV 的默认策略).

假设具有rbf的SVM可以完美地适合任何训练集,因为VC维度是无限的.因此,如果调整参数无助于减少过度拟合,那么您可能希望针对更简单的假设尝试类似的参数调整策略,例如线性SVM或您认为可能适合您的域的其他分类器.

正如你所提到的那样,正规化绝对是个好主意.

对同一标签的预测使我认为标签不平衡可能是一个问题,在这种情况下,您可以使用不同的类权重.因此,在SVM的情况下,每个类都获得其自己的C惩罚权重.sklearn中的一些估算器接受拟合参数,允许您设置样本权重以设置单个训练样本的惩罚量.

现在,如果你认为这些特征可能是一个问题,我会通过查看f_classif提供的F值来使用特征选择,并且可以使用像SelectKBest这样的东西.另一种选择是通过交叉验证来消除递归特征.如果您使用sklearns Pipeline API,则功能选择也可以包含在网格搜索中.