数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,使得机器学习模型逼近这个上限。
包括数据准备、特征工程、模型构建、模型调优,其中特征工程是最重要的步骤,需要 70% 甚至以上的工作量。特征工程主要包括数据预处理、特征选择、特征构造、特征降维等。
数据预处理是特征工程的最重要的起始步骤,主要包括数据清洗、特征归一化、离散特征编码、连续特征离散化等。
数据清洗是数据预处理阶段的主要组成部分,主要包括缺失值处理、异常值处理、样本不平衡处理等。
一般来说,未经处理的原始数据中通常会存在缺失值,因此在建模训练之前需要处理好缺失值。
xgboost 模型自带缺失值处理功能,可以不进行缺失值处理。
异常值,即在数据集中存在不合理的值,又称离群点、极值等。可以通过统计分析、箱线图、聚类、3σ 原则、孤立森林等方法进行检查。一般的处理方法如下:
样本不均衡现象是指正样本数目与负样本数目比列相差很大。处理方法如下:
归一化(标准化),就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。其目的一是把不同量纲的东西放在同一量纲下,保正程序运行时收敛加快,大部分模型归一化后收敛速度会加快。但像树模型不受特征归一化影响,所以不需要特征归一化。
归一化处理:最大最小值归一化或者叫 0-1 归一化,取值范围在 [0,1] 处理,max 为样本最大值, min 为样本最小值。
标准化处理:这里只介绍一种经常使用的 z-score 标准化,经过处理后的数据均值为 0,标准差为 1,符合标准的正态分布。其中 mean 为平均值,б 为标准差。
离散特征无法直接使用,需要编码后才能进行相关计算分析。离散特征编码主要有三种方式,独热编码、数值编码、embedding 编码等。
将离散型特征的每一种取值都看成一种状态,若你的这一特征中有 N 个不相同的取值,那么我们就可以将该特征抽象成 N 种不同的状态,one-hot 编码保证了每一个取值只会使得一种状态处于 “激活态”,也就是说这 N 种状态中只有一个状态位值为 1,其他状态位都是 0。主要用于数值之间没有大小数值比较,例如将三种不同颜色 red、blue、yellow 编码,映射到( 1 , 0 , 0 ) 、 ( 0 , 1 , 0 )、( 0 , 0 , 1 ) 的向量空间中,映射后类别之间的距离相等,各个类别在运算时权重相等。
直接将类别 A,B,C … 映射到 1,2,3…,适用于存在大小内在关系的类别特征。例如等级 A>B>C。
embedding 编码适用于类别量太多,如果进行 one-hot 编码太过于稀疏,不利于模型训练,一般通过 embedding 编码进行降维处理,比如 B 端门店、C 端用户等。
在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列 0、1 特征交给模型。像树模型(随机森林、GBDT、Xgboost 等)不需要对连续特征离散化,连续特征离散化主要有用户逻辑回归、神经网络等模型。而 离散方式主要有等频、等距、聚类三种。
等频:取值范围均匀划成 n 等份,每份的间距相等(x);
等距:均匀分为 n 等份,每份内包含的观察点数相同((x,y));
聚类:通过聚类分成不同的区间;
当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:
特征是否发散:如果一个特征不发散,例如方差接近于 0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。
方差代表特征信息量的大小,使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。方差小于某个阈值或者为 0 的特征可以选择舍弃。
Filter 选择法主要有方差分析法、相关系数法、卡方检验法等,用哪种方法取决于特征(X)和标签值(y)的数据类型,是连续还是离散数据。
特征(X)/标签 | y连续 | y离散 |
---|---|---|
X连续 | 相关系数法 | 方差分析法 |
X离散 | 卡方检验法 | 卡方检验法 |
L1 正则项特征选择的原理如下图所示:
但 L1 正则项特征选择在于保留多个对目标值具有同等相关性的特征中的一个,所以没选到的特征不代表不重要。
因为树模型都是基于特征重要性进行分裂的,像随机森林、GBDT、Xgboost 等可以特征选择以及特征重要度输出。
为了提高复杂关系的拟合能力,在特征工程中经常会把一阶离散特征进行两两组合,这样就构成了高阶的组合特征。主要有人工组合、多项式组合、GBDT 特征组合等。
常见的多项式组合有基于多项式的、基于指数函数的、基于对数函数的。4 个特征,度为 2 的多项式转换公式如下:
最初是由 Facebook 在 2014 年提出,并被广泛运用于点击率预估项目上,被证明有效。
动机在于 GBDT 无法直接处理海量的离散特征,复杂度太高,所以主要思路就是先用已有特征训练 GBDT 模型,然后利用 GBDT 模型学习到的树来构造新特征,最后把这些新特征加入原有特征一起训练模型。构造的新特征向量是取值 0/1 的,向量的每个元素对应于 GBDT 模型中树的叶子结点。当一个样本点通过某棵树最终落在这棵树的一个叶子结点上,那么在新特征向量中这个叶子结点对应的元素值为 1,而这棵树的其他叶子结点对应的元素值为 0。新特征向量的长度等于 GBDT 模型里所有树包含的叶子结点数之和。最后的输出一般会接一个 Logistic Regression,事实上就是一种 Stacking 的模型融合方式。如下图所示:
当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于 L1 惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA 和 LDA 有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是 PCA 和 LDA 的映射目标不一样:PCA 是为了让映射后的样本具有最大的发散性;而 LDA 是为了让映射后的样本有最好的分类性能。所以说 PCA 是一种无监督的降维方法,而 LDA 是一种有监督的降维方法。