二、特征编码

2.1. 特征二元化

  1. 特征二元化的过程是将数值型的属性转换为布尔值的属性。通常用于假设属性取值为取值分布为伯努利分布的情形。

  2. 特征二元化的算法比较简单。 对属性 二、特征编码 - 图1 指定一个阈值 二、特征编码 - 图2

    • 如果样本在属性 二、特征编码 - 图3 上的值大于等于 二、特征编码 - 图4,则二元化之后为 1 。
    • 如果样本在属性 二、特征编码 - 图5 上的值小于 二、特征编码 - 图6,则二元化之后为 0 。
  3. 阈值 二、特征编码 - 图7 是一个超参数,其选取需要结合模型和具体的任务来选择。

2.2. one-hot

  1. 对于非数值属性,如性别:[男,女]、国籍:[中国,美国,英国]等等,可以构建一个到整数的映射。如性别:[男,女]属性中,将映射为整数 1、映射为整数 0。

    该方法的优点是简单。但是问题是,在这种处理方式中无序的属性被看成有序的。无法比较大小,但是10有大小。

    解决的办法是采用独热码编码One-Hot Encoding

  2. One-Hot Encoding采用N位状态位来对N个可能的取值进行编码,每个取值都由独立的状态位来表示,并且在任意时刻只有其中的一位有效。

    假设属性 二、特征编码 - 图8 的取值为非数值的离散集合 二、特征编码 - 图9 ,独热码将其扩展成 二、特征编码 - 图10 个属性,每个新属性代表属性 二、特征编码 - 图11 的一个状态位:若样本在属性 二、特征编码 - 图12 上的取值为 二、特征编码 - 图13,则样本在新的属性 二、特征编码 - 图14 上的取值为 1,在新的属性 二、特征编码 - 图15 上的取值为 0 。

    • 这种做法中,如果在 二、特征编码 - 图16 上取值全为 0,则表示发生了缺失。

      缺失值也可以用第 二、特征编码 - 图17 个状态位来表示。

    • 也可以扩展成 二、特征编码 - 图18 个属性, 如果在 二、特征编码 - 图19 上取值全为 0,则表示样本在属性 二、特征编码 - 图20 上的取值为 二、特征编码 - 图21

  3. One-Hot Encoding 的优点:

    • 能够处理非数值属性。
    • 在一定程度上也扩充了特征。如性别是一个属性,经过独热码编码之后变成了是否男是否女 两个属性。
    • 编码后的属性是稀疏的,存在大量的零元分量。
  4. 在决策树模型中,并不推荐对离散特征进行one-hot。 主要有两个原因:

    • 产生样本切分不平衡的问题,此时且分增益会非常小。

      如:国籍这个离散特征经过独热码编码之后,会产生是否中国、是否美国、是否英国、... 等一系列特征。在这一系列特征上,只有少量样本为1,大量样本为0

      这种划分的增益非常小,因为拆分之后:

      • 较小的那个拆分样本集,它占总样本的比例太小。无论增益多大,乘以该比例之后几乎可以忽略。
      • 较大的那个拆分样本集,它几乎就是原始的样本集,增益几乎为零。
    • 影响决策树的学习。

      决策树依赖的是数据的统计信息。而独热码编码会把数据切分到零散的小空间上。在这些零散的小空间上,统计信息是不准确的,学习效果变差。

      本质是因为独热码编码之后的特征的表达能力较差的。该特征的预测能力被人为的拆分成多份,每一份与其他特征竞争最优划分点都失败。最终该特征得到的重要性会比实际值低。

2.3 离散化

  1. 离散化用于将连续的数值属性转化为离散的数值属性。

  2. 是否使用特征离散化,这背后是:使用“海量离散特征+简单模型”,还是“少量连续特征+复杂模型”。

    • 对于线性模型,通常使用“海量离散特征+简单模型”。

      • 优点:模型简单。
      • 缺点:特征工程比较困难。但是一旦有成功的经验就可以推广,并且可以很多人并行研究。
    • 对于非线性模型(如深度学习),通常使用“少量连续特征+复杂模型”。

      • 优点是:不需要进行复杂的特征工程。
      • 缺点是:模型复杂。

