5.特征工程
一、前言
1.数据与特征处理方法
(1)数据选择/清洗/采样
(2)数值型/类别型/日期型/文本型特征处理
(3)组合特征处理
2.特征选择方法
Filter/Wrapper/Embedded三种特征选择方式
3.特征工程定义
特征=>数据中抽取出来的对结果预测有用的信息。
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
4.意义
更好的特征意味着用简单的模型得到更强的灵活度,更好的结果。
二、数据与特征处理
1.数据采集
(1)哪些数据对最后的结果预测有帮助?
(2)数据我们能够采集到吗?
(3)线上实时计算的时候获取是否快捷?
工作:思考哪些数据有用
2.数据格式化
(1)确定存储格式
例如,时间用 年月日 或者 时间戳 或者 第几天 等等
(2)大多数情况下需要关联非常多的hive表(类似MySQL)和hdfs文件夹
3.数据清洗
目的是去掉脏数据。要求数据合适。
实际这个过程会花掉一大部分时间,而且它会使得你对于业务的理解非常透彻。
例如:
(1)简单的不可能事件。如,一个人一个月买脸盆花了10w。
(2)组合或统计属性判断。如,号称在美国但是IP一直都是大陆的新闻阅读用户。
(3)补齐可对应的缺省值。不可信的样本去掉,缺省值几多的字段考虑不用。
4.数据采样
很多情况下,正负样本是不均衡的。大多数模型对正负样本比是敏感的(比如LR)。
可采用的方法:随机采样和分层采样。
5.正负样本不平衡的处理办法
(1)正样本>>负样本,且量都挺大=>downsampling 下采样
(2)正样本>>负样本,量不大=> 1)采集更多的数据
2)上采样/oversampling(比如图像识别中的镜像和旋转)
3)修改损失函数/loss function
6.特征处理
数据分类:数值型、类别型、时间类、文本类、统计型、组合特征
特征处理之数值型:
- 幅度调整/归一化
- 统计值max,min,mean,std(方差)
用python一个模块pd,series序列化
- 离散化
能给连续值赋予非线性的操作。
将数据分段,分多少段就是多少维,数据落在哪个区段,对应值取一,其余为零。
cut 可以帮助得到数据段
- Hash分桶
- 每个类别下对应的变量统计值histogram(分布状况)
- 试试 数值型 => 类别型
特征分类之类别型:
- one-hot编码
把所有值统计一下看看有多少变量,有多少变量就是多少维。
- 哑变量(one-hot编码 编码完以后的)
- Hash与聚类处理
- 小技巧:统计每个变量下各个target比例,转成数值型
特征处理之时间型:
既可以看作连续值,也可以看作离散值
- 连续值
持续时间(单页浏览时长)
间隔时间(上次购买/点击离现在的时间)
- 离散值
一天中哪几个时间段
一周中星期几
一年中哪个星期
一年中哪个季度
工作日/周末
特征处理之文本型:
- 词袋
文本数据预处理后,去掉停用词,剩下的词组成的list,在词库中的映射稀疏向量
改进
- 使用TF-IDF特征
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着他在语料库中出现的频率成反比下降。
TF:TF(t)=(词t在当前文中出现次数)/(t在全部文档中出现次数)
IDF:IDF(t)=ln(总文档数/含t的文档数)
IF-IDF权重=IF(t)*IDF(t)
- 词袋=>word2vec
特征处理之统计特征:
- 加减平均
- 分位线
- 次序型
- 比例类
特征处理之组合特征:
- 简单组合特征:拼接型
- 模型特征组合
三、特征选择
1.原因
冗余:部分特征的相关度太高了,消耗计算性能。
噪声:部分特征是对预测结果有负影响。
2.特征选择 VS 降维
3.常见特征选择方式
- 过滤型(一个一个维度和y对比评估)
selectkbest 在变量x中,不管向量是多少维的,每一维和y对比,找到指定的k个相关度最高的返回。
selectpercentile 返回的是比例,预留多少就会经过评估后留下多少特征。
- 包裹型(选一部分特征子集,用模型评估)
- 嵌入型