大厂面试机器学习算法(0):特征工程 | 数据预处理

数据分桶(分箱)

概念
数据分桶是一种数据预处理技术,通过对连续变量离散化,提高模型性能。

意义

  1. 离散后的特征对异常值更有鲁棒性,尤其避免极端异常值的干扰;
  2. 特征离散后模型更稳定,不会因为特征值的轻微变化而改变结果;
  3. 稀疏向量内积乘法运算速度快,算法速度更快,也便于存储

分桶方法

  1. 有监督:best-ks分桶和卡方分桶
  2. 无监督:等距分桶、等频分桶、聚类分桶

卡方分桶

基本思想
自底向上基于合并的离散化方法,初始每个值作为一个分箱,计算相邻区间的卡方值,合并卡方值最小的区间,直到终止条件。

原理:卡方检验
在这里插入图片描述
卡方检验在分箱中的应用
核心思想:卡方值越小分布越相似。
以“年龄”为待分箱变量,“是否违约”为预测变量为例。

  1. 为了合并年龄,先对年龄进行排序,再计算每种可能分箱组合的卡方值。
    以20+25组合为例,假设年龄是20还是25对是否违约没有显著影响,因此违约的p是15/33,不违约的p是18/33,由E=np可得期望,再利用公式计算20+25组合的卡方值。
    推广: E = R T ∗ C T n E=\frac{RT*CT}{n} E=nRTCT
    在这里插入图片描述
  2. 合并卡方值最小的组合,并继续计算,直到终止条件。
  3. 终止条件:
    分箱数目的限制(一般可以设为5);
    卡方停止的阈值:可以选择置信度为0.9、0.95、0.99,自由度df=(R-1)(C-1),比如此处是2。

等距分桶

全局均匀统计分桶(split_value_stat)
将取值映射到相等大小的区间。保证特征落在每个bucket的概率是相同的。如:

import numpy as np
# 生成 20 个 0-99 之间的随机整数
small_counts = np.random.randint(0, 100, 20)
# 进行分箱操作, 通过对数据除以 10 分到 0-9 总共 9 个箱里,
# 返回的结果就是对应数据应该划分到的箱的编号
np.floor_divide(small_counts, 10)
# 返回: array([7,1,6,6,0,6,0,6,7,1,4,6,3,2,2,7,3,7,1])

缺点:可能导致某些区间取值个数非常多,某些非常少。

正例均匀统计分桶(split_value_stat_pos)
与全局不同的是,挑选正例数据进行均匀分桶。

正例log统计分桶(split_value_stat_pos_log)
与正例均匀不同的是,给定的概率分布为log分布。适用于数字跨越多个数量级的情况,取计数的log值,如:

# 构造一个间隔更大的数组例子,可以通过取对数 log10 来进行分箱
large_counts = [296, 8286, 64011, 80, 3, 725, 867, 2215, 7689, 11495, 91897, 44, 28, 7971, 926, 122, 22222]
np.floor(np.log10(large_counts))
# 返回:array([2.,3.,4.,1.,0.,2.,2.,3.,3.,4.,4.,1.,1.,3.,2.,2.,4.])

等频分桶

也称按分位数分桶,将取值映射到区间,使每个区间内包含的取值个数大致相同。可以使用Pandas库获取分位数,如:

