机器学习算法原理系列篇5: 建模流程(下)

精彩人工智能相关文章,微信搜索  : robot-learner , 或扫码

 

 

  

       上面一篇文章中,我们已经讨论了建模过程的”数据收集“和“数据清洗”两个模块,这一节中,我们讨论剩下的三个模块。

 

   

 

 

    1. 特征工程

 

特征工程是根据对数据的专业知识来构造合适的特征变量,从而使机器学习算法更好的工作。好的特征工程会使机器学习算法的预测能得到提高。特征工程这一步骤可以说是机器学建模过程中最重要的环节。

 

举一个例子来说特征工程的步骤。下表显示的是飞机预计起飞时间和实际起飞状态。这样的数据是原始数据,但是日期显然并不合适作为特征直接输入模型。经过简单的观察和思考,我们可以估计到飞机的起飞状态跟预计起飞所在的时刻有关系。因此我们可以创造出飞行时刻这一特征,可能更好的预测飞机状态。

 

下表是飞行预计起飞时间原始数据。

 

时间

飞机状态

0

2018-01-03 20:50

晚点

1

2018-01-04 10:20

准点

2

2018-01-03 07:30

准点

3

2018-01-04 18:30

晚点

4

2018-01-03 10:40

准点

 

下表是预计飞行时刻,根据预计起飞时间构造的简单特征。

 

飞行时刻

飞机状态

0

20

晚点

1

10

准点

2

7

准点

3

18

晚点

4

10

准点

 

再以自然语言处理中的特征工程为例。假如我们要预测任何一句话的情感色彩为乐观还是悲观。那么必须将自然语言转变为算法能够理解的数值向量,比如“今天我很高兴”这一句话。我们可以将所有训练数据中的文字按先后顺序从1开始编码。假设有1万个字,那么我们可以将每一句话转变为一个1万维度的向量。比如“今天我很高兴”这句话中的每一个字可能对应的编码分别为2,10,89,199,200,1001。那么这句话对应的1万维向量中只有对应的位置数值为1,其余9994个位置的数值为0。 可以看出来,这样的向量是高度稀疏的。

 

 

      1. 枚举类型变量的编码

 

枚举类型变量非常常见,比如车辆的颜色可能有红色,白色,黑色几种。虽然有些算法,比如决策树可以直接用枚举类型变量作为输入,但是大多数算法只能处理数值型变量。在这种情况下,必须对枚举类型变量进行合理的数值编码。

 

第一种常用的方法被称为one-hot编码技术(一位有效编码)。One-hot方法把 K 个枚举值的变量转为 K或K-1 个二进制变量,并且只有一个位置为1,其余变量位置为0。比如具有红色,白色,黑色三种颜色的车辆颜色枚举变量经过转换以后如下图所示:

转变前枚举变量

车辆颜色

转变后的多个二进制变量

is_red

is_white

is_black

红色

1

0

0

白色

0

1

0

黑色

0

0

1

 

从上面的例子可以看出,一个具有K个枚举值的枚举变量被转化K个新的二进制变量。之所以说其实可以转换K-1个二进制变量,是因为最后一个枚举值可以由其他枚举值推算出来。比如上面的例子中,我们可以去掉is_red这个变量。这说明这K个新生产的枚举变量是高度相关的。这个问题对应统计分析是个大问题。比如,在运用回归算法分析时候,如果不减少二进制变量的数量,会造成共线性的问题,从而导致算法失败。但是对于有正则约束条件(regularization)的回归算法,是可以用K个二进制变量的。当然前提是使用者关心的只是算法的预测能力,而不是特征的解释性。另外对于决策树之类的算法,共线性也不是一个问题,因为并不违背任何假设和数学运算。

 

