Vowpal Wabbit哈希冲突作为正则化手段比L1效果更好

我有一个VW分类模型,想要检查它的特征数量和哈希冲突数量。我在不同的数据集上训练和测试了它。这些数据集包含超过40万个特征,因此在18位VW空间中,只能在不发生冲突的情况下保存26万个特征。

然后,为了检查它,我创建了两个可读模型:一个使用参数–readable_model来获取所有哈希的数量,另一个使用参数–invert_hash来获取所有特征的数量,包括那些发生哈希冲突的特征。结果显示有42.5万个特征和20.8万个哈希(不是26万,因为我使用了一些过滤参数–keep,而且据我了解,vw也会将忽略的命名空间保存到哈希表中)。然后我测量了模型的质量,使用了ROC_AUC、MCC和平均精度。结果分别是0.903、0.564和0.591。

如你所见,哈希冲突非常大,所以我决定通过-b参数将位空间增加到24位。然后我重新训练了模型。现在,有42.5万个特征和42.5万个哈希=没有冲突。然而,在相同的指标上,结果却更差了(0.902、0.554、0.587)。

到目前为止,一切看起来像是24位空间导致了严重的过拟合,而18位空间更好地防止了模型的过拟合——这是一个很好的解释,为什么在测试数据集上18位模型的结果更好。

但随后我决定在24位模型上使用L1正则化来减少特征数量。我尝试了一段时间,当我得到一个具有20.8万个哈希和20.8万个特征的模型时,我非常惊讶,它的结果仍然比具有相同哈希数量的18位模型差。结果是0.901、0.584和0.552。

这让我相信,即使是对于大量特征的随机哈希冲突,也比L1正则化更有效的正则化手段。这是怎么可能的?


回答:

这里到底发生了什么(结论)?

你所经历的是过拟合的强烈迹象。详细情况如下。

这怎么可能?

正则化和随机哈希冲突都是模型特征子集的折扣机制。它们选择一些特征,并使这些特征在模型中变得不那么重要(或完全被折扣)。

但它们的相似性到此为止。这两种折扣机制在以下方面非常不同:

  • 它们折扣的特征子集(特定 vs 随机)
  • 折扣方法(完全 vs 部分混合)
  • 折扣的方向和幅度

特定 vs 随机折扣

L1正则化(--l1 ...)选择非常特定的权重(那些最接近零的权重与范数相比),而随机哈希冲突“选择”随机权重,其中一些可能很大。

完全 vs 部分混合折扣

L1正则化完全修剪/移除它选择的权重,而随机哈希冲突则与其他特征创建混合。从某种意义上说(效果混合),混合类似于vw的特征交叉功能,使用-q <XY>实现,尽管不完全相同。

折扣的方向和幅度

与通过权重绝对值的特定选择不同,随机选择可以影响任何幅度的权重。

此外,一个特征单独考虑时可能是一个坏特征,但在与另一个特征结合考虑时实际上可能有贡献。一个例子是两个坏特征的混合,一个具有正权重,另一个具有负权重。通过部分抵消,它们可能会形成一个与目标标签有一定相关性的合理好特征。换句话说:特征混合有时可以将坏效果变成好效果。

折扣如何帮助(或损害)模型?

这在机器学习中非常常见,尤其是在大数据问题中。特征选择、修剪或混合是否提高准确性取决于数据。

如果它恰好折扣了一个“坏”特征(一个与训练数据一致但对泛化无帮助的特征),它会使模型变得更好。然而,如果我们折扣了一个好的、具有良好泛化能力的特征,它会在测试(样本外数据)中使模型看起来更差。

相关:随机折扣或丢弃特征的想法,即使是可能重要的特征,已被证明是深度神经网络(NN)中一种强大且有益的技术,称为dropoutdropout已成为避免深度学习中过拟合的标准方法。

结论

创建好的模型需要实践。当你有大量特征时,由于随机效应(无论是小还是大权重)可能发生过拟合。这种过拟合需要避免。

有许多方法可以避免过拟合。正则化只是减少过拟合的一种特定方法。有时,一种更显著的、影响所有特征的随机方法,而不仅仅是那些低权重的特征,整体上可能更有益。

当这种情况发生时,这是一个提示,特征数量可能过多,你可能在过拟合它们。

一般来说,我会怀疑任何模型,其中用于训练的示例数量(数据集行数)并不比特征数量(不同的数据集列数)大很多。如果你有数十万(10^6)个特征,你可能需要10^12(万亿)个示例来避免过拟合。

对于大量特征的另一个方法,我会随机打乱示例的顺序,并混合多个模型,以确保特定顺序不会导致过拟合。线上学习倾向于对早期示例的权重过高,因为学习率衰减的原因。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注