sklearn - 模型保持过度拟合

时间:2015-08-12 05:11:00

标签: python machine-learning scikit-learn signal-processing svm

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

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

  • 我有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
  • 我的学习曲线图如下:

enter image description here

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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