无论模型是传统的ML,还是DL模型,处理的都是连续性变量(特征),在现实开发中,特征往往存在着两种状态–离散和连续。
机器学习模型处理的都是连续型数据(loss,梯度更新权重,不连续则没有办法去更新权重),对于离散型遍历有以下几种处理方式:
- 将类别无序 ——> 连续 (one-hot)
- 将类别有序 ——> 连续 (Label Encoder),一般将类别数值型 利用 Label Encoder 进行编码,转化成连续型特征。 即是对不连续的数字或者文本进行编号
类别型变量范围在范围较小时 推荐使用one-hot,【10,100范围内】
类别无序:如城市,性别
类别有序:比如age,
one-hot 为什么能将 离散特征 转化成 连续特征?
one-hot ,直观理解,有多少个状态就有多少比特,而且只有一个比特为1,其他全为0 的编码方式。
假如 color_feature = [红,黄,蓝]是三个特征值,利用机器学习的算法时,需要进行向量化或者数字化,如果,令红=1,黄=2,蓝=3,实现了标签化,然而这意味着机器学习可能会学习到“红<黄<蓝”的关系,但这并不是我们让机器学习的本意,只是区分他们,并无大小比较意思,所以标签化编码是不够的,3种状态,所以就有3个比特,红,100,黄,010,蓝,001,每个向量之间的距离都是根号2,向量空间距离都相等,所以不会出现偏序性。基本上不会影响基于向量空间度量算法的效果。
大部分算法是基于向量空间中的度量来计算的,为了使非偏序关系的变量取值不具有偏序性,就使用one-hot将离散特征的取值扩展到了欧式空间,,编码后的特征都可以看做是连续的特征
连续值:
可以做归一化,加快模型学习,加快收敛速度,模型更加稳定
Embedding
特征维度比较大,超过1000维,建议使用Embedding,Embedding的作用,就是将离散特征转化到一个可以在向量空间中度量的一种形式。解决的是 稀疏输入数据,将高维度数据映射到低维空间。
例子 参考 链接3 和 4
-
无序离散特征:ont-hot encoding ,如 国家、城市
(1) 无序离散特征,如果 one-hot 之后 unique 值不多,可以不用做Embedding,但如果该特征 one-hot 之后 unique 值过多,embedding
(2) 也可以做LabelEncoding,将特征不同取值分开,然后再embedding -
有序离散特征:label encoding,比如年龄(类似分桶)
-
单值离散特征:做embedding 映射成1K维向量,然后与其他特征拼接
in_age = Input(shape=[1], name=“age”) # None1
emb_age_1d = Reshape([1])(Embedding(10, 1)(in_age)) # None*1, 年龄取值10种 -
多值离散特征:做embedding 映射成NK维,如某人的爱好有N个这种特征
先做padding补成相同长度的,就得到了[0,1,0,1,1,0…0] 然后做Embedding(10,1)
in_topic = Input(shape=[4], name=“topic”) # None4, 最长长度4
emb_topic_1d = Embedding(22, 1, mask_zero=True)(in_topic) # None41 -
连续特征:归一化,分桶之后的离散值
参考链接:
- https://www.cnblogs.com/king-lps/p/7846414.html
- https://blog.csdn.net/m0_37870649/article/details/104550054
- https://blog.csdn.net/songbinxu/article/details/80151814
- https://blog.csdn.net/qfikh/article/details/104836456