(一)

特征工程需要根据实际的业务场景进行处理

---数据与特征处理

1. 数据选择/清洗/采样

2. 数值型/类别型/日期型/文本型特征处理

3. 组合特征处理

---特征选择

1. Filter/Wrapper/Embedded 三种特征选择方式及开发包/案例

特征:数据中抽取出来的对结果预测有用的信息

特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程

 

意义:

      更好的特征意味着更强的灵活度

     更好的特征意味着只需要用简单的模型

     更好的特征意味着更好的结果

真正在互联网公司进行开发的人,在做

     1. 跑数据,各种map-reduce,hive SQL,数据仓库搬砖

     2. 数据清洗

     3. 分析业务,分析case,找特征

     4. 应用在常见的机器学习算法上  

特征工程在特征工业界的作用

能够有效提高AUC

更高效的特征,能够获得更精准的结果

---1. 数据采集(思考哪些数据对最后的预测结果有帮助)

举例:现在要做预测用户对商品下单情况,或者做商品推荐,那么我们需要采集什么信息?

从三个维度:商家的,商品的,用户的

商家(商家评分,评论数据:发货速度,开业时间,服务态度)

商品(购买量、点击量、加入购物车、商品固有属性)

用户(历史性:以前购买最高价,最低价、喜欢什么材质、消费能力

上下文信息:停留时间)

----2. 数据格式化

  确定存储格式

  1. 按时间存储(年月日、时间戳、第几天)

   2. 单个动作记录/一天行为集合

大多数情况需要关联很多的hive表和hdfs文件夹,所以要用到很多的map-reduce

----3. 数据清洗

   去掉脏数据

举例:

简单:身高高于3米+ | 一个月买脸盆墩布买了10w的人 | 5,6w买发卡

组合或者统计属性判定:

1)号称在米国却ip一直都是大陆的新闻阅读用户

2)判定一个人是否会买篮球鞋,样本中女性用户占比85%

补齐可对应的缺省值

1)不可信样本丢掉,缺省值极多的字段考虑不用(比如contry,contrycode)

---4. 数据采样

   很多情况下,正负样本是不均衡的

     1)电商的用户点/买过的商品和没有行为的商品

      2)某些疾病的患者和健康人

   大多数的模型对正负样本的比例是敏感的(比如LR)

   随机采样和分层抽样

正负样本不平衡的处理办法

1. 正样本>>负样本,且量都很大 -->downSampling(下采样,从正样本中抽取和负样本差不多1:1的情况)

2. 正样本 >>负样本,量不大

    1)采集更多数据

    2) 上采样/oversampling(比如图像识别中的镜像和旋转)造一些负样本

    3) 修改损失函数(给负样本大一些权重)


 

(二)

 

特征处理:

   1. 数值型

   2. 类别型

   3. 时间类

   4. 文本型

   5. 统计型

   6. 组合特征

---1. 数值型

--------幅度调整/归一化(年龄、销售量)

--------统计值max、min、mean、std(波动情况,方差)(最高最低消费---消费能力)

--------离散化(price分段  pd.cut)柱状分布 | 直方图统计 | 不一定均匀切分| 可能在密度高的地方进行频次 切分

--------Hash分桶

--------每个类别下对应的变量统计值histogram(分布状况)

---------数值型-->类别型

python-pandas数据处理包

---2. 类别型

-----1. one-hot编码 

------2. 哑编码

------3. Hash与聚类处理

小技巧:统计每个类别变量下各个target比例,转成数值型

histogram映射

比如第一个特征性别,首先看target(爱好)的取值空间{足球、散步、看电视剧},总共有三个男生,有两个喜欢足球

 足球  散步 看电视剧

男[2/3,1/3,0] 意义:有这么一个群体叫做男,有2/3喜欢足球,有1/3喜欢散步,没有人喜欢看电视剧。【可以看作自己添加的维度】

好处:把target和特征的后验概率联系起来

---3.时间型(电商里用的频繁)

时间型既可以看作是连续值也可以看作是离散值

------1)连续值:持续时间(单页浏览时长->喜好程度,购买倾向性)间隔时间(上次购买/点击离现在的时间->消耗品)

------2)离散值(离散化->找完备集):a)按小时时间段(hour_0-23)

                              b)一周中天数(星期一、星期二)

                              c)一年哪几个星期

                              d)工作日/周末

举例:预测哪一个顾客会成为常客(用途根据不同的顾客划分,给予不同的优惠)

顾客购买记录

对于时间戳特征:除了能够拿到年月日(连续值),还能根据日历(一些离散值)判断出星期几,是一年当中的第几个星期(和季节有关),一天当中的第几个小时(早中晚(与外卖相关))

年月日-->节假日和购物的关系,用户的节假日喜好(造出离双十一还有多少天、节假日过去了多少天)全靠脑洞

购物的话平时和周末有差别

----4. 文本型

 -- 词袋

文本数据预处理后,去掉停用词,剩下的次组成的list在词库中的映射稀疏向量

词袋


hash技巧--bucket{领域词集}

比如bucket1=体育,bucket2=医学

将不同的语句在不同领域背景下转换成向量

----把词袋扩充成n-gram

原因-->顺序无关

举例:无法区别“我讨厌你”,“你讨厌我”

2-gram["我讨厌",“讨厌你”,“你讨厌”,“讨厌我”]

区分就变强了

------统计方法TF-idf特征

给每个词编码一个权重,用于评估某个语料集某个词的重要程度。字词的重要性会随着它在文件中出现的次数正比增长(特征),但是会随着在语料中出现的频率成反比下降(普适)

 

-----深度学习:词袋-->word2vec

向量不再是0-1,而是连续值(表示不同词之间的关系)

比如(国王--女王)(男人--女人)两个向量对之间的关系是近似的

再比如(柏林--德国)(东京--日本)那么柏林到德国的距离和东京到日本的距离是相当的

------5. 统计特征(与业务贴合很高)

历届的kaggle/天池比赛,天猫/京东排序和推荐业务线里模型用到的特征

---加减平均:商品价格高于平均价格多少,用户在某个品类下消费超过平均用户多少?用户连续登陆天数超过平均多少

---分位线: 商品属于售出商品价格的多少分位线处

----次序型:排位

---比例类:电商中,好/中/差评的比例

                  你已超过全国百分之...的同学

举例:天池大数据之移动推荐算法大赛

 

特征处理举例

1)前一天的购物商品很有可能第二天就被购买==>规则

2)剔除掉在30天里从来不买东西的人  ==>数据清洗

3) 加车N件,只买了一件的,剩余的不会买 ==>规则

4)购物车购买的转化率 ==>用户维度统计特征

5)  商品热度  ==> 商品维度统计特征

6) 对不同的item点击/收藏/购物车/购买的总计 ==>商品维度统计

7) 对不同item点击/收藏/购物车/购买平均每个user的计数 ==> 用户维度统计

8) 变热门的品牌/商品 ==> 商品维度统计特征(差值型)

9)最近1/2/3/7天的行为数与平均行为数的比值 ==>用户维度统计特征(比例型)

10)商品在类别中的排序 ==>商品统计特征(次序型)

11)商品交互的总人数 ==>商品维度统计特征(求和)

12) 商品的购买转化率及转化率与类别平均转化率的比值=>商品维度统

计特征(比例型)

(13) 商品行为/同类同行为均值=>商品维度统计特征(比例型)

(14) 最近1/2/3天的行为(按4类统计)=>时间型+用户维度统计特征

(15) 最近的交互离现在的时间=>时间型

(16) 总交互的天数=>时间型

(17) 用户A对品牌B的总购买数/收藏数/购物车数=>用户维度统计特征

(18) 用户A对品牌B的点击数的平方 =>用户维度统计特征

(19) 用户A对品牌B的购买数的平方=>用户维度统计特征

(20) 用户A对品牌B的点击购买比=>用户维度统计特征(比例型)

(21) 用户交互本商品前/后,交互的商品数=>时间型+用户维度统计特征

(22) 用户前一天最晚的交互行为时间=>时间型

(23) 用户购买商品的时间(平均,最早,最晚)=>时间型

----6. 组合特征

 ----简单组合特征:拼接型 10002(用户id)&& 男士牛仔

实际电商点击率预估中:

正负权重,喜欢&&不喜欢某种类型

---模型组合特征

1. 用GBDT产出特征组合路径

2. 组合特征和原始特征一起放进LR训练

3. 最早facebook使用的方式,多家互联网公司在用



(三)

 

为什么要进行特征选择?

原因:

1)冗余:部分特征的相关度太高了,消耗计算性能

2)噪声:部分特征对预测结果有负影响

 

--  特征选择  VS  降维

1. 前者只踢掉原本特征里和结果预测关系不大的,后者做特征的计算组合构成新特征

2. SVD或者PCA确实也能解决一些高维度问题

 

---常见的特征选择

------过滤型

评估单个特征和结果之间的相关程度,留下top相关的特征部分

Pearson相关系数、互信息、距离相关度量

缺点:没有考虑到特征之间的相互关联作用,可能把有用的关联特征误踢掉

sklearn-->selectKBest-->selectPercentile

 

----常见的特征选择方式--包裹型【适合线性模型】

1. 把特征看作一个特征子集搜索的过程,筛选各种特征子集,用模型评估效果

2. 典型的包裹型“递归特征删除算法”RFE

1)用全量特征跑一个模型

2)根据线性模型的系数(体现相关性),删除掉5-10%的弱特征,观察准确率/AUC的变化【用逻辑回归算theta,剔除掉theta小的特征】

3)逐步进行,直到AUC出现大的下滑停止

3. 如果是用LR呢?

 

----一般先做特征工程,再做特征选择

------常见的特征选择--嵌入型

1)根据模型来分析特征的重要性(有别于上面的方式,是从生产的模型权重等)

2)最常见的方式是用正则化来做特征选择

3)举个栗子,最早在电商用LR做CTR预估,在3亿-5亿维的系数特征上用L1正则化的LR模型,剩余2-3千万的feature,意味着其他的feature重要度不够

L1正则化是截断性效益

L2正则化是缩段性效益

线性模型的话可以用SelectFromModel

lsvc = LinearSVC(c=0.01,penalty="L1",dual=False).fit(X,y)