当枚举变量的枚举值比较少,经过one-hot编码后,多出来的特征变量仍然在可以控制的范围。但是当枚举值特别多的情况,比如邮编号码可能有几千个到上万个枚举值,算法就要多处理上万个特征变量,显然是不可取的。在这种情况下,需要用其他的方法来处理枚举变量的编码。通常有以下几种方法:

  1. 根据对数据的理解,考虑合并枚举值。比如邮编号码,虽然每一个小地方都有一个不同的邮编号码,但是也许可以合并为大的行政区,比如一个市或者省。这样邮编号码的个数将大大减少。
  2. 借助评分卡建模中的经验,把枚举变量转换为WOE值。
  3. 把枚举变值转换为对应的目标变量(Y=0或1)的平均值。这个做法其实和WOE变量思想是一致的。需要注意过拟合的问题。比如车辆颜色为红色时候,对应的数据个数非常少,那么把红色转变为少量数据Y值的平均值就会引起算法的过拟合。因为算法很快就错误学会了把红色和特定目标Y值联系起来。考虑到这样的情况,可以用以下的公式:

 

λn*meanlevel+1-λn*mean(dataset)

 

即枚举值对应数据的平均值和所有数据平均值的一个加权求和。其中权重λ(n)和枚举值的频率相关,从而使得枚举值对应的数据比较少时候,λ(n)接近0,从而使其编码值接近全体数据的平均值。当枚举值对应数据较多时候,λ(n)接近0则接近1。

 

 

 

 

      1. 特征选取

 

提到特征选取,有必要先理解维度灾难(curse of dimensionality)这一概念。当模型的维度很高时候,模型空间的体积也会随之很快提高,因此有限的数据变得的稀疏。在高纬度空间中,所有的数据都将变得很稀疏,从很多角度看都不相似,因而常用的数据组织策略变得非常低效。因此为了获得统计上有意义的结果,模型所需要的数据将随着维度的提高而呈指数级增长。

 

因为维度灾难的问题,当我们模型潜在的输入特征变量过多时候,需要去除一些不重要的特征,只保留对模型预测能力最有效的部分特征。较少的特征变量,也可以提高模型训练和运算的效率和稳定性。在某些时候,若果较少和正确的特征子集也会帮助模型取得更加优秀的效果。通常情况下,特征越少过拟合的可能性也会随之减小。

 

        1. 基于统计方法的特征选取

下面我们分析常用的基于统计的特征选取方法。

  1. 去除方差较低的特征

方差较小,意味这个特征对应的数据分布变化范围比较小。极端情况下,如果特征对应的向量为常数,方差为0。在大量特征的情况下,首先去除方差接近0的特征是一个简单快捷的方法。当然,比较不同的特征方差之前,最好把特征归一化才能公正的比较。

  1. 相关系数(Pearson’s Correlation)

皮尔森相关系数用来量化两个连续变量的线性相关程度。因此我们可以计算每一个特征和目标变量的相关程度大小,从而只保留和目标变量相关程度高的特征。

 

  1. Forward selection 和Backward Elimination

Forward selection 是一个迭代方法。首先我们选取一个算法,通常是回归算法。一开始我们测试每一个特征,选取效果最好的特征作为我们的初始模型。然后,我们从余下的特征中,尝试每一个特征,选取效果最好的特征作为我们第二次迭代模型。以此类推直到模型的效果不能提高,或者预先规定的特征数量达到为止。Backward elimination 方法则是一开始使用所有特征建立模型,然后去掉最不重要(依据特征系数大小,p Value等)的一个特征,然后重新训练模型,以此类推,直到模型效果不再提升或者特征数量达到要求为止。

 

        1. 基于降维处理的特征选取

 

下面是几种通过降低特征维度的方法来实现特征的选取。降维处理不是从原有的特征里面直接挑选子集,而是通过数学转换的方法,对原有特征进行了线性或者非线性的组合,重新给出新的特征变量。

  1. 主成分分析(Principal Component Analysis 或者 PCA)

