如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python

Posted

技术标签:

【中文标题】如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python【英文标题】:How do I do use non-integer string labels with SVM from scikit-learn? Python 【发布时间】:2012-10-08 10:08:30 【问题描述】:

Scikit-learn 有相当用户友好的用于机器学习的 Python 模块。

我正在尝试为自然语言处理 (NLP) 训练 SVM 标记器,其中我的标签和输入数据是单词和注释。例如。词性标记,而不是使用双/整数数据作为输入元组[[1,2], [2,0]],我的元组看起来像这样[['word','NOUN'], ['young', 'adjective']]

谁能举例说明我如何将 SVM 与字符串元组一起使用?此处给出的教程/文档适用于整数/双精度输入。 http://scikit-learn.org/stable/modules/svm.html

【问题讨论】:

【参考方案1】:

这与其说是 scikit 或 python 问题,不如说是 SVM 的一般问题。

SVM 中的数据实例必须表示为各种标量的向量,通常是实数。因此,分类属性必须首先映射到一些数值,然后才能包含在 SVM 中。

一些分类属性更自然/更符合逻辑地映射到某种尺度(一些松散的“度量”)。例如,具有 ('no rush'、'standard delivery'、'Urgent' 和 'Most Urgent') 值的 Priority 字段的 (1, 2, 3, 5) 映射可能是有意义的。另一个示例可能是颜色可以映射到 3 个维度,每个维度对应其红色、绿色、蓝色分量等。 其他属性没有允许任何甚至近似的逻辑映射到比例的语义;然后必须在 SVM 的一个(或可能几个)维度上为这些属性的各种值分配任意数值。可以理解,如果 SVM 具有许多这些任意“非度量”维度,则它在正确分类项目方面的效率可能会降低,因为 SVM 工作中隐含的距离计算和聚类逻辑在语义上的相关性较低。

这一观察结果并不意味着当项目包含非数字或非“度量”维度时根本不能使用 SVM,但它确实提醒我们,特征选择和特征映射通常是分类器非常敏感的参数,并且特别是 SVM。

在 POS 标记的特殊情况下……恐怕我现在很难理解标记语料库的哪些属性要使用以及如何将这些属性映射到数值。我知道SVMTool 可以使用 SVM 生成非常有效的 POS 标记器,并且还有几篇学术论文描述了也基于 SVM 的标记器。但是我更熟悉其他标记方法(例如,使用 HMM 或最大熵。)

【讨论】:

【参考方案2】:

大多数机器学习算法处理的输入样本是浮点向量,使得 一对样本之间的小(通常是欧几里得)距离意味着这两个样本是 相似与手头的问题相关。

机器学习从业者有责任找到一组好的浮点特征进行编码。 这种编码是特定于领域的,因此没有通用的方法可以从适用于所有应用程序领域(各种 NLP 任务、计算机视觉、事务日志分析...)的原始数据构建表示。这部分机器学习建模工作称为特征提取。当涉及大量手动工作时,这通常称为特征工程

现在针对您的具体问题,可以使用 scikit-learn 的 DictVectorizer feature extraction helper class 对句子中感兴趣的单词周围的单词窗口的 POS 标签(例如,用于命名实体检测等序列标签)进行适当编码。

【讨论】:

+1。请注意,对于词性标注,词性窗口只能在一个方向上延伸。单词窗口也可以提供很好的特征(至少,它们对 NER 和 WSD 很有效),以及所考虑的单词的固定长度词缀。

以上是关于如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python的主要内容,如果未能解决你的问题,请参考以下文章

如何在 scikit-learn 中继续训练 svm 和 knn?

如何让 SVM 很好地处理 scikit-learn 中的缺失数据?

如何获取 Scikit-learn 的 svm 中的训练误差?

目标的缩放导致 Scikit-learn SVM 回归崩溃

scikit-learn/svm - 在“predict_proba”之后获取概率和相关标签

scikit-learn 在管道中使用多个类预处理 SVM