一、特征工程有哪些?
特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。从本质上来讲,特征工程是一个表示和展现数据的过程。在实际工作中,特征工程旨在去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解的问题与预测模型之间的关系。
主要讨论以下两种常用的数据类型。
- 结构化数据。结构化数据类型可以看作关系型数据库的一张表,每列都有清晰的定义,包含了数值型、类别型两种基本类型;每一行数据表示一个样本的信息。
- 非结构化数据。非结构化数据主要包括文本、图像、音频、视频数据, 其包含的信息无法用一个简单的数值表示,也没有清晰的类别定义,并且每条数据的大小各不相同。
1.特征归一化
为了消除数据特征之间的量纲影响,我们需要对特征进行归一化处理,使得不同指标之间具有可比性。例如,分析一个人的身高和体重对健康的影响,如果使用米(m)和千克(kg)作为单位,那么身高特征会在1.6~1.8m的数值范围内,体重特征会在50~100kg的范围内,分析出来的结果显然会倾向于数值差别比较大的体重特征。想要得到更为准确的结果,就需要进行特征归一化 (Normalization)处理,使各指标处于同一数值量级,以便进行分析。
对数值类型的特征做归一化可以将所有的特征都统一到一个大致相同的数值区间内。最常用的方法主要有以下两种。
- 线性函数归一化(Min-Max Scaling)。它对原始数据进行线性变换,使结果映射到[0, 1]的范围,实现对原始数据的等比缩放。归一化公式如下,其中X为原始数据,xmax、 xmin 分别为数据最大值和最小值。
- 零均值归一化(Z-Score Normalization)。它会将原始数据映射到均值为 0、标准差为1的分布上。具体来说,假设原始特征的均值为μ、标准差为σ,那么归一化公式定义为
优点:训练数据归一化后,容易更快地通过梯度下降找到最优解。
当然,数据归一化并不是万能的。在实际应用中,通过梯度下降法求解的模型通常是需要归一化的,包括线性回归、逻辑回归、支持向量机、神经网络等模型。但对于决策树模型则并不适用。
2.类别型特征
类别型特征(Categorical Feature)主要是指性别(男、女)、血型(A、B、 AB、O)等只在有限选项内取值的特征。类别型特征原始输入通常是字符串形式,除了决策树等少数模型能直接处理字符串形式的输入,对于逻辑回归、支持向量机等模型来说,类别型特征必须经过处理转换成数值型特征才能正确工作。
- 序号编码
序号编码通常用于处理类别间具有大小关系的数据。例如成绩,可以分为低、中、高三档,并且存在“高>中>低”的排序关系。序号编码会按照大小关系对类别型特征赋予一个数值ID,例如高表示为3、中表示为2、低表示为1,转换后依然保留了大小关系。
- 独热编码(one-hot)
独热编码通常用于处理类别间不具有大小关系的特征。例如血型,一共有4个取值(A型血、B型血、AB型血、O型血),独热编码会把血型变成一个4维稀疏向量,A型血表示为(1, 0, 0, 0),B型血表示为(0, 1, 0, 0),AB型表示为(0, 0, 1, 0),O型血表示为(0, 0, 0, 1)。对于类别取值较多的情况下使用独热编码。
- 二进制编码
二进制编码主要分为两步,先用序号编码给每个类别赋予一个类别ID,然后将类别ID对应的二进制编码作为结果。以A、B、AB、O血型为例,下图是二进制编码的过程。A型血的ID为1,二进制表示为001;B型血的ID为2,二进制表示为 010;以此类推可以得到AB型血和O型血的二进制表示。
3.高维组合特征的处理
为了提高复杂关系的拟合能力,在特征工程中经常会把一阶离散特征两两组合,构成高阶组合特征。以广告点击预估问题为例,原始数据有语言和类型两种离散特征,第一张图是语言和类型对点击的影响。为了提高拟合能力,语言和类型可以组成二阶特征,第二张图是语言和类型的组合特征对点击的影响。
4.文本表示模型
文本是一类非常重要的非结构化数据,如何表示文本数据一直是机器学习领域的一个重要研究方向。
- 词袋模型和N-gram模型
最基础的文本表示模型是词袋模型。顾名思义,就是将每篇文章看成一袋子词,并忽略每个词出现的顺序。具体地说,就是将整段文本以词为单位切分开, 然后每篇文章可以表示成一个长向量,向量中的每一维代表一个单词,而该维对应的权重则反映了这个词在原文章中的重要程度。常用TF-IDF来计算权重。
- 主题模型
主题模型用于从文本库中发现有代表性的主题(得到每个主题上面词的分布特性),并且能够计算出每篇文章的主题分布。
- 词嵌入与深度学习模型
词嵌入是一类将词向量化的模型的统称,核心思想是将每个词都映射成低维空间(通常K=50~300维)上的一个稠密向量(Dense Vector)。K维空间的每一维也可以看作一个隐含的主题,只不过不像主题模型中的主题那样直观。
5.其它特征工程
- 如果某个特征当中有缺失值,缺失比较少的话,可以使用该特征的平均值或者其它比较靠谱的数据进行填充;缺失比较多的话可以考虑删除该特征。
- 可以分析特征与结果的相关性,把相关性小的特征去掉。
- 当用户使用稀疏特征进行训练时,对于离散特征缺省值应该如何处理效果较好(对缺省值赋给一个全新值来标记)
6.特征工程脑图
二、机器学习优化方法(优化算法)
- 损失函数:是定义在单个样本上的,算的是一个样本的误差
- 代价函数:是定义在整个训练集上的,是所有样本误差的平均,即损失函数的平均
- 目标函数:最终要优化的函数,等于经验风险+结构风险,对于目标函数来说,再有约束条件下的最小化就是损失函数
优化是应用数学的一个分支,也是机器学习的核心组成部分。实际上,机器学习算法 = 模型表征 + 模型评估 + 优化算法。其中,优化算法所做的事情就是在模型表征空间中找到模型评估指标最好的模型。不同的优化算法对应的模型表征和评估指标不尽相同。
机器学习算法的关键一环是模型评估, 而损失函数定义了模型的评估指标。
1.机器学习常用损失函数
损失函数(loss function)是用来估量模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。常见的损失函数如下:
- 平方损失函数
Y-f(X)表示的是残差,整个式子表示的是残差的平方和,而我们的目的就是最小化这个目标函数值(注:该式子未加入正则项),也就是最小化残差的平方和。而在实际应用中,通常会使用均方差(MSE)作为一项衡量指标,公式如下:
该损失函数一般使用在线性回归当中。
- log损失函数
该损失函数一般使用在逻辑回归中。
- Hinge损失函数
SVM采用的就是Hinge Loss,用于“最大间隔(max-margin)”分类。
2.什么是凸优化(对于凸优化问题,所有的局部极小值都是全局最小值)
凸函数的严格定义为,函数L(·) 是凸函数当且仅当对定义域中的任意两点x,y和任意实数λ∈[0,1]总有:
凸优化问题的例子包括支持向量机、线性回归等线性模型,非凸优化问题的例子包括低秩模型(如矩阵分解)、深度神经网络模型等。
主成分分析对应的优化问题是非凸优化问题,但可以借助SVD(奇异值分解)直接得到主成分分析的全局极小值。
3.正则化项
为什么希望模型参数具有稀疏性呢?稀疏性,说白了就是模型的很多参数是0 。这相当于对模型进行了一次特征选择,只留下一些比较重要的特征,提高模型的泛化能力,降低过拟合的可能。
从概率角度出发,L1正则和L2正则分别是假设参数服从laplace分布/高斯分布。
4.常见的几种最优化方法
- 梯度下降法
梯度下降法是最早最简单,也是最为常用的最优化方法。梯度下降法实现简单,当目标函数是凸函数时,梯度下降法的解是全局解。一般情况下,其解不保证是全局最优解,梯度下降法的速度也未必是最快的。梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。梯度下降法的搜索迭代示意图如下图所示:
缺点:靠近极小值时收敛速度减慢;直线搜索时可能会产生一些问题;可能会“之字形”地下降。
- 牛顿法
牛顿法是一种在实数域和复数域上近似求解方程的方法。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x)=0的根。牛顿法最大的特点就在于它的收敛速度很快。具体步骤:
- 首先,选择一个接近函数 f(x)零点的 x0,计算相应的f(x0)和切线斜率f'(x0)(这里f'表示函数f的导数)。
- 然后我们计算穿过点(x0, f(x0))并且斜率为f'(x0)的直线和x轴的交点的x坐标,也就是求如下方程的解:
- 我们将新求得的点的x坐标命名为x1,通常x1会比x0更接近方程f(x)=0的解。因此我们现在可以利用x1开始下一轮迭代。
由于牛顿法是基于当前位置的切线来确定下一次的位置,所以牛顿法又被很形象地称为是"切线法"。牛顿法搜索动态示例图:
从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。缺点:
- 牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。
- 在高维情况下这个矩阵非常大,计算和存储都是问题。
- 在小批量的情况下,牛顿法对于二阶导数的估计噪声太大。
- 目标函数非凸的时候,牛顿法容易受到鞍点或者最大值点的吸引。
- 拟牛顿法
拟牛顿法是求解非线性优化问题最有效的方法之一,本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。拟牛顿法和梯度下降法一样只要求每一步迭代时知道目标函数的梯度。通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于梯度下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。
- 共轭梯度法
共轭梯度法是介于梯度下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了梯度下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。
下图为共轭梯度法和梯度下降法搜索最优解的路径对比示意图:
当训练数据量特别大肘,经典的梯度下降法存在什么问题,需要做如何改进?
经典的梯度下降法在每次对模型参数进行更新时,需要遍历所有的训练数据。当M很大时,这需要很大的计算量,耗费很长的计算时间,在实际应用中基本不可行。
随机梯度下降并没有引入非线性
AdaGrad 使用的是一阶导数;L-BFGS 使用的是二阶导数
为了解决该问题,随机梯度下降法( Stochastic Gradient Descent,SGD )用单个训练样本的损失来近似平均损失。随机梯度下降法用单个训练数据即可对模型参数进行一次更新,大大加快了收敛速率。该方法也非常适用于数据源源不断到来的在线更新场景。
为了降低随机梯度的方差,从而使得迭代算法更加稳定,也为了充分利用高度优化的矩阵运算操作,在实际应用中我们会同时处理若干训练数据, 该方法被称为小批量梯度下降法( Mini-Batch Gradient Descent )
- Mini-batch比随机梯度下降噪声更小
- Mini-batch的梯度下降单次iteration速度比批梯度下降快
- 不同的Mini-Batch训练出来的BN参数是不相同的
- Batch Gradient Descent(BGD)对所有函数不可收敛到全局极小值