TL;DR
- One-hot是对低维高信息量的特征在高维中进行打散,使之在模型中更容易被优化/学习。也是ML中常用套路“先升维”的一个方案。
本文不讨论ML乃至DL中某些ID特征对模型最终效果是否有贡献的问题,只是针对于One-hot的作用进行解释。
从ID类特征讲起
说起One-hot就得说起userid、itemid各种ID类特征,所以下面先看下ID类特征的处理方案演进:
- 在大数据之前的时代,一般领域的ML中取值上万乃至千万的id类特征基本是直接丢弃的,新人的常犯错误之一就是把id的值直接作为一个特征加入到模型中进行训练。
- 但在NLP中,各种字符(字符ID)基本是唯一的重要特征,丢弃了就没法学了。这里有代表性的就是n-gram,可以作为一个按某些ID n-gram进行分桶的统计模型,也可以以n-gram的one-hot作为特征。
- 大数据时代,随着FTRL、FM、DL中的embedding以及定制的word2vec等方案的崛起,ID类特征做one-hot也被发现能提升模型效果。
初接触ML的人往往对ID类特征到底提供了什么信息感觉模糊,每个用户的id其实没有什么意义,只是单纯的和其他人、其他对象区别开了而已,“这个特征有信息量么?”
简单的来说,ID类特征其实主要没有提供什么信息(这个描述不准确,后面会进行修正),而是给ML模型提供了一个空间,是指能对于不同的对象分别进行一些“统计”或者说记忆,这个信息没法泛化,但确实可以改善模型的效果。某种意义上说,统计结果本身就是可以泛化的,但可能和一般人想象的可以学习出某种规则的那种泛化不是同一个含义。
One-hot的作用
除了对ID直接做One-hot外,还可以对userid*itemid这样的交叉特征做One-hot,很多领域中所谓的万亿级特征就是这么来的:一百万用户、一百万商品,就有一万亿个组合,用One-hot编码一下就有一万亿维,听起来高大上,但说白了就是一个很简单的处理。当然,能不能训好模型才是关键,也是另一个问题,本文不展开。
剩下还有哪里可以用One-hot就不是那么广为人知的了,这里举两个应用:
- 对于某一维或少数某些维度的高度非线性的特征,可以对其值域做分区one-hot编码作为特征。这种方式有信息损失,也可以对其稍加改动变成一个无信息损失的方案。
- 作为上面的一个特例,在GIS领域中坐标特征处理的一个常见手段就是分区域做one-hot,例如这篇文章里描述的:Modeling Trajectories with Recurrent Neural Networks
那么问题来了,这些场景中,One-hot的作用到底是什么呢?如果都是对某个特征的可逆变换,那么One-hot的价值是什么呢?
为了回答这个问题,首先我们得承认,目前鲁棒的ML模型的学习能力理论上可能可以充分学到所有信息,但实际上是有限的。例子就是DL收到优化方式的影响,理论上信息在特征里都有,但可能只能学到20%,这里面就有难学习和容易学习的差异。在给定问题的场景下,特征工程的方式可以显著影响这个难易度,而One-hot的价值就在于对上面这种低维度、高信息量、且距离超过一定程度的不同的值之间关系很弱的特征,可以通过one-hot的方式来显著降低模型学习的难度。当然往往以增加了模型的容量为代价。
这也是为什么交叉特征明明可以做userid*1e9 + itemid这样的方式来无损的表达所有信息,但效果并不好的原因。
目前FM、DL等模型对于特定数据上的理论研究还不够完善,所以下面这只是我个人的看法,尚未看到其他出处,有看到的同学请留言指出:
对于上面所说的这类特征,相对于其高维度的表示,以DL为代表的很多模型更难以学习其低维高度非线性的表示。DL中特征的“自然”表示可能就是高维低密度而非低维高密度。
题外话,说起来还有一类方案可以起到One-hot的反向效果,将高维表示的数据丢弃高维中远距离的信息,保留局部距离关系,转换为低维的表示——那就是t-SNE为代表的非线性降维,如下图。如果你对于GIS中的坐标特征的性质不熟悉,那么下面这个图和真实数据的坐标特征分布其实有些相似。
![a0868b7aaf3ccc958c3f5f31ced4d466.png](https://img-blog.csdnimg.cn/img_convert/a0868b7aaf3ccc958c3f5f31ced4d466.png)
图片来源:https://lvdmaaten.github.io/tsne/
也不能说One-hot未来就是这种特征最好的特征工程方式,但目前它是最佳实践。
补:再说ID类特征
前面说“ID类特征其实主要没有提供什么信息”,这个其实是不准确的,这取决于ID的生成方式:随机ID是没有信息,但流水号ID其实是有信息的,例如流水号生成的用户ID,同一个ID附近的用户很可能是时间上同一批活动或同一时期成为该产品用户的,虽然这个数据比较脏,但作为特征来说对ML来说是足够的,只是需要一个好的特征工程方式而已。
例如在已有ID one-hot的基础上,增加下面这类方式对于流水号型的ID是可能有效果的:
- 对ID的取值分段做One-hot,分段长度可以不止一种
- 对ID的的二进制表示的每一位做One-hot
本文成文于 2018.3.10
后期相关文章:
【ML思考笔记】如何在模型中编入人工先验知识