如何处理高维输入空间的机器学习问题?

18

当我尝试对一些高维度输入应用一些机器学习算法(分类,具体来说是SVM)时,如果我得到的结果不太令人满意,我该如何处理这种情况呢?

1、2或3维数据可以可视化,同时还可以展示算法的结果,这样您就能够了解发生了什么,并且有一些思路来解决问题。然而,一旦数据超过三维,则除了直观地调整参数外,我并不确定如何解决它。

5个回答

27
你对于 数据 做了什么?我的回答是: 没有做任何处理。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 faq(尤其是这个条目:链接)包含更多有用的提示。其中一些提示如下:
  1. 将特征缩放到相同的比例上。
  2. 尽量获得平衡的类别。如果不可能,那么惩罚一个类别比另一个更多。关于SVM不平衡问题请参见更多参考资料。
  3. 检查SVM参数。尝试多种组合以找到最佳组合。
  4. 首先使用RBF内核。从计算角度来看,它几乎总是效果最好的。
  5. 几乎忘了……在测试之前,进行交叉验证

编辑:让我再添加这个“数据点”。最近我使用SVM和PCA预处理在四个独立的数据集上进行了另一个大规模实验。对于任何降维选择,PCA都没有改善分类结果。原始数据使用简单的对角线缩放(对于每个特征,减去平均值并除以标准差)表现更好。我不会得出任何广义结论——只是分享这个实验。也许在不同的数据上,PCA可以有所帮助。


3
这个问题与降维无关,作者只是抱怨自己无法理解多维数据。但无论如何,PCA不能帮助你并不意味着它是无用的。尝试构造人工数据:一维可分离点。添加一些噪声以获得50维数据。最大间隔超平面可能会漂移。 - Roman Shapovalov
3
我认为我的答案完整地回答了问题。但是关于“添加一些噪音来获得50维数据”的陈述,添加噪音并不等同于添加特征。如果将49个包含不相关噪声的特征与一个可分离两个类别的有意义特征连接起来,SVM仍然可以在50维空间中成功地分离这些类别,就像在一维空间中一样。毫无疑问。 - Steve Tjoa
1
Steve,我向一位教授咨询了这个问题。你肯定是对的,降维并不能帮助分离类别,但它仍然可以提高分类器的判别能力。此外,PCA不是最好的方法,因为它没有考虑类别的结构。相关向量机可能更合适:http://en.wikipedia.org/wiki/Relevance_Vector_Machine - Roman Shapovalov
感谢您的跟进评论。是的,我同意 - 虽然“从不可分离,使可分离”在降维中不可能实现(至少通过像PCA这样的线性变换),但“提高区分能力”是可能的。 RVM是一个不错的建议。 - Steve Tjoa
1
PCA或降维并不旨在改善结果(实际上它往往会降低结果)...它有助于减少复杂性、计算量、更容易地进行可视化等。 - sbharti

7

一些建议:

  • 将项目数据(仅用于可视化)投影到较低维空间(使用PCA或MDS或其他适合您的数据的方法)

  • 尝试理解为什么学习失败。您认为它过度拟合了吗?您认为您有足够的数据吗?可能您的特征中没有足够的信息来解决您要解决的任务?有方法可以回答这些问题,而不需要可视化数据。

此外,如果您告诉我们任务是什么以及您的SVM输出是什么,可能会有更具体的建议。


4
你可以尝试使用PCA或类似技术来降低问题的维度。请注意,PCA有两个重要点。(1)它假定应用于数据的数据服从正态分布;(2)结果数据失去了其自然含义(导致黑匣子)。如果你可以接受这一点,可以尝试一下。
另一个选择是尝试几种参数选择算法。由于在这里已经提到了SVM,您可以尝试Chang和Li的方法(使用线性SVM进行特征排名),其中他们使用线性SVM预先选择“有趣的特征”,然后在所选特征上使用基于RBF的SVM。如果您熟悉Orange,一个Python数据挖掘库,则可以在不到一小时的时间内编写此方法。请注意,这是一种贪婪的方法,由于其“贪婪性”,在输入变量高度相关的情况下可能会失败。在这种情况下,如果您无法通过PCA解决此问题(请参见上文),则可能需要采用启发式方法,这些方法尝试选择最佳的预测变量组合。这种方法的主要缺陷是过度拟合的高潜力。确保您有一堆“未使用”的数据,在模型构建的整个过程中都没有看到。仅在确定模型准备就绪后,将该数据集用于测试模型一次。如果失败,请不要再次使用此数据验证另一个模型,您将不得不找到一个新的数据集。否则,您将无法确定自己是否再次过度拟合。

参数选择方面的精选论文列表:

高维基因组微阵列数据特征选择

哦,关于SVM还有一件事。SVM是一个黑盒子。你最好弄清楚生成数据的机制,并对机制进行建模,而不是对数据进行建模。另一方面,如果这是可能的,那么你很可能不会在这里问这个问题(我也不会对过度拟合感到那么痛苦)。

参数选择方面的精选论文列表

  1. 高维基因微阵列数据的特征选择
  2. 特征子集选择的包装器
  3. 粒子群优化中的参数选择
  4. 我曾在开发一种随机方法,以确定分子的药物特性的实验室工作。

3
我会按照以下方式解决问题:
“结果不太令人满意”是什么意思?
如果训练数据的分类率不令人满意,则可能是以下原因之一:
- 训练数据中存在异常值(被错误分类的数据)。在这种情况下,您可以尝试使用 RANSAC 等算法来处理。 - 您的模型(在本例中为 SVM)不适用于此问题。可以通过尝试其他模型(例如 adaboost)或向当前模型添加更多参数来进行诊断。 - 数据的表示形式不适合您的分类任务。在这种情况下,使用特征选择或降维技术对数据进行预处理会有所帮助。
如果测试数据的分类率不令人满意,则说明您的模型过度拟合了数据:
- 模型过于复杂(参数过多),需要进一步限制; - 或者您训练的训练集太小,需要更多数据。
当然,这可能是上述元素的混合体。这些都是“盲目”攻击问题的方法。为了更好地理解问题,您可以使用可视化方法将数据投影到较低的维度中,或寻找更适合您理解的问题领域的模型(例如,如果您知道数据服从正态分布,可以使用 GMM 对数据进行建模...)。

1

如果我没记错的话,您正在尝试查看SVM的哪些参数可以给您最好的结果。您的问题是模型/曲线拟合。

我几年前曾经处理过类似的问题。有很多库和算法可以做同样的事情。我使用了牛顿-拉弗森算法和一种变异的遗传算法来拟合曲线。

通过现实世界的实验生成/猜测/获取您所希望的结果(或者如果您只是进行简单的分类,那就自己动手吧)。将此与您的SVM输出进行比较。我之前提到的算法会重复这个过程,直到您的模型(在这种情况下是SVM)的结果与预期值相匹配(请注意,根据您的问题/数据大小,这个过程可能需要一些时间... 在一个140节点的Beowulf集群上,我花了大约2个月的时间)。

如果您选择使用牛顿-拉弗森算法,这里可能是一个不错的起点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接