当我尝试在高维输入上应用某种机器学习算法(具体来说是分类,特别是SVM),但得到的结果不太令人满意时,我应该如何处理这种情况?
1、2或3维的数据可以与算法的结果一起可视化,这样你就可以了解发生了什么,并对如何处理问题有一些想法。一旦数据超过3维,除了直觉地调整参数外,我真的不确定如何处理这个问题?
回答:
你对数据做了什么?我的回答是:什么都不做。SVM被设计来处理高维数据。我现在正在研究一个使用SVM进行监督分类的研究问题。除了在互联网上寻找资源外,我还自己进行了关于分类前降维影响的实验。使用PCA/LDA预处理特征并没有显著提高SVM的分类准确性。
对我来说,从SVM的工作方式来看,这是完全合理的。设x为m维特征向量。设y = Ax,其中y在R^n中,x在R^m中,且n < m,即y是x投影到较低维度的空间中。如果类Y1和Y2在R^n中是线性可分的,那么相应的类X1和X2在R^m中也是线性可分的。因此,原始子空间“至少”应该和它们投影到较低维度上的子空间一样可分,即理论上PCA不应该有帮助。
这里有一个讨论关于在SVM之前使用PCA的争论:链接
你可以做的是改变你的SVM参数。例如,使用libsvm 链接,参数C和gamma对分类成功至关重要。libsvm的常见问题解答,特别是这一条目 链接,包含更多有用的提示。其中包括:
- 在分类前缩放你的特征。
- 尽量获得平衡的类。如果不可能,那么对一个类进行更多的惩罚。查看更多关于SVM不平衡的参考资料。
- 检查SVM参数。尝试多种组合以找到最佳组合。
- 首先使用RBF核。它几乎总是效果最好(从计算角度来说)。
- 差点忘了……在测试前,交叉验证!
编辑:让我补充这个“数据点”。我最近使用SVM和PCA预处理在四个独立的数据集上进行了大规模实验。PCA在任何选择的降维上都没有改善分类结果。原始数据经过简单的对角缩放(对于每个特征,减去均值并除以标准差)表现更好。我没有做出任何广泛的结论——只是分享这个实验。也许在不同的数据上,PCA可以有所帮助。