通过正交变化的方式,把一系列相关的变量转化为线性无关的变量或者称为主成分。第一个主成分变量的方差最大,因此保留了原始数据最多的变化范围。在特征选取的应用中,我们通常选取前面几个主要的主成分,就理论上保留原始数据中绝大多数的变化范围。因此有可能用远远小于原始特征数量的新特征获得和原始模型相同或者更好的效果。

  1. 线性差异分析(Linear Discriminant Analysis)

Linear discriminant analysis 方法是Fisher‘s linear discriminant 方法的一个推广,用来找出一个能够区分目标变量的最好的原始特征的一个线性组合方式。

  1. t-SNE

t-SNE的全称是 T-distributed Stochastic Neighbor Embedding。该算法常用在视觉展现中,是一个优秀的非线性降维方法。本质上,该算法把高纬度的数据点投影到二维或者三维空间中,并且使得相似的数据点非常靠近,而不相似的数据点会尽量远离。

  1. Latent Dirichlet Process (LDA)

LDA算法常在自然语言分析中用来找出文本语言的主题成分,但是可以推广到一般的特征降维中。 LDA找到的主题成分,即是新的特征变量。

 

        1. 基于模型的特征选取

下面介绍几种基于模型算法来进行特征选取的方法。

 

  1. 线性模型中的正则化方法L1 regularization

正则化 (Regularization)方法是在线性模型中(包括线性回归和逻辑回归)加入额外的限制项,以此来限制模型过拟合。L1 regularization (也称为Lasso regularization) 的是把模型优化(通常为最小化)的损失方程 E(X,Y) 转化为一个新的损失方程:

EX,Y+αi=1n|ωi|

 

其中ω为模型中各特征对应的系数。越强的L1 regularization ,即上式中的则会迫使更多的系数为0,从而相当于自动进行了特征选取。

 

  1. 随机森林算法-mean decrease in impurity

随机森林算法是常用的机器学习算法之一,也提供了非常直接的方法来对特征进行排名。随机森林里面包含一系列的决策树,在每一颗决策树中的每一个节点,算法根据某一个特征的值来把数据一分为二,从而使得相似的数据点被分到一起。而在每一个节点的分类方法是根据 Gini impurity 或者 Information gain/entropy。根据这个原理,我们可以首先算出某一个特征在每一个决策树中对数据的加权的Impurity 减小程度,进而算出对所有决策树的平均值。依据平均值,我们可以对所有特征进项排名,从而进项特征选取。

 

  1. 随机森林算法-mean decrease in accuracy

另一个常用的方法是直接比较特征对模型效果 (accuracy, AUC, KS等)的影响。其主要方法是,随机的对某一特征值向量进行置换 (permutation),然后重新测量模型在测数据下的效果降低程度。很显然,如果该特征不是那么重要,模型效果降低程度应该有限。通过对每一个特征的置换和测量,我们可以对特征进行排名,从而进行特征选取。

 

    1. 模型建立

 

经过上述的几个步骤,我们已经得到干净和规范的数据。而下一步则是结合业务建立合适的模型。

 

      1. 数据分割

 

为了满足建模的需要,历史数据一般需要分为三个部分:

  1. 训练数据集(training set):用来直接训练模型,得到模型参数
  2. 验证数据集(validation set):训练数据得出的模型需要进行检验,防止过拟合。验证数据的目的就是用来检查训练好的模型在新数据上效果。一旦效果没有达到要求,则可以返回训练数据集,通过调整拟合次数,超参数调整等方法得到新的模型。如此迭代,直到得到满意的模型。
  3. 测试数据集 (test set):通过验证数据检验的模型仍然有可能包含了训练者的偏见。因为训练者一味的根据验证数据的结果来调整训练数据的模型,可能导致偏差。因此,测试数据就是验证模型的最后一个独立的检查。模型在测试数据上的结果是最终的效果,将不允许再回到训练数据重新训练模型以期得到在测试数据上的更好效果。测试数据上的模型效果将作为模型最终的独立指标对外发表。

