工作流程与模型调优

Posted 心潇瑶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工作流程与模型调优相关的知识,希望对你有一定的参考价值。

七月在线4月机器学习算法班课程笔记——No.7

前言

  我们知道,机器学习的过程是非常繁琐的。上一篇介绍了机器学习中特征处理重要而耗时,然而特征处理仅属于机器学习前序的工作内容。特征工程之后,需要选择机器学习模型、交叉验证、寻找最佳超参数等建模步骤。搭建模型之后呢,还需要进行模型的优化,模型调优是实际生产中一个必要的环节,也是不断去改进的一个事情。
  这一篇会以小的数据集为例,讲一下机器学习在实际项目中的工作流程,介绍如何分析模型状态、分析权重、分析bad-case以及如何做模型融合。哈,开启宏观的认知!


1. 前序工作流程

1.1 数据部分

  • 数据清洗:丢掉不可信的样本; 不用缺省值极多的字段。
  • 数据采样:采用下/上采样保证样本均衡。

1.2 特征工程

  上一篇笔记重点讲了特征工程中的特征处理和特征选择。特征处理包括数值型、类别型、时间型、文本型、统计型和组合特征;特征选择包括过滤型、包裹型和嵌入型,在这里不再赘述。下图总结了特征处理中的流程和方法。
  这里写图片描述
  

1.3 模型选择

  准备好了训练数据,就可以根据特征选择机器学习的模型了。模型选择有两种理解方式。第一种含义是选择哪一种模型;第二种含义是确定了模型,如何指定参数。
  
  1)第一种理解:
  第一种含义是选择哪一种模型?
  经常会有这样的问题:“我准备好了数据,计划做分类或连续值预测,用什么模型比较好呢?”但是实际上,没有一个模型是万能的,都有各自的适用场景。这里介绍一下scikit-learn,scikit-learn是一个用Python语言编写机器学习库的开源站点。通常解决机器学习问题最难的部分就是找到合适的估计器,下面的流程图清晰地给出了解决问题的路径,进入scikit-learn官网,可以单击任何一个估计器,看到它的说明文档。
  这里写图片描述
  
  分析这张图,把模型选择分为几个步骤进行:
  
   1. 准备好数据,然后看数据的样本量有多大。
   样本量很小 就需要采集更多的数据,不然难以得到泛化的关系,容易造成过拟合。或者使用人工规则解决问题。
   样本量足够 步骤2.
  
   2. 判断问题类型是 连续值预测or离散值预测。
   离散值预测 比如“用户会不会买某个产品”,多选用分类算法。Go步骤5.
   连续值预测 比如房价、股市,多选用回归类的算法。Go步骤6.
  
   3. 判断维度:维度高的话先做一些处理,降低维度,节省空间资源,加快处理速度。
   4. 判断数据标签。
   有标签 分类问题。Go步骤5.
   无标签 聚类问题。可以使用k-means、FCM等聚类算法。 
  
   5. 分类问题需要判断样本量级。
   样本量级不太大 Linear SVC。如果是文本分类问题,建议用Naive Bayes,不是文本建议LR、SVM。
   样本量级大 用SVM的训练时间比较长,而且收敛程度不确定。建议用随机梯度下降算法SGD,可能会做一些核估计。
   6. 连续问题需要判断样本量级。比较小量级就用线性回归、支持向量回归等。比较大就SGD。
  
   2)第二种理解:
   第二种含义是已经确定了用什么模型解决问题,但是对同一个模型而言,也会有许多的参数,存在许多的可能性。比如下图中线性回归的例子:
   这里写图片描述
   绿色的线代表目标结果的分布状况,确定了使用线性回归(广义的多项式函数 xm )的模型来拟合。当参数m不同时,拟合的情况会大不相同。m=0或者m=1时,没有拟合足够的点,就是欠拟合的情况;m=9时,曲线拟合了每一个数据点,但是曲线缺乏预测的意义,就是过拟合的情况。
  

1.4 交叉验证

  对于模型选择的第二种含义,怎么选择参数,有一个解决办法就是交叉验证。
  一般情况,拿到了数据后悔会分成两部分,训练集和测试集。但是这种方法不能帮助我们制定参数。噔噔噔,来看交叉验证。交叉验证把数据分成三部分,比如70%的训练集、20%的交叉验证集、10%的测试集。其中训练集用来建模,交叉验证集来做参数/模型选择,测试集只做模型效果评估。怎么实现呢?下面介绍最经典的K折交叉验证(K-fold cross validation)。
  K折交叉验证:将数据集A随机分为k个包,每次将其中一个包作为交叉验证集,剩下k-1个包作为训练集进行训练,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。if K=5,均匀的把训练集分成五折fold1~fold5。过程需要进行5轮的交叉验证,第一轮以fold1~fold4作为训练集,fold5作为交叉验证集;第二轮以fold1~fold3、fold5作为训练集,fold4作为交叉验证集……每一轮,都以不同的参数建模型(比如例子中的m分别取0、1、3、9做实验)得到每个参数的准确率,最后得到不同参数的准确率均值,比较参数的效果。
  这里写图片描述

