sklearn - 模型保持过度拟合

sklearn - model keeps overfitting

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

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

您可以在此处找到代码的简化版本:http://pastebin.com/Xu13ciL4

我的问题:

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

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

完全有可能我的特征集无法区分这两个类别,但在得出这个结论之前我想尝试一些其他选项。此外,如果我的特征无法区分,那么这可以解释测试集分数低的原因,但在这种情况下如何获得完美的训练集分数?这可能吗?

我会首先尝试对参数 space 进行网格搜索,但同时也会对训练集使用 k 折交叉验证(当然将测试集放在一边)。然后选择一组参数,然后从 k 折交叉验证中概括出最好的参数。我建议在传递 classifier 作为估算器时对 GridSearchCV 使用 GridSearchCV with StratifiedKFold (it's already the default strategy

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

你提到的正则化如果可用的话绝对是个好主意。

相同标签的预测让我认为标签不平衡可能是一个问题,对于这种情况,您可以使用不同的 class 权重。所以在 SVM 的情况下,每个 class 都有自己的 C 惩罚权重。 sklearn 中的一些估计器接受拟合参数,允许您设置样本权重以设置单个训练样本的惩罚量。

现在,如果您认为这些特征可能是个问题,我会通过查看 f_classif 提供的 F 值来使用特征选择,并且可以与 SelectKBest 之类的东西一起使用。另一种选择是使用交叉验证进行递归特征消除。如果您使用 sklearns Pipeline API.

,特征选择也可以包含在网格搜索中