数据分桶(分箱)
概念
数据分桶是一种数据预处理技术,通过对连续变量离散化,提高模型性能。
意义
- 离散后的特征对异常值更有鲁棒性,尤其避免极端异常值的干扰;
- 特征离散后模型更稳定,不会因为特征值的轻微变化而改变结果;
- 稀疏向量内积乘法运算速度快,算法速度更快,也便于存储。
分桶方法
- 有监督:best-ks分桶和卡方分桶
- 无监督:等距分桶、等频分桶、聚类分桶
卡方分桶
基本思想
自底向上基于合并的离散化方法,初始每个值作为一个分箱,计算相邻区间的卡方值,合并卡方值最小的区间,直到终止条件。
原理:卡方检验
卡方检验在分箱中的应用
核心思想:卡方值越小分布越相似。
以“年龄”为待分箱变量,“是否违约”为预测变量为例。
- 为了合并年龄,先对年龄进行排序,再计算每种可能分箱组合的卡方值。
以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=nRT∗CT
- 合并卡方值最小的组合,并继续计算,直到终止条件。
- 终止条件:
分箱数目的限制(一般可以设为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。
注:
- 不一定每个特征都会有合适的分裂节点值;
- 一个特征在同一棵树内可能多次被使用,分裂多次;
- 最后取同一特征在所有树上的分裂值做分桶。
无量纲化
数据规范化
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}
p范数:∣∣X∣∣p=(∣x1∣p+∣x2∣p+...+∣xn∣p)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)=∣∣x1∣∣⋅∣∣x2∣∣x1⋅x2
数据清洗
数据缺失
噪音数据
- 识别噪音将其去除,如孤立点识别;
- 利用其它非噪音数据将其平滑,如数据分箱。
数据不一致
特征选择与特征提取
特征选择
特征选择主要有两个目的:
- 减少特征数量、降维,使模型泛化能力更强,减少过拟合;
- 增强对特征和特征值之间的理解。
特征选择可以分为filter、wrapper、embedded三大类方法:
- Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
- Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
- Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
相关系数法
计算自变量与因变量的相关系数,当相关系数小于阈值时舍弃该变量。
卡方检验法
该方法使用与自变量与因变量均为分类变量的情况,用于检验自变量和因变量有无显著相关性。卡方检验具体方法见上文的“分箱方法-卡方检验”。
Relief算法
Relief算法是一种特征权重算法(Feature weighting algorithms),根据各个特征和类别的相关性赋予特征不同的权重,权重小于某个阈值的特征将被移除。
Relief算法中特征和类别的相关性是基于特征对近距离样本的区分能力。
主要步骤如下:
- 初始化所有特征权重 w i = 0 w_i=0 wi=0,数值属性归一化;
- 从训练集D中随机选择一个样本R,然后从和R同类的样本中寻找最近邻样本H,称为Near Hit,从和R不同类的样本中寻找最近邻样本M,称为NearMiss;
- 更新每个特征的权重:如果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=wi−d(R.A,H.A)+d(R.A,M.A)
- 以上过程重复m次,最后得到各特征的权重,输出大于阈值的特征。
例:
Relief算法的运行时间随着样本的抽样次数m和原始特征个数N的增加线性增加,因而运行效率非常高。
特征提取
PCA算法
通过对原有变量进行线性变换,提取反映事物本质的新变量,同时去除冗余、降低噪音,达到降维目的。
- 给定数据集,包含n个对象,m个属性;
- 中心化数据集:每个属性值减去属性均值,使中心化后的数据均值为0,用 x n × m x_{n×m} xn×m表示;
- 计算协方差矩阵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(xki−Ai)(xkj−Aj);
- 计算协方差矩阵的特征根和特征方程,特征根降序排列为 λ 1 ≥ λ 2 ≥ . . . ≥ λ m ≥ 0 \lambda_1≥\lambda_2≥...≥\lambda_m≥0 λ1≥λ2≥...≥λm≥0,则 λ 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;
- 保留前q个最大特征根及对应的特征向量,构造主成分矩阵P,其第i列向量 p i p_i pi是第i个主成分(即特征向量);
- 计算降维后的矩阵
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。
新的特征是原有特征的线性组合。