1.5 寻找最佳超参数

  既然参数的选择对模型的影响比较大,那么用一个模型的时候,我们要明确模型的参数含义以及对模型的影响。举了栗子:sklearn中的逻辑回归模型-sklearn.linear_model.LogisticRegression。
  这里写图片描述
  注意看文档,了解模型中参数的意义。比如说C的大小就对收敛有很大影响。下图说明了C的值对模型分类准确率的影响,图中lambda即C。当lambda=1时,图形比较圆润而且有较好的准确率。
  
  交叉验证选取,可以用sklearn.grid_search.GridSearchCV函数。


2. 模型优化

2.1 模型状态

  经过上面的模型选择,可以确定一个模型,那么如何判定模型的好坏呢,就需要考察模型的状态。有两个比较重要的状态是“过拟合(overfitting/high variance)”和“欠拟合(underfitting/high bias)”。工程上是第一时间需要去查模型的状态的。在第一章有图例说明这两种状态,那怎么评定模型状态呢?
  这里写图片描述
  第一张表是欠拟合的状态:在数据量很少的时候,训练集上的准确度比较高,准确率随着数据量增大而降低,不过整体都没有达到期望水平。
  第二张表是过拟合的状态:准确率整体都高于期望水平,但是训练结果和验证结果的差距一直很大,意味着过拟合状态对未知数据的预测性不够好。
  
  不同模型状态处理: 
1. 过拟合:找更多的数据来学习;增大正则化系数;减少特征个数(不是太推荐);需要注意的是不要以为降维可以解决过拟合问题。
2. 欠拟合:找更多的特征;减小正则化系数。

2.2 权重分析

  对于线性模型或者线性kernel的模型,权重指的是参数 θ=[θ0,θ1,...,θn] 。分析权重可以做更细化的工作,可以用特征组合来调整权重,比如房产中面积特征比较重要,为了更好的利用这个特征,可以对面积进行调整,细化出客厅面积、卧室面积、或者面积的平方等特征。绝不可以手工做权重调整哦。

2.3 Bad-case分析

  Bad-case分析也是经常要做的,怎么做呢?
  分类问题Bad-case分析:
1. 哪些训练样本分错了?
2. 我们哪部分特征使得它做了这个判定?
3. 这些bad cases有没有共性?例如bad的都是新产品,材质的问题?
4. 是否有还没挖掘的特性?分错的样本有没有新的特征是没考虑到的?
  回归问题Bad-case分析:哪些样本预测结果差距大, 为什么
  

2.4 模型融合

  模型融合目前是公司研究的重要一块内容。例如点击率预估模型中就包含了LR、GBDT等模型。模型融合具有客观的优点:“人多力量大”、“一万小时定律”。
1. Bagging:提高学习算法准确度。
  思想:不用全部的数据集,每次取一个子集训练一个模型。
  分类: 用这些模型的结果做vote
  回归: 对这些模型的结果取平均
      
2. Adaboost:解决分类问题。排除一些不必要的训练数据特征,并放在关键的训练数据上面。
  思想:针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。
  这里写图片描述
  D1是原始数据,需要区分正样本和负样本。刚开始简单的用一条线(弱分类)来分割,然后标记处分错的三个点,调整分类器,得到D2对应的图,依然有三个分错的。然后继续尝试用其他线来分割。
  这里写图片描述
  最后用这三种分类器的结果做一个融合,得到了正确的切分。最终用简单的方法得到比较好的结果。
  Gradient Boosting Tree和Adaboost的思路类似,解决的是回归问题。


3. 机器学习完整案例

  理论内容过后,寒老师用了一个小时讲结合实际工程案例进行讲解,感兴趣的可以看看。具体的工程案例分析:4月机器学习算法班-工作流程与模型调优


More

  1. 模型选择的讲解视频
  2. scikit-learn官网

以上是关于工作流程与模型调优的主要内容,如果未能解决你的问题,请参考以下文章

分类模型的评估和模型选择与调优

Spark 执行模型与性能调优,文末留言免费获取《Spark:大数据集群计算的生产实践》

Spark调优内存模型与参数调优

使用片段时 Intellij 无法正确识别 Thymeleaf 模型变量

实战——Nginx调优

模型选择与调优