我可以在 crf 模型中使用数值特征吗
Posted
技术标签:
【中文标题】我可以在 crf 模型中使用数值特征吗【英文标题】:can I use numerical features in crf model 【发布时间】:2014-11-26 22:39:11 【问题描述】:在 crf 模型中添加数字特征是否可能/很好?例如序列中的位置。
我正在使用CRFsuite。似乎所有功能都将转换为字符串,例如'pos=0', 'pos=1',然后失去它作为欧几里得距离的意义。
或者我应该使用它们来训练另一个模型,例如svm,然后与 crf 模型合奏?
【问题讨论】:
可以使用LABEL f1:0.1 f2:0.4 f3:0.8 f4:0.2 f5:0.9
这样的格式。见datascience.stackexchange.com/a/4886/94403
【参考方案1】:
CRF 本身可以使用数字特征,您应该使用它们,但如果您的实现将它们转换为字符串(通过“一个热点编码”以二进制形式编码),那么它的重要性可能会降低。我建议寻找更多允许连续变量的“纯”CRF。
一个有趣的事实是,CRF 的核心只是结构化的 MaxEnt (LogisticRegression),它在 连续域 中工作,这种字符串编码实际上是从 categorical 出发的一种方式连续域的值,所以您的问题实际上是 CRFSuite “过度设计”的结果,它忘记了 CRF 模型的实际功能。
【讨论】:
知道了。我选择 CRFsuite 的原因是它带有一个很好的python wrapper,它易于使用。在另一个模型中使用这些数值特征然后与 crf 集成会有所帮助吗? 好像不对,CRF是一个序列分类器。将它与非序列模型集成是相当奇怪的。寻找一种在 CRF 中实际包含数字特征的方法会更有利可图,正如之前所说,CRF 完全能够执行此类操作【参考方案2】:我发现 CRFsuite 确实可以处理数字特征,至少根据this documentation:
“string_key”: float_weight, ... dict 其中键是观察到的特征,值是它们的权重; “string_key”: bool, ... 字典; True 转换为 1.0 权重,False - 转换为 0.0; “string_key”: “string_value”, ... 字典;这与 “string_key=string_value”: 1.0, ... 相同 [“string_key1”, “string_key2”, ...] 列表;这与 “string_key1”: 1.0, “string_key2”: 1.0, ... 相同 “string_prefix”: ... dicts:嵌套的 dict 被处理,并且“string_prefix”被添加到每个键。 “string_prefix”: [...] dicts: 嵌套列表被处理,“string_prefix” 被添加到每个键。 “string_prefix”: set([...]) dicts: 嵌套列表被处理,“string_prefix” 被添加到每个键。
只要:
-
我保持输入格式正确;
我使用浮点数与浮点数字符串;
我将其标准化。
【讨论】:
【参考方案3】:只是为了澄清一下 Lishu 的答案(这是正确的,但在我尝试之前可能会像它对我所做的那样让其他读者感到困惑)。这个:
“string_key”: float_weight, ... dict 其中键是观察到的特征,值是它们的权重
可以写成
“feature_template_name”: feature_value, ... dict 其中键是特征名称,值是它们的值
即有了这个,你没有设置与这个 feature_template 对应的 CRF 的权重,而是这个特性的值。我更喜欢将它们称为具有特征值的特征模板,以便一切都比“特征”更清楚。然后,CRF 将学习与此特征模板的每个可能特征值相关的权重
【讨论】:
以上是关于我可以在 crf 模型中使用数值特征吗的主要内容,如果未能解决你的问题,请参考以下文章