一 解决问题流程:
o 了解场景和目标
o 了解评估准则
o 认识数据
o 数据预处理(清洗,调权)
o 特征工程
o 模型调参
o 模型状态分析
o 模型融合
二 数据预处理
(1) 数据清洗
a: 不可信的样本丢掉
b: 缺省值极多的字段考虑不用
(2) 数据采样
a:下/上采样
b:保证样本均衡
三 特征工程
1 特征处理
(1) 数值型
(2) 类别型
(3)时间类
(4)文本型
(5)统计型
(6)组合特征
(1) 数值型:处理方式如下
a: 幅度调整/归一化 幅度调整到[0,1]范围内
b: 统计值max, min, mean, std
c: 离散化
d: Hash分桶
e: 每个类别下对应的变量统计值histogram(分布状况)
f: 试试 数值型 => 类别型
(2) 类别型:处理方式如下
a: one-hot编码/ 哑变量 pd.get_dummies()
b: Hash与聚类处理
c: 小技巧:统计每个类别变量下各个target比例,转成数值型
(3)时间类:处理方式如下
既可以看做连续值,也可以看做离散值
连续值
a) 持续时间(单页浏览时长)
b) 间隔时间(上次购买/点击离现在的时间)
离散值
a) 一天中哪个时间段(hour_0-23)
b) 一周中星期几(week_monday...)
c) 一年中哪个星期
d) 一年中哪个季度
e) 工作日/周末
(4)文本型
a: 词袋
文本数据预处理后,去掉停用词,剩下的词组成的list,在词库中的映射稀疏向量。
b: 使用Tf–idf 特征
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成 反比下降。
(5)统计型
a: 加减平均:商品价格高于平均价格多少,用户在某个品类下消费超过平均用户多少,用户连续登录天数超过平均多少...
b: 分位线:商品属于售出商品价格的多少分位线处
c: 次序型:排在第几位
d: 比例类:电商中,好/中/差评比例,你已超过全国百分之…的同学
(6)组合特征
a: 简单组合特征:拼接型
user_id&&category: 10001&&女裙 10002&&男士牛仔
user_id&&style: 10001&&蕾丝 10002&&全棉
b: 模型特征组合
用GBDT产出特征组合路径
组合特征和原始特征一起放进LR训练
最早Facebook使用的方式,多家互联网公司在用
2 特征选择
(1)原因:
冗余:部分特征的相关度太高了,消耗计算性能。
噪声:部分特征是对预测结果有负影响
(2)特征选择 VS 降维
前者只踢掉原本特征里和结果预测关系不大的,后者做特征的计算组合构成新特征.
SVD或者PCA确实也能解决一定的高维度问题
(3)常见特征选择方式
过滤型、包裹型、嵌入型
a: 过滤型
评估单个特征和结果值之间的相关程度,排序留下Top相关的特征部分。
Pearson相关系数,互信息,距离相关度
缺点:没有考虑到特征之间的关联作用,可能把有用的关联特征误踢掉。
b:包裹型
把特征选择看做一个特征子集搜索问题,筛选各种特征子集,用模型评估效果。
典型的包裹型算法为 “递归特征删除算法”(recursive feature elimination algorithm)
比如用逻辑回归,怎么做这个事情呢?
① 用全量特征跑一个模型
② 根据线性模型的系数(体现相关性),删掉5-10%的弱特征,观察准确率/auc的变化
③ 逐步进行,直至准确率/auc出现大的下滑停止
c:嵌入型
根据模型来分析特征的重要性(有别于上面的方式,是从生产的模型权重等)。
最常见的方式为用正则化方式来做特征选择。
举个例子,最早在电商用LR做CTR预估,在3-5亿维的系数特征上用L1正则化的LR模型。剩余2-3千万的feature,意味着其它的feature重要度不够。