一、前言
数据清洗:
- 不可信的样本去除
- 缺失值极多的字段考虑去除
- 补齐缺失值
数据采样:很多情况下,正负样本是不均衡的,大多数模型对正负样本是敏感的(比如LR)
- 正样本>>负样本,且量都挺大:下采样
- 正样本>>负样本,量不大:
- 采集更多的数据
- oversampling
- 修改损失函数
二、特征处理
sklearn中preprocessing模块经常用来进行特征处理
1、数值型
- 归一化
- 线性函数归一化:
将结果映射到[0,1]区间内,实现对原数据的等比缩放 - 零均值归一化:
将结果映射到均值为0,方差为1的分布上
为什么要对数值型数据做归一化处理?
以梯度下降的优化算法来说明,假设 的取值范围为[0,1], 的取值范围为[0,100],在学习速率相同的情况下, 的更新速度会大于 ,需要较多的迭代才能找到最优解,如果归一化到相同的区间之后,两者的更新速度会变得一致,容易更快的通过梯度找到最优解。
- 对数变化
- 统计值(max,min,mean,std)
pd.value_counts() #类似于group计数
pd.describe() #可以查看mean、min、mean、std等信息
- 离散化
等距切分、等频切分 - 转换成类别型
2、类别型
- 序号编码
- one-hot编码
pd.get_dummies(data['column_name'],prefix='column_name')
- 二进制编码
- 统计每个人类别下各个target比例,转成数值型
- hash与聚类处理
hash技巧类似于LDA中“单词-主题”模型,即把一些特征转换到另一个特征用作统计,“词袋”模型中经常这样处理
3、时间型
时间可以看做连续值,也可以看做离散值,看需要选择
4、文本型
- 词袋模型:将每篇文章看成一袋子词,以词为单位,去掉停用词,剩下的词映射成在词库中的稀疏向量,向量的每一维都是一个词。(忽略词的顺序)
from sklearn feature_extraction.text import CountVectorizer
- n-gram:将连续出现的n个词作为一个独立特征放到向量表中
- tf-idf:直观的解释是,如果一个单词在很多文档中出现,那么我们认为它可能是一个比较通用的词汇,对于区分文档的贡献较小,因此对权重做一定的惩罚
为单词t在文档d中出现的频率, 是文档逆频率
其中, 是文档总数, 是包含单词 的文档个数 - word2vec:一般有两种网络结构,CBOW的目标是根据上下文来预测当前词的概率,而skip-gram是根据当前词来预测上下文出现的概率。
5、统计型
- 加减平均
- 分位线
- 次序型
- 比例
6、组合特征
- 简单组合:拼接两到三个特征
- 模型组合:可以利用决策树的方法来找组合特征,GBDT等
7、高维特征的处理
三、特征选择
原因:
冗余:部分特征相关度太高了
噪声:部分特征对预测结果有负影响
特征选择和特征降维
特征选择只是去掉了原本特征里和结果预测关系不大的特征,做特征的计算组合成新的特征
svd和pca是做了空间转换
1、过滤型
- 评估单个特征和结果值之间的相关程度:pearson相关系数、互信息、距离、相关度、卡方检验、信息增益
- 缺点:没有考虑特征之间的关联
2、包裹型
- 把特征选择看做是一个特征子集搜索问题,筛选各特征子集,用模型评估效果
- 递归特征删除算法:用全量特征跑一遍模型,根据线性模型特征的系数,删掉5%-10%的弱特征观察AUC/准确率的变化,逐步进行,直到准确率/AUC出现大的下滑为止
3、嵌入型
- 根据模型来分析特征的重要性,和包裹型不同的是,包裹型是产生权重,嵌入型是让模型自动选择特征
- 最常见的方式是使用正则化来做特征选择,还有决策树