And*_*rei 2 machine-learning feature-extraction neural-network vowpalwabbit scikit-learn
在sklearn中,当我们将句子传递给算法时,我们可以使用文本特征提取器,如countvectorizer,tf-idf vectoriser等......我们得到一个浮点数组.
但是当我们传递到vowpal wabbit输入文件时我们得到的是这样的:
-1 |Words The sun is blue
1 |Words The sun is yellow
Run Code Online (Sandbox Code Playgroud)
什么在vowpal wabbit的内部实现中使用?这个文本如何变换?
这里有两个不同的问题:
Q1: 你为什么不能(而且不应该)使用像tf-idf
使用时那样的转换vowpal wabbit
?
A1: vowpal wabbit
不是批量学习系统,它是一个在线学习系统.为了计算诸如tf-idf
(每个文档中的术语频率与整个语料库)之类的度量,您需要首先查看所有数据(语料库),有时还要对数据进行多次传递. vowpal wabbit
作为在线/增量学习系统,它还可以解决您没有提供完整数据的问题.有关详细信息,请参阅此答案.
Q2: 如何vowpal wabbit
"转换"它所看到的功能?
A2:没有.它只是将每个单词功能即时映射到内存中的哈希位置.在线学习步骤由示例的重复优化循环( SGD或 BFGS)示例驱动,以最小化建模误差.您可以选择要优化的损失函数.
但是,如果您已经拥有要训练的完整数据,那么在将变换后的值提供给之前,没有任何东西可以阻止您对其进行转换(使用任何其他工具)vowpal wabbit
.这是你的选择.根据特定数据,使用转换预传递可能会获得更好或更差的结果,而不是通过vowpal wabbit
自身运行多次传递而无需进行初步转换(选中vw --passes
选项).
要完成答案,我们添加另一个相关问题:
问题3: 我可以使用预转换(例如tf-idf
)数据vowpal wabbit
吗?
A3:是的,你可以.只需使用以下(转换后)表单即可.而不是单词,使用整数作为要素ID,并且由于任何要素都可以具有可选的显式权tf-idf
重,因此:
在典型的SVMlight格式的分隔符后面使用浮点作为权重:
-1 | 1:0.534 15:0.123 3:0.27 29:0.066 ...
1 | 3:0.1 102:0.004 24:0.0304 ...
Run Code Online (Sandbox Code Playgroud)
这有效的原因是因为它vw
具有区分字符串和整数特征的一个很好的特性.它不会散列看起来像整数的要素名称(除非您--hash_all
明确使用该选项).整数特征编号直接使用,就好像它们是特征的散列结果一样.