large_counts = [296, 8286, 64011, 80, 3, 725, 867, 2215, 7689, 11495, 91897, 44, 28, 7971, 926, 122, 22222]
# 将数据映射到所需数量的分位数
pd.qcut(large_counts, 4, labels=False)
# 计算指定分位数点的数据
large_counts_series = pd.Series(large_counts)
large_counts_series.quantile([0.25, 0.5, 0.75]
''' 返回:
0.25	122.0
0.50	926.0
0.75	8286.0
dtype:float64
'''

聚类分桶

根据xgb的get_split_value_histogram函数获得histogram,取特征的分裂节点值作为split_value。
注:

  1. 不一定每个特征都会有合适的分裂节点值;
  2. 一个特征在同一棵树内可能多次被使用,分裂多次;
  3. 最后取同一特征在所有树上的分裂值做分桶。

无量纲化

数据规范化

min-max normalization
在这里插入图片描述
z-score
在这里插入图片描述

数据正则化

简单来说,标准化是依照特征矩阵的列处理数据,将样本的特征值转换到同一量纲下。
正则化是依照特征矩阵的行处理数据,其目的在于方便样本向量的点乘运算或其他核函数计算,也就是说都转化为“单位向量”。
正则化的过程是将每个样本缩放到单位范数(每个样本的范数为1),如果后面要使用如点积或者其它核方法计算两个样本之间的相似性(如余弦相似度),这个方法会很有用。
p 范 数 : ∣ ∣ X ∣ ∣ p = ( ∣ x 1 ∣ p + ∣ x 2 ∣ p + . . . + ∣ x n ∣ p ) 1 / p p范数:||X||^p=(|x1|^p+|x2|^p+...+|xn|^p)^{1/p} pXp=(x1p+x2p+...+xnp)1/p
余 弦 相 似 度 : s i m ( x 1 , x 2 ) = x 1 ⋅ x 2 ∣ ∣ x 1 ∣ ∣ ⋅ ∣ ∣ x 2 ∣ ∣ 余弦相似度:sim(x_1,x_2)=\frac{x_1·x_2}{||x_1||·||x_2||} sim(x1,x2)=x1x2x1x2

数据清洗

数据缺失

在这里插入图片描述

噪音数据

  • 识别噪音将其去除,如孤立点识别;
  • 利用其它非噪音数据将其平滑,如数据分箱。

数据不一致

特征选择与特征提取

特征选择

特征选择主要有两个目的

  • 减少特征数量、降维,使模型泛化能力更强,减少过拟合;
  • 增强对特征和特征值之间的理解。

特征选择可以分为filter、wrapper、embedded三大类方法

  • Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
  • Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
  • Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。

相关系数法
计算自变量与因变量的相关系数,当相关系数小于阈值时舍弃该变量。

卡方检验法
该方法使用与自变量与因变量均为分类变量的情况,用于检验自变量和因变量有无显著相关性。卡方检验具体方法见上文的“分箱方法-卡方检验”。

Relief算法
Relief算法是一种特征权重算法(Feature weighting algorithms),根据各个特征和类别的相关性赋予特征不同的权重,权重小于某个阈值的特征将被移除。
Relief算法中特征和类别的相关性是基于特征对近距离样本的区分能力
主要步骤如下:

  1. 初始化所有特征权重 w i = 0 w_i=0 wi=0,数值属性归一化;
  2. 从训练集D中随机选择一个样本R,然后从和R同类的样本中寻找最近邻样本H,称为Near Hit,从和R不同类的样本中寻找最近邻样本M,称为NearMiss;
  3. 更新每个特征的权重:如果R和Near Hit在某个特征A上的距离小于R和Near Miss上的距离,则说明该特征对区分同类和不同类的最近邻是有益的,则增加该特征的权重;反之,则降低该特征的权重;
    w i = w i − d ( R . A , H . A ) + d ( R . A , M . A ) w_i = w_i-d(R.A,H.A)+d(R.A,M.A) wi=wid(R.A,H.A)+d(R.A,M.A)
    在这里插入图片描述
  4. 以上过程重复m次,最后得到各特征的权重,输出大于阈值的特征。

例:
在这里插入图片描述

Relief算法的运行时间随着样本的抽样次数m和原始特征个数N的增加线性增加,因而运行效率非常高。

特征提取

PCA算法
通过对原有变量进行线性变换,提取反映事物本质的新变量,同时去除冗余、降低噪音,达到降维目的。

  1. 给定数据集,包含n个对象,m个属性;
  2. 中心化数据集:每个属性值减去属性均值,使中心化后的数据均值为0,用 x n × m x_{n×m} xn×m表示;
  3. 计算协方差矩阵C,元素 c i j c_{ij} cij是属性 A i A_i Ai A j A_j Aj之间的协方差: c i j = ∑ k = 1 n ( x k i − A i ) ‾ ( x k j − A j ‾ ) c_{ij}=\sum_{k=1}^n(x_{ki}-\overline{A_i)}(x_{kj}-\overline{A_j}) cij=k=1n(xkiAi)(xkjAj)
  4. 计算协方差矩阵的特征根和特征方程,特征根降序排列为 λ 1 ≥ λ 2 ≥ . . . ≥ λ m ≥ 0 \lambda_1≥\lambda_2≥...≥\lambda_m≥0 λ1λ2...λm0,则 λ 1 \lambda_1 λ1对应的特征向量为第一主成分, λ 2 \lambda_2 λ2对应的特征向量为第二主成分,第i个主成分的贡献率为: λ i ∑ k = 1 m λ k \frac{\lambda_i}{\sum_{k=1}^m\lambda_k} k=1mλkλi
  5. 保留前q个最大特征根及对应的特征向量,构造主成分矩阵P,其第i列向量 p i p_i pi是第i个主成分(即特征向量);
  6. 计算降维后的矩阵 Y n × q = X n × m P m × q , q < n Y_{n×q}=X_{n×m}P_{m×q}, q<n Yn×q=Xn×mPm×q,q<n
    新的特征是原有特征的线性组合。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值