数据和特征决定了 机器学习 的上限,而模型和算法只是无限逼近这个上限而已。
基于大量数据的简单模型胜于基于少量数据的复杂模型;更多的数据胜于聪明的算法,而好的数据胜于多的数据。
概念 从数学角度讲,特征工程就是将原始数据空间变换到新的特征空间,或者说是换一种数据的表达方式,在新的特征空间中,模型能够更好地学习数据的规律。
要想获得好的数据特征,==第一步要理解业务数据、业务逻辑以及模型特点==。
特征提取可以看作用特征描述业务逻辑的过程,其目标是对业务进行精确、全面的描述。
需要理解模型和算法,清楚模型需要什么样的输入才能有较精确的预测结果。
探索性数据分析(EDA) 目的:尽可能地洞察数据集、发现数据的内部结构、提取重要的特征、检测异常值、检验基本假设、建立初步的模型。
特点:从数据本身出发,不拘泥于传统的统计方法,强调数据可视化 。
工具:
可视化工具:箱型图、直方图、多变量图、链图、帕累托图、散点图、茎叶图、平行坐标、让步比、多维尺度分析、目标投影追踪、主成分分析、多线性主成分分析、降维、非线性降维等; 定量技术:样本均值、方差、分位数、峰度、偏度等。 数值特征(定量数据) 主要考虑因素:==大小和分布==
对于目标变量为输入特征的光滑函数 的模型,如线性回归、逻辑回归,其输入特征的大小很敏感,因此,使用光滑函数建模时,有必要对输入进行归一化 。
对于基于树的模型,如随机森林,梯度提升树等,对输入特征的大小不敏感,输入不需要归一化。
如果模型对输入特征和目标变量有一些隐式或显示的假设 ,则数据的分布对模型很重要,例如,线性回归训练通常使用平方损失函数,其等价于假设预测误差服从高斯分布。
特征交叉 提升了模型的表达能力,让线性模型具有非线性的性质,而树模型天然有这种性质。
==八种常见数值特征处理方法==
截断 。对连续型数据,有时候太多的精度 ,可能只是噪声,可在保留重要信息的前提下,对特征进行截断。或者对长尾数据进行对数转换 ,然后再截断。
二值化 。处理计数特征 ,首先考虑保留为原始计数还是转换为二值变量来标识是否存在 或者在进行分桶操作。
分桶 。将数值变量分到一个桶里并分配一个桶编号。
固定 宽度分桶:每个桶值域固定,又可分为均匀分桶 (每个桶长度相同)或自定义分桶 (取10的x次幂等) 分位数分桶:基于数据分布 使用模型分桶:聚类。 分桶可看做是对数值变量的离散化 。
缩放 。将数值变量缩放到一个确定的范围。常规的缩放有:
标准化缩放(Z缩放):将数值变量的均值变为0,方差变为1. 最大最小值缩放 最大绝对值缩放 基于某种范数的归一化 平方根缩放或对数缩放:方差的稳定变换 对有异常点的数据可采用健壮的缩放,如中位数、分位数 缺失值处理 。
补值:均值、中位数或使用模型预测 忽略:将缺失作为一种信息进行编码 特征交叉 。可表示数值特征之间的相互作用,例如对两个数值变量进行加减乘除等操作。可通过特征选择(统计检验或模型的特征重要性)来选择有用的交叉组合,特征交叉可在线性模型中引入非线性性质 ,提升模型表达能力。
非线性编码 。
使用多项式核、高斯核等 将随机森林的叶节点进行编码 基因算法、局部线性嵌入、谱嵌入、t-SNE等 行统计量 。直接对行向量进行统计也可以作为一类特征,如统计行向量中空值的个数、0的个数、正值或负值的个数,以及均值、方差、最小值、最大值、偏度、峰度等。
类别特征(定性数据) 获取方式:由原始数据直接提取或将数值进行特征离散化。
自然数编码 。给每一个类别分配一个编号,对类别编号进行洗牌,训练多个模型进行融合可以进一步提升模型效果。
独热编码 。线性模型类别特征的自然数编码,取值大小没有物理含义,直接喂给线性模型没有任何意义。常用的一种做法是对类别特征进行独热编码,这样每个特征取值对应一维特征,独热编码得到稀疏的特征矩阵。
分层编码 。对于邮政编码或者身份证号等类别特征,可以取不同位数进行分层,然后按层次进行自然数编码,这类编码一般需要专业领域知识。
散列编码 。对于有些取值特别多的类别特征,使用独热编码得到的特征矩阵非常稀疏,因此在进行独热编码之前可以先对类别进行散列编码,这样可以避免特征矩阵过于稀疏。实际应用中我们可以重复多次选取不同的散列函数,利用融合的方式来提升模型效果。散列方法可能会导致特征取值冲突,这种冲突通常会削弱模型的效果。自然数编码和分层编码可以看作散列编码的特例。
计数编码 。计数编码是将类别特征用其对应的计数来代替,这对线性和非线性模型都有效。这种方法对异常值比较敏感 ,特征取值也可能冲突。
计数排名编码 。它利用计数的排名对类别特征进行编码,其对线性和非线性模型都有效,而且对异常点不敏感 ,类别特征取值不会冲突。
目标编码 。它基于目标变量对类别特征进行编码。对于自然数编码方法,简单模型容易欠拟合,而复杂模型容易过拟合;对于独热编码方法,得到的特征矩阵太稀疏。对于高基数类别变量,一种有效方式则是基于目标变量对类别特征进行编码,即有监督的编码方法,其适用于分类和回归问题。例如对于分类问题,采用交叉验证的方式,即将样本划分为5 份,针对其中每一份数据,计算离散特征每个取值在另外4 份数据中每个类别的比例。为了避免过拟合,也可以采用嵌套的交叉验证划分方法。回归问题同样采用交叉验证的方式计算目标变量均值对类别变量编码。目标编码方法对于基数较低的离散变量通常很有效 ,但对于基数特别高的离散变量,可能会有过拟合的风险。因为很多类别特征的取值样本个数太少,不具有统计意义。对于这种情况,我们通常采用贝叶斯方法,即对统计特征进行贝叶斯平滑 ,如拉普拉斯平滑或者先验概率和后验概率加权平均的方式。
类别特征之间交叉组合 。两个类别特征进行笛卡儿积操作可以产生新的类别特征,这种操作适用于两个类别特征的基数较小的情况。
类别特征和数值特征之间交叉组合 。除了数值特征之间的组合以及类别特征之间的组合之外,类别特征和数值特征之间也可以进行组合。这种组合方式也可以看作是利用数值特征对类别特征进行编码,与前面提到的基于目标变量对类别变量进行编码的方法不同的是,这里不需要划分训练集进行计算。
时间特征 可作为类别变量处理 根据具体业务将两个时间变量组合 时间序列相关 用历史数据预测未来 滑动窗口统计特征 空间特征 文本特征 可以从以下几个方面对文本特征进行预处理:将字符转化为小写、分词、去除无用字符、提取词根、拼写纠错、词干提取、标点符号编码、文档特征、实体插入和提取、Word2Vec、文本相似性、去除停止词、去除稀有词、TF-IDF、LDA、LSA等。
预料构建 。构建一个由文档或短语组成的矩阵。矩阵的每一行为文档,可以理解为对产品的描述,每一列为单词。通常,文档的个数与样本个数一致。文本清洗 (取决于具体应用场景)分词 词性标注 (帮助了解语言内在结构)词性还原和词干提取 文本特征统计 (计数、比率)N-Gram模型 。将文本转为连续序列,保留词序信息。3-Gram常用,n过大会导致矩阵稀疏。Skip-Gram模型 。词集模型 。向量分量取值0或1,表示单词是否出现,无词序信息。词袋模型 。向量每个分量取值为词频。TF-IDF (词频-逆文档频率)。用来评估单词对文件集或语料库中的其中一份文件的重要程度。其主要思想:如果某个词或短语在一篇文章中出现的频率TF很高,并且在其他文章中很少出现,则认为它具备良好的类别区分能力,适用于分类。余弦相似度。\text{cos}\theta=\tfrac{d \cdot q}{|d||q|} Jaccard相似度。J(d_1,d_2)=\tfrac{|d_1 \cap d_2|}{|d_1 \cup d_2|} Jaccard距离。d_J(d_1,d_2)=1-J(d_1,d_2)=\tfrac{|d_1 \cup d_2|-|d_1 \cap d_2|}{|d_1 \cup d_2|} Levenshtein距离 (编辑距离)。两个字符串由一个转为另一个需要的编辑次数。隐形 语义分析 。从高维转换到低维语义空间,采用将文档或词矩阵进行奇异值分解(SVD)。word2vec 。最常用的一种单词嵌入。特征选择 特征选择是从特征集合中选出一些子集,也称为属性选择或变量选择,是指为了构建模型而选择相关特征的子集。
目的:
简化模型,使模型更易于研究人员和用户理解 改善性能,节省存储和计算开销 改善通用性,降低过拟合风险 前提:训练数据中包含许多冗余或无关的特征,移除这些特征不会导致丢失信息
冗余和无关是两个概念,如果特征本身有用,但这个特征与另外一个有用的特征强相关,则这个特征可能变得冗余。
使用场景:特征很多但样本较少
一般包括:产生过程、评价函数、停止准则、验证过程
过滤方法 :::hljs-center
:::
单变量基于特征变量和目标变量的相关性或互信息。按照相关性排序,过滤不相关的特征,优点:效率高,不易过拟合,缺点:可能选出冗余特征 多变量 ==几种常用过滤方法:==
覆盖率 。计算每个特征的覆盖率(特征在训练集中比例),剔除覆盖率小的特征
皮尔森相关系数。衡量两个变量间的线性相关性。 \rho_{X,Y}=\frac{cov(X,Y)}{\sigma_X \cdot \sigma_Y}=\frac{E[X-\mu_X][Y-\mu_Y]}{\sigma_X \cdot\sigma_Y} 样本上相关系数:
r=\frac{\sum\limits_{i=1}^{n}(X_i-\bar{X})(Y_i-\bar{Y})}{\sqrt{\sum\limits_{i=1}^{n}(X_i-\bar{X})^2}\sqrt{\sum\limits_{i=1}^{n}(Y_i-\bar{Y})^2}} Fisher得分。对于分类问题,好的特征应该是在同一个类别中取值比较相似,而在不同类别中取值差异较大。 S_i=\frac{\sum\limits_{j=1}^{k}n_j(\mu_{ij}-\mu_i)^2}{\sum\limits_{j=1}^{k}n_j\rho_{ij}^2} 其中,
假设检验。假设特征变量和目标变量之间相互独立,将其作为H0假设,选择适当检验方法计算统计量,然后根据统计量确定P值做出统计推断。例如对于特征变量为类别变量而目标变量为连续数值变量的情况,可以使用方差分析(Analysis of Variance,ANOVA),对于特征变量和目标变量都为连续数值变量的情况,可以使用皮尔森卡方检验。卡方统计量如下: \chi^2=\sum\limits_{i=1}^{r}\sum\limits_{j=1}^{c}\frac{(O_{i,j}-E_{i,j})^2}{E_{i,j}^2}=N\sum\limits_{i,j}p_ip_j\Big( \frac{(O_{i,j}/N)-p_ip_j}{p_ip_j} \Big)^2 互信息。在概率论和信息论中,互信息(或Kullback-Leibler散度、相对熵)用来度量两个变量之间的相关性。互信息越大则表明两个变量相关性越高,互信息为0时,两个变量相互独立。对于两个离散随机变量X和Y,互信息计算公式如下: I(X;Y)=\sum\limits_{y\in{Y}}\sum\limits_{x\in{X}} p(x,y)\log\Big(\frac{p(x,y)}{p(x)p(y)} \Big)=D_{KL}(p(x,y)| p(x)p(y)) 其中,
的平均值: D(S,c)=\frac{1}{|S|}\sum\limits_{f_i \in {S}}I(f_i, c) 的平均值:
R(S)=\frac{1}{|S|^2}\sum\limits_{f_i,f_j \in {S}}I(f_i,f_j) 则mRMR准则定义为:
mRMR=\max_{S}[D(S,c)-R(S)] 通过求解上述优化问题就可以得到特征子集。在一些特定的情形下,mRMR算法可能对特征的重要性估计不足,它没有考虑到特征之间的组合可能与目标变量比较相关。如果单个特征的分类能力都比较弱,但进行组合后分类能力很强,这时mRMR方法效果一般比较差(例如目标变量由特征变量进行XOR运算得到)。mRMR是一种典型的进行特征选择的增量贪心策略:某个特征一旦被选择了,在后续的步骤不会删除。mRMR可以改写为全局的二次规划的优化问题(即特征集合为特征全集的情况):
QPFS=\min_x[\alpha{x}^\top{H}x-x^\top{F}]s.t.\sum\limits_{i=1}^{n}x_i=1,x_i\ge 0 。 另外一种全局的基于互信息的方法是基于条件相关性的:
SPEC_{CMI}=\max_x{[x^\top Qx]s.t.|x| =1,x_i\ge 0} 其中,
个特征的集合,CFS准则定义如下: CFS=\max_{S_k}\Big[ \frac{r_{cf_1}+r_{cf_2}+ ...+r_{cf_k}}{\sqrt{k+2(r_{f_1f_2}+...+r_{f_if_j})+...+r_{f_kf_1}})} \Big] 其中,
封装方法 由于过滤方法与具体的机器学习算法 相互独立,因此过滤方法没有考虑选择的特征集合在具体机器学习算法上的效果。与过滤方法不同,封装方法直接使用机器学习算法评估特征子集的效果,它可以检测出两个或者多个特征之间的交互关系,而且选择的特征子集让模型的效果达到最优。
封装方法是特征子集搜索和评估指标相结合的方法,前者提供候选的新特征子集,后者则基于新特征子集训练一个模型,并用验证集进行评估,为每一组特征子集进行打分。最简单的方法则是在每一个特征子集上训练并评估模型,从而找出最优的特征子集。 :::hljs-center
::: 缺点:
样本不够充分的情况下容易过拟合; 特征变量较多时计算复杂度太高。 ==几种常用的特征子集搜索算法:==
完全搜索。 广度优先搜索。时间复杂度高,不实用。 分支定界搜索。在穷举搜索的基础上加入了分支限界,若断定某些分支不可能搜索出比当前找到的最优解更优的解,则可以剪掉这些分支。 定向搜索。首先选择N个得分最高的特征作为特征子集,将其加入一个限制最大长度的优先队列,每次从队列中取出得分最高的子集,然后穷举向该子集加入一个特征后产生的所有特征集,将这些特征集加入队列。 最优优先搜索。与定向搜索类似,唯一的不同是不限制优先队列的长度。 启发式搜索。 序列向前选择。特征子集从空集开始,每次只加入一个特征,这是一种贪心算法。 序列向后选择。特征子集从全集开始,每次删除一个特征。 双向搜索。同时使用序列向前选择和向后选择,当两者搜索到相同的特征子集时停止。 增L去R选择算法。若算法从空集开始,每轮先添加L个特征,再删除R个特征;若算法由全集开始,则每轮先删除R个特征,再添加L个特征。 序列浮动选择。每次选择添加和删除的特征个数不是固定的。 随机搜索。 执行序列向前或者向后选择的时候,此算法随机选择特征子集。嵌入方法 将特征选择嵌入到模型的构建过程中,具有封装方法与机器学习算法相结合的优点,而且具有过滤方法计算效率高的优点,嵌入方法是实际应用中最常见的方法,弥补了前面两种方法的不足。 :::hljs-center ::: 嵌入方法最经典的例子是LASSO(Least Absolute Shrinkage and Selection Operator)方法。
\min_{\beta \in \mathbb{R}^p}\Big{ \frac{1}{N} |y-X\beta |2^2 + \lambda|\beta |1 \Big} LASSO方法类似岭回归,它通过对回归系数添加L1惩罚项来防止过拟合,可以让特定的回归系数变为0,从而可以选择一个不包含那些系数的更简单的模型。际应用中,λ越大,回归系数越稀疏,λ一般采用交叉验证的方式来确定。除了对最简单的线性回归系数添加L1惩罚项之外,任何广义线性模型如逻辑回归、FM/FFM以及神经网络模型,都可以添加L1惩罚项。除了简单的LASSO算法,嵌入方法还有结构化LASSO算法。常见的如Group LASSO算法,它对特征集合分组,对每一组采用类似LASSO的方法进行选择。
\min{\beta \in \mathbb{R}^p} \Big{\frac{1}{N} |y-X\beta|2^2 + \lambda \sum\limits{j=1}^J |\beta_j|{K_j} \Big}, |\beta_j|_{K_j}=\sqrt{\beta_j^{\top}K_j\beta_j} 另外一类嵌入方法是基于树模型的特征选择方法。在决策树中,深度较浅的节点一般对应的特征分类能力更强(可以将更多的样本区分开)。对于基于决策树的算法,如随机森林,重要的特征更有可能出现在深度较浅的节点,而且出现的次数可能越多。因此,可以基于树模型中特征出现次数等指标对特征进行重要性排序。 :::hljs-center :::