前言
上一篇文章讲述了原始特征分析和处理,保障后续拿到的是干净的特征变量,但实际这些特征对于建模不一定是有效的,所以需要在原始特征的基础上,结合业务场景做特征变量的衍生,提升数据的表达能力。此外,因为特征值的维度、分布、量纲等,真正进入模型训练还需要对特征做对应的变换处理。
特征构建
统计特征构建
参照pandas提供的titanic救生数据,筛选里面有特征变量
survived | pclass | sex | age | sibsp | parch | fare | embarked | class | who | adult_male | alone |
存活 | 票等级 | 性别 | 年龄 | 同行子女/配偶 | 同行父母 | 票价 | 登船港口 | 社会阶层 | 乘客类型 | 是否成年 | 是否独自 |
其中,年龄对应的人群获救概率不同,所以可以对年龄做衍生。按照年龄,将其分为child/yong/middle/old4个等级。
def age_bin(x): if x<=18: return 'child' elif x <=30: return 'yong' elif x<=45: return 'mid' else: return 'old' # 增加age_bin特征 dt['age_bin'] = dt['age'].map(age_bin)# 按照家庭维度,可以衍生家庭规模大小特征
dt['family_size'] = dt['sibsp'] +dt['parch'] + 1 print(dt['family_size'].head())
周期值构建
数据有时间维度的,可以结合业务抽取出新特征。比如,用户的电商消费数据,每个时间点是一行记录,可以抽取出仅一周消费频次、近一月消费频次等;
数据分桶
数据分桶通常是对连续性特征的处理方式,常见的分桶有
- 等频分箱:数据平均分成几份
- 等距分箱:数据按照最小值和最大值间距等分
- 自定义分箱:结合业务场景自定义分箱规则
- 卡方/Best-KS分桶: 这种方法侧重于发现目标分类变量和连续变量之间的关系,适用于分类问题中的特征工程。
- 最小熵法分桶:最小熵法的目标是找到一种分箱方式,使得每个桶内的数据分布熵之和最小.适用于追求数据纯净度的场景.
对船票数据分析:
看到数据有很强的长尾效应,如果采用等距切分,容易出现分桶数据不均匀,所以采用等频切分。
# 设定分桶数量,拿到分桶值
data_cut, bins = pd.qcut(dt['fare'], 10, retbins=True)
# 查看桶内样本数量
data_cut.value_count()
# 定义函数,做分桶变量替换
def fare_cut(x): if x <= 7.854: return 0 elif x<= 10.5: return 1 elif x <= 21.679: return 2 elif x<= 39.688: return 3 else: return 4; dt['fare_bin'] = dt['fare'].map(fare_cut)
特征组合
常用的特征组合有:
- 离线+离散:构建笛卡尔积
- 离线+连续:连续特征分桶后基于类别特征group by构建统计特征
- 连续+连续:加减乘除,多项式特征,二阶差分等。
- 多项式特征:针对连续值特征,对几个特征构建多项式特征,以达到特征组合与高阶增强的作用。于一些需要非线性关系建模的问题非常有用。
poly = PolynomialFeatures(degree=2) # 指定二次多项式
X_poly = poly.fit_transform(X)
print("Transformed features:\n", X_poly)
特征自动构建工具Featuretools
一般情况下,不会滥用这个工具。
特征变换
连续特征变换
标准化处理(随机变量)
标准化处理是指将特征数值转换成算数平均为0,方差(以及标准差)为1的分布。
from sklearn.preprocessing import StandardScaler X = np.array([[1], [2], [3], [4], [5]]) scaler = StandardScaler() X_scaled = scaler.fit_transform(X)
归一化处理(尺度缩放)
归一化处理是基于向量模长调整数据幅度大小,但并不会改变原始数据的顺序。归一化处理后可以加快梯度下降寻找最优解的速度,可以提升模型的精度,同时也使得特征之间具有可比性。注意:归一化后会损失掉特征的一些信息,根据代价来评估选择;
L2范数归一化: