特征工程与具体场景紧密结合:特征工程是使用专业背景知识(场景/业务)和技巧处理数据,使得 特征能在机器学习算法上发挥更好的作用的过程。
1.数据采集,数据格式化,数据清洗,数据采样
数据采集:思考哪些数据有用,一般要从多个维度思考;
数据格式化:确定存储格式(例:时间你用 年月日 or 时间戳 or 第几天 or …)
数据清洗:去掉脏数据(组合过统计属性判定,补齐可对应的缺省值)
数据采样:很多情况下,正负样本是不均衡的,但大多数模型对正负样本比是敏感的(比如LR),可选择随机采样或分层采样;
正负样本不平衡处理办法:
正样本 >> 负样本,且量都挺大 => downsampling
正样本 >> 负样本,量不大 => a.采集更多的数据; b.上采样/oversampling(比如图像识别中的镜像和旋转); c.修改损失函数loss function
2.特征处理:
数值型数据:
幅度调整/归一化 -------->调整到[0,1]范围内
统计值max, min, mean, std(方差:波动情况)
离散化 -------->pandas库中的cut方法,把连续值带入非线性操作,工业界一般按照频次进行不均匀分类
Hash分桶
每个类别下对应的变量统计值histogram(分布状况)
类别型数据:(大多是文本信息:红蓝绿,圆领V领)
one-hot编码:根据类别,变成n维向量,然后根据所属的类别在相应的位置填上1,其余位置为0;
哑变量 :经过one-hot编码,转化为哑变量;
Hash与聚类处理
小技巧:统计每个类别变量下各个target比例,转成数值型(Histogram映射)
时间型数据:既可以看作连续值,也可以看做离散值
连续值 :a持续时间(单页浏览时长); b间隔时间(上次购买/点击离现在的时间)
离散值: a一天中哪个时间段(hour_0-23); b 一周中星期几(week_monday...); c 一年中哪个星期; d 一年中哪个季度;
e 工作日/周末
文本型数据:
词袋:文本数据预处理后,去掉停用词,剩下的词组成的list, 在词库中的映射稀疏向量。
n-gram:2-gram就是把除了存储每个词,还把两个连续的词连起来存储;
TF-IDF:是一种统计方法,用以评估一字词对于一个文件集或一个语 料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成 反比下降。
TF(t) = (词t在当前文中出现次数) / (t在全部文档中出现次数)
DF(t) = ln(总文档数/ 含t的文档数)
TF-IDF权重 = TF(t) * IDF(t)
word2vec(目前理解不透彻,需后期加强):映射成的向量,不仅仅是0和1,可能存在0.2,0.6等连续值;而且它可以学习到向量之间的关系,像女皇和国王,和男人和女人之间的欧式举例近似相等。
特征处理示例:
(1) 前一天的购物车商品很有可能第二天就被购买 =>规则
(2) 剔除掉在30天里从来不买东西的人 => 数据清洗
(3) 加车N件,只买了一件的,剩余的不会买 => 规则
(4) 购物车购买转化率 =>用户维度统计特征
(5) 商品热度 =>商品维度统计特征
(6) 对不同item点击/收藏/购物车/购买的总计 =>商品维度统计特征
(7) 对不同item点击/收藏/购物车/购买平均每个user的计数 =>用户维 度统计特征
(8) 变热门的品牌/商品 =>商品维度统计特征(差值型)
(9) 最近第1/2/3/7天的行为数与平均行为数的比值 =>用户维度统计 特征(比例型)
(10)商品在类别中的排序 =>商品维度统计特征(次序型)
(11) 商品交互的总人数 =>商品维度统计特征(求和型) 3
(12)商品的购买转化率及转化率与类别平均转化率的比值=>商品维度统 计特征(比例型)
(13)商品行为/同类同行为均值=>商品维度统计特征(比例型)
(14) 最近1/2/3天的行为(按4类统计)=>时间型+用户维度统计特征
(15)最近的交互离现在的时间=>时间型
(16)总交互的天数=>时间型
(17)用户A对品牌B的总购买数/收藏数/购物车数=>用户维度统计特征
(18)用户A对品牌B的点击数的平方 =>用户维度统计特征
(19)用户A对品牌B的购买数的平方=>用户维度统计特征
(20)用户A对品牌B的点击购买比=>用户维度统计特征(比例型)
(21)用户交互本商品前/后,交互的商品数=>时间型+用户维度统计特征
(22)用户前一天最晚的交互行为时间=>时间型
(23)用户购买商品的时间(平均,最早,最晚)=>时间型
特征组合:
简单组合特征:拼接型
user_id&&category: 10001&&女裙 10002&&男士牛仔 user_id&&style: 10001&&蕾丝 10002&&全棉
实际电商点击率预估中: 正负权重,喜欢&&不喜欢某种类型
模型特征组合
用GBDT(迭代决策树)产出特征组合路径,组合特征和原始特征一起放进LR训练
最早Facebook使用的方式,多家互联网公司在用
3.特征选择
原因
冗余:部分特征的相关度太高了,消耗计算性能。
噪声:部分特征是对预测结果有负影响
特征选择 VS 降维
前者只踢掉原本特征里和结果预测关系不大的,后者是做特征的计算组合构成新特征
SVD或者PCA确实也能解决一定的高维度问题
常见的特征选择方式:
过滤形:一个一个特征的看,评估各特征x和y之间的相关度
评估单个特征和结果值之间的相关程度,排序留下Top 相关的特征部分。
Pearson相关系数,互信息,距离相关度
缺点是没有考虑到特征之间的关联作用,可能把有用 的关联特征误踢掉。
常用的数据是scikit-learn包中的SelectKBest和SelectPercentile方法
包裹形:把特征选择看做一个特征子集搜索问题,筛选各种特 征子集,用模型评估效果。
典型的包裹型算法为 “递归特征删除算 法”(recursive feature elimination algorithm)
比如用逻辑回归,怎么做这个事情呢?
① 用全量特征跑一个模型
② 根据线性模型的系数(体现相关性),删掉5-10%的弱特征,观 察准确率/auc的变化
③ 逐步进行(重复2),直至准确率/auc出现大的下滑停止
嵌入型:
根据模型来分析特征的重要性(有别于上面的方式, 是从生产的模型权重等)。
最常见的方式为用正则化方式来做特征选择。
整体思路: