What kind of feature extractor is used in vowpal wabbit?
在 sklearn 中,当我们将句子传递给算法时,我们可以使用文本特征提取器,如 countvectorizer、tf-idf vectoriser 等......我们得到一个浮点数组。
但是当我们将输入文件传递给 vowpal wabbit 时,我们得到的是这样的:
1 2
| -1 |Words The sun is blue
1 |Words The sun is yellow |
vowpal wabbit 的内部实现中使用了什么?此文本如何转换?
这里有两个独立的问题:
Q1:为什么在使用 vowpal wabbit 时不能(也不应该)使用像 tf-idf 这样的转换?
A1:vowpal wabbit 不是批量学习系统,而是在线学习系统。为了计算像 tf-idf (每个文档中的词频与整个语料库)这样的度量,您需要首先查看所有数据(语料库),有时还要对数据进行多次传递。 vowpal wabbit 作为一个在线/增量学习系统,旨在解决您没有提前获得完整数据的问题。有关更多详细信息,请参阅此答案。
Q2:vowpal wabbit 如何"转换"它看到的特征?
A2:它没有。它只是将每个单词特征即时映射到其在内存中的散列位置。在线学习步骤由重复优化循环(SGD 或 BFGS)示例驱动,以最小化建模错误。您可以选择要优化的损失函数。
但是,如果您已经拥有要训练的完整数据,那么在将转换后的值提供给 vowpal wabbit 之前,没有什么可以阻止您对其进行转换(使用任何其他工具)。这是你的选择。根据特定数据,使用转换预传递可能会得到更好或更差的结果,而不是在没有初步转换的情况下使用 vowpal wabbit 本身运行多次传递(检查 vw --passes 选项)。
为了完成答案,让我们添加另一个相关问题:
Q3:我可以将预转换(例如 tf-idf)的数据与 vowpal wabbit 一起使用吗?
A3:是的,你可以。只需使用以下(转换后)表格。代替单词,使用整数作为特征 ID,因为任何特征都可以有一个可选的显式权重,所以使用 tf-idf 浮点作为权重,在典型 SVMlight 格式中的 : 分隔符之后:
1 2
| -1 | 1:0.534 15:0.123 3:0.27 29:0.066 ...
1 | 3:0.1 102:0.004 24:0.0304 ... |
之所以有效,是因为 vw 有一个很好的区分字符串和整数特征的特性。它不会散列看起来像整数的特征名称(除非您明确使用 --hash_all 选项)。直接使用整数特征编号,就好像它们是特征的哈希结果一样。
- 真棒答案!非常感谢!但我还有一个问题。如果我想学习二进制sigmoid前馈网络,是否需要使用--passes arg?它是用来做什么的?以及如何测试预测模型?
-
您可以始终将 --passes <N> 与 vw 一起使用,就好像它是预先知道所有数据的批处理设置一样。这是你的选择。但请注意,多次通过可能会导致过度拟合。另请查看 --holdout_period <N> 和 --bootstrap <N> 选项,以帮助避免过度拟合。有关更多选项和用法,请查看 github.com 上的完整教程和文档
-
@arief 那么测试模型呢?可以使用 "vw --binary --nn 4 train.vw -f category.model" 然后 "vw --binary -t -i category.model -p est.vw" 吗?当我添加第二个 cmd 参数 --nn 时,它给了我:错误:选项 \\'--nn\\' 不能多次指定
-
大众不能改变这些特征实际上并不是真的。有许多"转换"可用,例如--quadratic(和 --cubic 以及通常的 --interactions)或 --dictionary。如果特征是单词,您可以使用 --ngram、--skip、--affix 或 --spelling。有关详细信息,请参阅 vw -h。
-
马丁,很公平,所有这些选项都做了一些非常简单的预处理,比如组合现有的功能,以及动态添加/删除功能。我的观点是 vw 不支持像 tf-idf 这样的任意特征转换。即使是简单的数学函数转换(例如,log 或 sqrt),当前核心本身也不支持。
-
@Andrei 当您测试 (-i modelfile -t ...) 时, --nn 4 已经从保存的模型中读取,因此只需将其从测试命令行中删除即可使其工作。
-
假设我们提前拥有完整的训练和测试集。将原始文本和 tfidf 功能放入 2 个单独的命名空间中进行训练是否有意义?它会添加什么吗?会不会导致过拟合?
-
@MykhailoLisovyi 对两者的训练使模型复杂化,有一些(可能很大)重叠/冗余,所以我的直觉说最好避免它。如果您知道 tf-idf,则附加功能会更弱、更嘈杂,并且不会有太大帮助。会过拟合吗?这取决于许多因素。最重要的是,示例数量(数据集长度)与模型复杂度(特征数量、数据集宽度)的比率。如果你有太多特征的例子太少,这通常会导致过度拟合,但如果你有很多例子,你会更安全地防止过度拟合。