数据预处理
原始数据存在一些问题,影响模型训练,基于以下原因(措施)进行数据处理:
1、不完整(需要补全)
2、量纲不统一(需要归一化)
3、特征太过于原始(需要者转换或者多个特征组合)
4、单个离散特征(需要one-hot等编码)
5、含噪声(需要删除)
6、类别分布不均衡(需要采样)等问题。
sklearn中的方法:
sklearn.preprocessing
特征缩放
Feature scaling。
特征缩放适用于连续型变量,用来统一不同特征之间的量纲。
注意,机器学习数据中的连续变量特征往往符合正态分布,并且特征缩放往往都符合线性变换,不会改变原始数据的排位顺序。
使用场景:
1、连续特征变量
2、回归模型中,不同特征缩放后,对应的回归系数具有可比性
3、距离计算模型中,不同维度量纲统一,不会出现过度依赖量纲较大的特征。比如KNN,K-Means使用欧式距离
4、梯度优化中,特征间均衡的量纲可以让梯度下降更加平滑,收敛速度更快,训练效率更高
两种方式:
一、归一化
英文Normalization。
二、标准化
英文Standardization。
类别 | 方法 | 公式 | 变化后数值范围 | 改变数据分布 | 其它 |
---|---|---|---|---|---|
归一化 | 归一化(min-max normalization) | (x-min)/(max-min) | [0,1] | 是 | |
归一化 | 均值归一化(Mean normalization) | (x-mean)/(max-min) | [-1,1] | 是 | |
标准化 | standardization | (x-mean)/ std | 没有范围 | 否 | 变换后均值是0,标准差为1 |
中心化 | 中心化 | x-mean | 没有范围 | 否 |
特征二值化
特征二值化的方法是将特征的取值转化为0或1。
大于某个阈值设置为1,小于等于某个阈值设置为0。
one-hot编码
对于离散特征,例如,性别:{男,女},可以采用one-hot编码的方式将类别特征表示为一个m维向量,其中m为特征的取值个数。
使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。
优点如下,可以让距离计算更加有区分性,解决了模型处理离散数据困难的问题;还可以更方便的做进一步的特征组合。
缺点是当类别的数量很多时,特征空间会变得非常大,成为一个高维稀疏矩阵。
embedding编码
embedding可以对共同出现的类别特征/ID特征进行向量表示。
embedding其实是基于CBOW的,使用周围词与中心词进行建模,对所有周为此与中心词进行概率最大化,求出每个词的向量表示。
一条样本中不同类别特征的共同出现可以类比于一条有顺序的文本,可以求出每个特征下每个值的向量表示。
关于类别的embedding,一般比较常用的是item2vec的思路,就是用word2vec来处理多值离散特征。
需要注意的是,只有类别之间存在关联性,比如特征A的类别是男,女;特征B的类别是包包,鞋子,剃须刀,特征A与特征B存在共现的情况就可以取使用word2vec的思路来做自监督的embedding。
缺失值处理
可以使用直接删除、使用相应特征的平均数、中位数、众数来补全、模型预测填充等方式来处理缺失值
数据变换
数据变换包括构造特征项和通过函数转换特征。
sklearn中通过PolynomialFeatures来构造特征,使用FunctionTransformer来得到特征的新结果。
举例:长宽可以组合成面积
样本不均衡处理
样本不均衡指的是数据集中的正样本数量与负样本数量的比例失衡。
采样方法
理想情况下,我们希望采样的样本能反应实际的数据空间分布。所以可以通过对多数类进行聚类,然后挑选中心。- 下采样(或欠采样,under-sampling)
- 上采样(或过采样,over-sampling)
- 混合采样
数据增强
- 收集更多的数据
- 造数据
- 更改评价指标
- cost sensitive(代价敏感,class weight)
模型集成
模型集成也分为两种- 单纯的集成方法,比如adboost、gbdt、random forest等;利用树模型对不均衡数据不敏感的性质
- 通过数据采样来造成训练样本差异。先采样再使用模型集成
- one-class classifier
异常检查算法,尽量学得目标类别的边界。
样本不均衡处理总结:除了采样方法和数据增强外的方法,已经超出数据预处理的范围,我们了解下就好。
数据分桶
又叫数据分箱。
数据分桶是对连续特征数据根据经验或者规则分成几个区间。
在实际工业中,标签y与特征x之间较少存在线性关系,而往往是分段的。
比如:历史曝光次数与点击率的关系往往不是线性的,曝光2次左右是最好的,多了用户会烦,少了引不起用户注意。
等宽分箱
把数据按照相等宽度的数据边界进行划分,已知原始数据和分箱个数n_bins,特点是每个箱子的数据边界宽度一样,但是每个箱子的数据量不均匀。
步骤:
找出最大值,最小值;
确定箱子宽度,width = (max-min)/n_bins;
确定箱子起始边缘, [(min, min+width),...(max-width, max)];
把数据按照边缘划分放入不同的桶。
等频分箱
把数据按照相同的数据量分箱,特点是每个箱子的数据量是均匀的,但是每个箱子数据边界的宽度是不相同的。
步骤:
把数据从小到大排序;
确定数据总量N,每个箱子的数据量N/n_bins;
确定边界,依次找到n_bins个分位数,注意每个分位数不能相同,相同导致相邻箱子的数据大小会有重叠。
把数据按照边缘划分放入不同的桶。
WOE IV评价分箱效果
$参考^{[10]}$
WOE(Weight Of Evidence),即证据权重。
IV Information Value,即信息价值。
IV还可以用来评价分类特征对标签的区分能力。
原理:
通过以下公式的转换可以发现,WOE和IV的本质是使用了局部比值与总体比值的差异。
i类数据(分箱)分数段下坏用户和好用户的比值与好用户总数与坏用户总数比值的差异:
IV值越大表示差异越大,表示区分能力越强,该分箱越好。
特征选择
原因:
维度灾难:当特征维度超过一定界限后,分类器的性能随着特征维度的增加反而下降。
精简数据和模型复杂度。
过程:
去除特征中的无关特征和冗余特征,原始特征集-(无关特征+冗余特征) = 最优特征子集。
原始特征集合->搜索策略(subset search)->最优特征子集->子集评估(subset evaluation)->是否停止->继续搜索。
特征筛选方法
过滤法与包装法的区别在于是否有学习器的参与。
过滤法使用在学习器训练之前,对特征进行筛选,就像一个漏斗,所以称为过滤法。
过滤法(Filter)
这类方法先对数据集进行特征选择,然后再训练学习器,特征选择的过程与后续学习器无关。
移除低方差的特征
对于方差小于某个阈值的列直接舍弃。
sklearn中的方法:
sklearn.feature_selection.VarianceThreshold(threshold)
threshold参数是方差的具体值
单变量特征选择
该方法基于单变量的统计来选择最佳特征,常用的是统计单变量与标签的关系。
常用方法如下:
(1)交叉熵,(2)Information Gain,(3)Odds ratio,(4)互信息,(5)KL散度(相对熵)
sklearn中的方法:
X_new =sklearn.feature_selection.SelectKBest(score_func, k=2).fit_transform(X, y)
score_func参数表示使用的分数评估函数。
k表示选取2个得分最高的特征。
不同方法适用的场景(todo):
数值与数值
数值与类别
类别与类别
包装法(wrapper)
这类方法用学习器的整体性能作为特征子集的评价准则。
多个学习器实例对比单个特征对学习器整体性能的影响,从而实现不同特征之间的重要性差距的对比。
(RFE)递归式特征消除
过程:
1、给定一个外部的估计器,该估计对特征赋予一定的权重。
2、从当前的特征集合中移除最不重要的特征。在特征集合上不断的重复递归这个步骤,直到最终达到所需要的特征数量为止。
sklearn方法:
sklearn.feature_selection.RFE(estimator, n_features_to_select, step=1)).fit(X, y)
estimator:估计函数,估计函数通过coef_
属性或者 feature_importances_
属性来提供feature重要性的信息。
n_features_to_select:保留的特征数量
step:迭代过程中每次移除的属性的数量或比例(小数)
嵌入法(embbedding)
先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。
树类模型和神经网络模型属于此类,相比于包装法用多个模型实例的整体性能来对比评价某一个特征,嵌入法则是用一个模型实例内的“权重参数”来评价特征之间的重要性差距。
对应sklearn中的方法:
sklearn.feature_selection.SelectFromModel(estimator,threshold=None,prefit=False)
estimator参数是一个评估器,评估器需要带有coef_
(系数,逻辑回归有该属性) 或者 feature_importances_
(重要度,基于树的模型有该属性)属性。可以是随机森林等评估器。
threshold是特征权重的阈值,属性值低于该阈值,这些特征将会被认为不重要并且移除掉。
feature_importances_ 属性如何得来的?
树模型中基于特征对数据的区分能力(信息增益、KL散度、GINI等),区分能力越高,该特征对应的feature_importances_值越大。
推荐系统特有的一些问题
ID特征
类别特征one-hot之后可以扩展维度,ID特征对维度的扩展更是如此。
比如把某一列是用户ID的数据500条作为特征进行one-hot可以扩展出500维的特征。
推荐、搜索中大量用到的是稀疏的类别/ID类特征。
大公司说的几亿特征大多就是ID类型的特征,加入ID类型的特征考虑到用户或者物品的个性化。
LR是非常适合使用ID类特征的,原因在于LR适合接受超高维的特征输入。
对NN模型来说,需要通过Embedding的方式进行使用。
ID类特征容易过拟合,训练的过程中一定要通过正则的方法来限制。L1正则,稀疏一下,真正进模型有权重的id并不会很多。
数据不均衡问题
需要采样可以根据实际模型的效果来看。
大数据量问题
可以先分析一部分数据,而不是全量数据,以提高数据预处理和特征选择阶段的效率。
参考
离散化
https://www.imooc.com/article/36392
数据预处理:独热编码(One-Hot Encoding)和 LabelEncoder标签编码(离散化与one-hot)
特征组合&特征交叉 \(Feature Crosses\)
机器学习之特征选择方法
3(1).特征选择---过滤法(特征相关性分析)
机器学习之特征选择方法
样本类别不均衡处理
数据预处理与特征选择
ID类特征使用小结
关于categorical embedding
【10】WOE-IV
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。