特征处理
在实际应用中,数据的类型多种多样,比如文本、音频、图像、视频等。而很多机器学习算法要求输入的样本特征是数学上可计算的,因此在机器学习之前需要将不同类型的数据转换为向量表示即数据的特征表示。
特征分类:
对特征进行分类,对于不同的特征应该有不同的处理方法。
根据不同的分类方法,可以将特征分为
(1)Low level特征和High level特征。
-
Low level特征——较低级别的特征,主要是原始特征,不需要或者需要非常少的人工处理和干预。
例如文本特征中的词向量特征,图像特征中的像素点,用户id,商品id等。
Low level特征一般维度比较高,不能用过于复杂的模型。 -
High level特征——经过较复杂的处理,结合部分业务逻辑或者规则、模型得到的特征。
例如人工打分,模型打分等特征,可以用于较复杂的非线性模型。 -
Low level 比较针对性,覆盖面小。长尾样本的预测值主要受high level特征影响。 高频样本的预测值主要受low level特征影响。
(2)稳定特征与动态特征。
-
稳定特征——变化频率(更新频率)较少的特征
例如评价平均分,团购单价格等,在较长的时间段内都不会发生变化。 -
动态特征——更新变化比较频繁的特征,有些甚至是实时计算得到的特征
例如距离特征,2小时销量等特征。或者叫做实时特征和非实时特征。 -
针对两类特征的不同可以针对性地设计特征存储和更新方式
例如
对于稳定特征,可以建入索引,较长时间更新一次,如果做缓存的话,缓存的时间可以较长。
对于动态特征,需要实时计算或者准实时地更新数据,如果做缓存的话,缓存过期时间需要设置的较短。
(3)二值特征、连续型特征、离散型特征、枚举特征。
-
二值特征——主要是0/1特征,即特征只取两种值:0或者1
例如用户id特征:目前的id是否是某个特定的id,词向量特征:某个特定的词是否在文章中出现等等。 -
连续型特征——取值为连续实数的特征。比如,身高175.4cm。特征取值为是0~正无穷。
-
离散性特征——取值为离散实数的特征。离散型特征又可以分为类别型和序列型
- 类别型特征:取离散值,表示没有比较关系的类型。比如,血型有 A 型、B 型、AB 型和 O 型 4 种,它们各自为一个独立类型。
- 序列型特征:取离散值,表示有比较关系的类型。比如,收入划分为为 “高”、“中”、“低”3 种类型,有比较关系。
-
枚举值特征——主要是特征有固定个数个可能值,例如今天周几,只有7个可能值:周1,周2,…,周日。
模型输入的特征通常需要数值型的,所以需要将非数值型特征转换为数值特征。 如性别、职业、收入水平、国家、汽车使用品牌等。
机器学习模型需要的数据是数字型的,因为只有数字类型才能进行计算,而我么你平时处理到的一些数据是很多是符号的,或者是中文的。所以编码是必要的,对于各种各样的特征值去编码实际上就是一个量化的过程
1、类别型特征的处理—特征编码
类别特征,见名思义,就是用来表达一种类别或标签
分类变量的类别通常不是数字,需要使用编码方法将这些非数字类别变为数字。即特征编码
特征编码
1.1 处理少量特征
1、One-hot 编码
又称独热编码
每个特征取值对应一维特征,从而得到稀疏的特征矩阵。
一个绝对的具有k个可能类别的变量被编码为长度为k的特征
向量。
如表1即为对三种水果进行编码
e1 | e2 | e3 | |
---|---|---|---|
apple | 1 | 0 | 0 |
banna | 0 | 1 | 0 |
grape | 0 | 0 | 1 |
独热编码e1,e2,e3限制条件:
e1 + e2 + e3 = 1
df = pd.DataFrame({
'fruit':
['apple', 'apple', 'banna', 'banna', 'grape'],
'Rent': [10, 10, 15, 15, 20]
})
one_hot_df = pd.get_dummies(df, prefix=['fruit'])
优点:
-
能够处理非数值属性。比如血型、性别等
-
一定程度上扩充了特征。
-
编码后的向量是稀疏向量,只有一位是 1,其他都是 0,可以利用向量的稀疏来节省存储空间。
-
能够处理缺失值。当所有位都是 0,表示发生了缺失。此时可以采用处理缺失值提到的高维映射方法,用第 N+1 位来表示缺失值。
缺点:
1.高维度特征会带来以下几个方面问题:
-
KNN 算法中,高维空间下两点之间的距离很难得到有效的衡量;
-
逻辑回归模型中,参数的数量会随着维度的增高而增加,导致模型复杂,出现过拟合问题;
-
通常只有部分维度是对分类、预测有帮助,需要借助特征选择来降低维度。
2.决策树模型不推荐对离散特征进行独热编码,有以下两个主要原因:
- 产生样本切分不平衡问题,此时切分增益会非常小。
比如对血型做独热编码操作,那么对每个特征是否 A 型、是否 B 型、是否 AB 型、是否 O 型,会有少量样本是 1 ,大量样本是 0。
这种划分的增益非常小,因为拆分之后:
-
较小的那个拆分样本集,它占总样本的比例太小。无论增益多大,乘以该比例之后几乎可以忽略。
-
较大的那个拆分样本集,它几乎就是原始的样本集,增益几乎为零。
-
影响决策树的学习。
决策树依赖的是数据的统计信息。而独热码编码会把数据切分到零散的小空间上。在这些零散的小空间上,统计信息是不准确的,学习效果变差。
本质是因为独热编码之后的特征的表达能力较差。该特征的预测能力被人为的拆分成多份,每一份与其他特征竞争最优划分点都失败。最终该特征得到的重要性会比实际值低。
2、dummy 编码
又称虚拟编码
一个绝对的具有k个可能类别的变量被编码为长度为k-1的特征
向量。
由全零向量表示参考类别.
e1 | e2 | |
---|---|---|
apple | 1 | 0 |
banna | 0 | 1 |
grape | 0 | 0 |
dummy_df = pd.get_dummies(df, prefix=['city'], drop_first=True)
3、Effect 编码
一个绝对的具有k个可能类别的变量被编码为长度为k-1的特征
向量。
由全负一向量表示参考类别.
e1 | e2 | |
---|---|---|
apple | 1 | 0 |
banna | 0 | 1 |
grape | -1 | -1 |
Effect编码与虚拟编码非常相似,但是在线性回归中更容易被拟合。
独热,虚拟和效果编码非常相似。他们每个人都有优点和缺点。独热编码是多余的,它允许多个有效模型一样的问题。非唯一性有时候对解释有问题。该优点是每个特征都明显对应于一个类别。此外,失踪数据可以编码为全零矢量,输出应该是整体目标变量的平均值。
优缺点对比
4、序号编码
序号编码一般用于处理类别间具有大小关系的数据即序列型特征。
比如成绩,可以分为高、中、低三个档次,并且存在“高>中>低”的大小关系,那么序号编码可以对这三个档次进行如下编码:高表示为 3,中表示为 2,低表示为 1,这样转换后依然保留了大小关系。
分层 编码
比如邮编、身份证号等,取不同的位数进行分层,然后按层次进行自然数编码。
散列编码
对于取值特别多的,可以先散列后独热。可能导致特征取值冲突。
计数编码
这种方法对异常值比较敏感,也可能导致特征取值冲突。
计数排名编码
对异常点不敏感,不会导致特征取值冲突。
目标编码
有监督的编码方法,需结合交叉验证。(如CTR任务中,可对广告主ID结合过去固定时间段内的点击率进行编码)
交叉组合编码
交叉组合(类别+类别):笛卡儿积操作、基于分组统计。
交叉组合(类别+数值):如统计产品在某个区域的销量、价格、平均价差等。
1.2处理大量的类别特征
1.对编码不做任何事情。使用便宜的训练简单模型。在许多机器上将独热编码引入线性模型(逻辑回归或线性支持向量机)。
2.压缩编码,有两种方式
- 对特征进行哈希–在线性回归中特别常见
- bin-counting–在线性回归中与树模型都常见
2、文本特征的处理——文本形式转换为向量形式
文本特征提取有两个非常重要的模型:
词集模型: