特征工程与建模
特征工程介绍
特征工程的作用
基于数据分析与探索提起潜在有价值的特征
- 特征的重要性:
如果特征构建越好,模型的性能会越出色,简单且灵活性强
特征提取
-
特征提取:
多数是采用统计手段分析,找到业务相关的点,最终形成特征 -
例子1:箱型图分析,交易量与星期有关,最终得到7个0-1类型的特征(是否为周一、周二…)
-
例子2:点线图分析,用户星级、用户职业与是否交易有关,可考虑离散化特征
离散型特征的好处
- 可用于设计规则
- 易于模型拟合,特别是以树模型为baseline
- 便于理解
- 容易做特征组合
特征组合
-
简单的特征组合方式:
加减乘除、log、exp等,可以产生大量特征,但容易出现过拟合且不易于解释 -
根据任务背景,发掘一些特定的特征
时序问题,常见特征包括最大最小值,中位数,偏度峰度,历史同期的排名,分位数等。
推荐系统,常见特征类别包括用户特征,商品特征,行为特征等
特征处理
筛选(劣汰)
生成了大量特征,开始选择较好的特征子集,筛选规则为剔除几乎无关特征,保留大量特征,处理自变量的共线性,若两个自变量存在共线性,可以构造保有各自特性和共性的新的特征
把筛选过后的特征子集留下,通过特征重要性评估方法,进一步挑选良好的特征去组成最优子集
特征重要性方法(优胜)
-
Mean Variance Test
独立性检验,探究变量之间的关系是否独立 -
SHAP(SHapley Additive exPlanations)
解释任意机器学习模型的输出
-
Permutation Importance
实战特征工程
1. 提取(是/否)类型特征
- 是否为周一、周二…周日
- 节假日相关的特征——是否为节假日、节假日后第一天、节假日最后一天
- 与月初、月末相关的特征
2. 用箱型图观察(是/否)类型特征
- 可以发现一些明显比较差的特征
- 例如:样本量的严重不平衡,取值差异不大
3. 利用相关性分析(是/否)类型特征
- 申购总额与is_weekend负相关
- 申购总额与is_work正相关
- 筛选一些弱相关的特征
4. 对特殊日期提取相关距离特征(节假日、月初、月末)
- 距放假的天数、距上班的天数
- 距月初天数、距星期日天数
5. 基于点线图分析距离特征
6. 基于相关性分析距离特征
7. 距波峰、波谷的天数
- 以星期为周期确定波峰、波谷
- 观察申购总额时序图
- 观察点线图
8. 添加周期因子
- 星期周期因子
- 月份周期因子
- 观察周期因子与目标变量的相关性
9. 添加时序特征
- 以星期为周期统计目标变量的均值、中位数、偏度等统计值的相关性
10. 观察所有特征的分布
11. 使用MVtest判断特征与因变量是否存在非线性关联
处理自变量间复共线性
12. 分析特征重要性
使用SHAP、Permutation Importance。
对两种方法的排序列表拿 TOP K 取交集
模型训练与验证
训练、预测、线下验证
数据集划分
有时序的数据集需要考虑时序,nested交叉验证划分。
常用回归模型
-
线性回归(多元回归)
采用OLS或gradient descent估计参数
变量较多可考虑使用lasso惩罚项 -
决策树回归
变量选择条件:为每个变量选择切分点,在分裂后依据相对应分支内所有样本的因变量均值
评估拟合误差:贪心策略(对变量条件的满足程度)、CART -
随机森林回归
Bagging,随机选取样本与特征
树模型做baline
并行集成策略
取所有树的均值 -
梯度提升树回归
boosting,依据估计误差调整样本权重
决策树做baseline
串行集成策略
gradient boosting tree
xgb、lgb,catboost
模型融合
- 主要策略
- 加权
- Stacking:交叉验证
- Blending:简单划分数据集,等同于只做stacking的一折
- 时序方法
- 模型平均(类似于加权集成策略)
常用代码:
## 提取节假日
#### 准备一个Set,把所有节日放进去
holiday_set = set()
holiday_set = holiday_set | {datetime.date(2014,4,5), datetime.date(2014,4,6), datetime.date(2014,4,7)}# 清明节
holiday_set = holiday_set | {datetime.date(2014,5,31), datetime.date(2014,6,1), datetime.date(2014,6,2)}# 端午节
## 设置是否为周末
total_balance['is_weekend'] = 0
total_balance.loc[total_balance['weekday'].isin((5,6)), 'is_weekend'] = 1
先提取大量统计特征,然后开始看分布,看相关性去筛选。
然后建立另一种类型的特征,重复筛选的操作