上面的三个数据分割对应了模型训练的不同阶段,类似于学生在平时学习,作业联系,期末考试的三个状态。一般来说训练数据的数量应该占比最大,达到70%到80%,验证数据20%左右,剩下的为测试数据。但是数据量的要求并不绝对,以能满足建模实际需要为准。

 

数据的具体分割方式也许要考虑数据自身的特点。如果不考虑数据点发生时间的因素,即所有数据可以考虑为发生在同一时期,则可以采样随机抽样的方式分割数据。如果数据自身有较强的时间依赖性,比如预测用户的逾期情况,则更好的数据分割方式是按时间分割。比如用前六个月的数据作为训练,而后面三个月的数据作为验证。这样的分割方式更贴近实际情况,因此能够训练更好的模型。这两种切割方式如下图所示。

 

 

另一种数据切割的方式是交叉验证(cross validation),是上面所诉的training/validation数据分割的一种替换方式。具体而言,把数据分为K份,每一次用一份数据作为验证数据,其余K-1份作为训练数据。这样循环K次,得到模型的平均效果。通常K取为10,被称为10-fold cross validation。Cross validation的好处在于,模型的评价来自于数据的平均效果,一定程度上能够避免模型在随机分配数据上显现的偏差。 Cross validation的极端情况下就是K设为数据大小本身 (K=n),即每次只留一个数据点作为验证数据。这种方法被称为leave-one-out cross validation。这样的好处是完全取消了随机效应 ,也适合数据量非常少的情况。

 

 

      1. 模型选择

 

选择什么的算法,很大程度上取决于业务的需要。比如要预测客户是否逾期,属于二分类算法,如果要预测房价,则属于回归模型。另外常见的模型还有聚类模型,比如把用户按相似性分为不同的群体。具体的算法选择还要根据数据量的大小来决定。数据量不是很大,或者说在单机能够训练的情况下,选择是非常多的。常用的机器学习算法包都能满足需求,比如R,python下的scikit-learn。而一旦数据量特别巨大,达到大数据的范畴,需要考虑使用分布式算法,像spark mllib平台提供的算法。但不是每一种算法都会有很好的分布式实现,比如支撑向量算法(SVM)。

 

 

    1. 模型监控

 

模型部署以后,需要定期的监控其表现是否和预计一致。模型的效果不会一直稳定,因为底层的数据分布可能随着时间的而发生变化,或者预测的结果分布也会随着时间而发生改变。因此我们需要一套机制去监控模型的效果,一旦效果低于可以接受的阈值,必须调整模型,重新部署。

 

用来衡量底层特征或者模型结果随时间变化程度的一种统计方法是群体稳定性指数(Population Stability Index或者PSI),其计算公式如下:

PSI=i(ptesti-pbase i)*ln⁡(ptesti/pbasei)

 

根据上式,按照同样的边界条件,我们把作为基准的分布和实际获得的分布分别分为n份(不一定等分),然后算出每一等分的实际占比ptest和预期占比pbase,最后通过PSI公式算出PSI值。一般来说,PSI小于0.1说明分布基本没有变化, 0.1-0.2 也可以接受,大于 0.2或者0.25的说明分布变化较大。

 

分类模型的输出通常为预测概率,因此可以用来计算PSI值。模型刚刚训练部署以后,我们可以记录预测概率在测试数据上的分布,作为基准分布。经过一段时间运行后,我们监控模型在新的数据上的概率分布,用来和基本分布相比较。一旦PSI值过大,可以判断模型稳定性发生了变化。

 

值得注意的是,模型稳定性发生了变化,并不一定代表模型的实际效果不如以前。最终判断模型的效果,始终应该是业务的实际效果,比如预测逾期率和实际逾期率的比较。但是模型稳定性的监控给了我们起到了必要安全屏障,因为模型稳定性发生变化,往往意味着底层数据的特征分布发生了变化,需要建模人员去重新审视模型的实际效果。

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值