2.3.1 分桶

  1. 离散化的常用方法是分桶。

    • 将所有样本在连续的数值属性 二、特征编码 - 图22 的取值从小到大排列 二、特征编码 - 图23

    • 然后从小到大依次选择分桶边界 二、特征编码 - 图24 。其中:

      • 二、特征编码 - 图25 为分桶的数量,它是一个超参数,需要人工指定。
      • 每个桶的大小 二、特征编码 - 图26 也是一个超参数,需要人工指定。
    • 给定属性 二、特征编码 - 图27 的取值 二、特征编码 - 图28 ,对其进行分桶:

      • 如果 二、特征编码 - 图29 ,则分桶编号为 0。分桶后的属性的取值为 0 。
      • 如果 二、特征编码 - 图30,则分桶编号为 二、特征编码 - 图31 。分桶后的属性的取值为 二、特征编码 - 图32
      • 如果 二、特征编码 - 图33 ,则分桶编号为 二、特征编码 - 图34 。分桶后的属性的取值为 二、特征编码 - 图35
  2. 分桶的数量和边界通常需要人工指定。一般有两种方法:

    • 根据业务领域的经验来指定。如:对年收入进行分桶时,根据2017年全国居民人均可支配收入约为 2.6 万元,可以选择桶的数量为5。其中:

      • 年收入小于 1.3 万元(人均的0.5倍),则为分桶 0 。
      • 年收入在 1.3万元 ~5.2 万元(人均的0.5~2倍),则为分桶 1 。
      • 年收入在 5.3万元~26万元(人均的2倍~10倍),则为分桶 2 。
      • 年收入在 26万元~260万元(人均的10倍~100倍),则为分桶 3 。
      • 年收入超过 260万,则为分桶 4 。
    • 根据模型指定。根据具体任务来训练分桶之后的数据集,通过超参数搜索来确定最优的分桶数量和分桶边界。
  3. 选择分桶大小时,有一些经验指导:

    • 分桶大小必须足够小,使得桶内的属性取值变化对样本标记的影响基本在一个不大的范围。

      即不能出现这样的情况:单个分桶的内部,样本标记输出变化很大。

    • 分桶大小必须足够大,使每个桶内都有足够的样本。

      如果桶内样本太少,则随机性太大,不具有统计意义上的说服力。

    • 每个桶内的样本尽量分布均匀。

2.3.2 特性

  1. 在工业界很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列 0/1 的离散特征。

    其优势有:

    • 离散化之后得到的稀疏向量,内积乘法运算速度更快,计算结果方便存储。

    • 离散化之后的特征对于异常数据具有很强的鲁棒性。

      如:销售额作为特征,当销售额在 [30,100) 之间时,为1,否则为 0。如果未离散化,则一个异常值 10000 会给模型造成很大的干扰。由于其数值较大,它对权重的学习影响较大。

    • 逻辑回归属于广义线性模型,表达能力受限,只能描述线性关系。特征离散化之后,相当于引入了非线性,提升模型的表达能力,增强拟合能力。

      假设某个连续特征 二、特征编码 - 图36 ,它离散化为 二、特征编码 - 图37 个 0/1 特征 二、特征编码 - 图38 。则:

      二、特征编码 - 图39 。其中 二、特征编码 - 图40 是离散化之后的新的特征,它们的取值空间都是 二、特征编码 - 图41

      上式右侧是一个分段线性映射,其表达能力更强。

    • 离散化之后可以进行特征交叉。假设有连续特征 二、特征编码 - 图42,离散化为 二、特征编码 - 图43 个 0/1 特征;连续特征 二、特征编码 - 图44,离散化为 二、特征编码 - 图45 特 0/1 特征,则分别进行离散化之后引入了 二、特征编码 - 图46 个特征。

      假设离散化时,并不是独立进行离散化,而是特征 二、特征编码 - 图47 联合进行离散化,则可以得到 二、特征编码 - 图48 个组合特征。这会进一步引入非线性,提高模型表达能力。

    • 离散化之后,模型会更稳定。

      如对销售额进行离散化,[30,100) 作为一个区间。当销售额在40左右浮动时,并不会影响它离散化后的特征的值。

      但是处于区间连接处的值要小心处理,另外如何划分区间也是需要仔细处理。

  2. 特征离散化简化了逻辑回归模型,同时降低模型过拟合的风险。

    能够对抗过拟合的原因:经过特征离散化之后,模型不再拟合特征的具体值,而是拟合特征的某个概念。因此能够对抗数据的扰动,更具有鲁棒性。

    另外它使得模型要拟合的值大幅度降低,也降低了模型的复杂度。