工作中常用的特征工程有哪些方法呢?首先,我们需要了解业务中的模型会遇到什么问题,定位了问题才能找到贴合业务场景的特征工程方法。这比你会一些处理特征的骚操作重要很多,毕竟模型落地不是在打比赛,某个评价指标提高一点点就行,需要考虑的方面更多,比如变量的可解释性、模型的可解释性、模型的部署和监控等等。
下面是我们在业务中的模型中会遇到的问题:
- 模型效果不好
- 训练集效果好,跨时间测试效果不好
- 跨时间测试效果也好,上线之后效果不好(一定是变量逻辑出问题,特征出现穿越)
- 上线之后效果还好,几周之后分数分布开始下滑(有一两个变量跨时间测试不好)
- 一两个月内都比较稳定,突然分数分布骤降(关注外部环境)
- 没有明显问题,但模型每个月逐步失效(无解)
以上问题是建模的核心,个人觉得比高大上的算法重要得多,可以针对这些问题多深入思考原因。然后我们来考虑一下业务所需要的变量是什么。
- 变量必须对模型有贡献,也就是说必须能对客群加以区分
- 逻辑回归要求变量之间线性无关
- 逻辑回归评分卡也希望变量呈现单调趋势 (有一部分也是业务原因,但从模型角度来看,单调变量未必一定比有转折的变量好)
- 客群在每个变量上的分布稳定,分布迁移无可避免,但不能波动太大
import pandas as pd
import numpy as np
df_train = pd.read_csv('train.csv')
df_train.head()
#数据集为kaggle上的Titanic数据集。
变量重要性
- IV值
- 卡方检验
- 模型筛选
这里我们使用IV值或者模型筛选多一点(一般一种方法就行,差别不大)
分箱、WOE、IV
import numpy as np
import pandas as pd
from scipy import stats
def mono_bin(Y,X,n=20):
r=0
good = Y.sum()
bad = Y.count()-good
while np.abs(r)< 1:
d1=pd.DataFrame({
"X":X,"Y":Y,"Bucket":pd.qcut(X,n)})
d2=d1.groupby('Bucket',as_index=True)
r,p=stats.spearmanr(d2.mean().X,d2.mean().Y)