我正在寻找关于我当前机器学习问题的最佳前进方法的建议
问题的概要和我所做的如下:
您可以在此处找到缩短版的代码:http://pastebin.com/Xu13ciL4
我的问题:
现在,这似乎是过度拟合的经典案例。然而,这里的过度拟合不太可能是由于样本的特征数量不成比例(32个特征,900个样本)。我已经尝试了很多方法来缓解这个问题:
我很高兴继续思考这个问题,但此时我正在寻找正确方向的推动。我的问题可能在哪里,我可以做些什么来解决它?
我的一组功能完全有可能不区分这两个类别,但我想在得出这个结论之前尝试其他一些选择。此外,如果我的功能没有区分,那么这将解释低测试组分数,但在这种情况下如何获得完美的训练集分数?这可能吗?
答案 0 :(得分:5)
我首先尝试对参数空间进行网格搜索,但同时也在训练集上使用k折交叉验证(并将测试集保持在一边)。然后选择一组参数,而不是从k折交叉验证中推广出最佳参数。我建议将GridSearchCV与StratifiedKFold一起使用(当将分类器作为估算工具时,它已经是GridSearchCV的default strategy。)
假设具有rbf的SVM可以完美地适合任何训练集,因为VC维度是无限的。因此,如果调整参数并不能帮助减少过度拟合,那么您可能希望针对更简单的假设尝试类似的参数调整策略,例如线性SVM或您认为可能适合您的域的其他分类器。
正如你所提到的那样,正规化绝对是个好主意。
同一标签的预测让我觉得标签不平衡可能是一个问题,在这种情况下你可以使用不同的类权重。因此,在SVM的情况下,每个类都获得其自己的C惩罚权重。 sklearn中的一些估算器接受拟合参数,允许您设置样本权重以设置单个训练样本的惩罚量。
现在,如果您认为这些功能可能存在问题,我会通过查看f_classif提供的F值来使用功能选择,并且可以使用SelectKBest之类的功能。另一种选择是通过交叉验证来消除递归特征。如果您使用sklearns Pipeline API,则功能选择也可以包含在网格搜索中。