异构特征空间上的 SVM 学习

Posted

技术标签:

【中文标题】异构特征空间上的 SVM 学习【英文标题】:SVM learning on heterogeneous feature space 【发布时间】:2013-01-18 19:12:30 【问题描述】:

我正在尝试一些文档分类任务,到目前为止,SVM 在 TF*IDF 特征向量上运行良好。我想合并一些不基于词频的新特性(例如文档长度),看看这些新特性是否有助于分类性能。我有以下问题:

    我可以简单地将新特征与基于频率的旧词特征连接起来,并在这个异构特征空间上训练一个 SVM? 如果不是,多核学习是通过在每个子特征空间上训练一个核并使用线性插值将它们组合起来的方法吗? (我们仍然没有在 scikit-learn 中实现 MKL,对吧?) 或者我应该转向能够很好地处理异构特征的替代学习器,例如 MaxEnt 和决策树?

提前感谢您的友好建议!

【问题讨论】:

您是否使用某种形式的稀疏矩阵来表示您的文本?例如,您的数据集中可能有大约 5k 个唯一词。每个实例是否有 5K 的数字来表示每个特征,或者是否有特征值映射来减少内存? @steve 是的,我使用稀疏矩阵来表示特征空间——具体来说是 scipy.sparse.coo_matrix。大约有 5K 个独特的词被用作特征。 【参考方案1】:

在 SVM 中使用任意特征和特征组合是完全可能的。要记住的一件事是您应该standardise your features,这意味着它们都应该在相同的规模上。这将防止对特征空间进行意外加权。

如果这未能产生可接受的结果,您可以查看convolution kernels,它提供了一个框架,用于将不同特征空间中的内核组合成一个内核。但是,如果有必要,我会感到惊讶。

【讨论】:

好答案@Ben。关于问题中的第 3 点:尝试更多的学习者总是一个好主意。 ML 中的经验法则是从简单的“白盒”学习器(例如决策树)开始,然后继续使用更高的权重,例如 SVM、神经网络……【参考方案2】:

1) 我可以简单地将新特征与基于频率的旧特征连接起来,并在这个异构特征空间上训练 SVM 吗?

既然你用scikit-learn标记了这个:是的,你可以,你可以用FeatureUnion为你做这件事。

2) 如果不是,多核学习是通过在每个子特征空间上训练一个核并使用线性插值组合它们来实现它的方法吗? (我们仍然没有在 scikit-learn 中实现 MKL,对吧?)

线性 SVM 是此任务的标准模型。内核方法对于现实世界的文本分类来说太慢了(除了可能使用像 LaSVM 这样的训练算法,但这在 scikit-learn 中没有实现)。

3) 还是我应该转向能够很好地处理异构特征的替代学习器,例如 MaxEnt 和决策树?

SVM 与 MaxEnt/logistic 回归一样处理异构特征。在这两种情况下,您确实必须输入缩放数据,例如与MinMaxScaler。请注意,scikit-learn 的 TfidfTransformer 默认会生成归一化向量,因此您无需缩放其输出,只需缩放其他功能即可。

【讨论】:

以上是关于异构特征空间上的 SVM 学习的主要内容,如果未能解决你的问题,请参考以下文章

机器学习算法总结--SVM

机器学习——支持向量机(SVM)

与扩展特征空间中的线性 SVM 相比,内核 SVM 都有哪些缺点?

机器学习——支持向量机(SVM)之核函数(kernel)

机器学习-支持向量机SVM

支持向量机(SVM)复习总结