工作流程与模型调优

七月在线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官网
时间: 2024-10-09 11:23:13

工作流程与模型调优的相关文章

一次曲折的nginx+uwsgi问题排查、模型调优

业务的系统模型是nginx+uwsgi,跑的python代码,相当于mongoDB的一层读api,负责读写mongo的数据,20台服务器每天的访问量在7000万左右,通过HTTP API的方式被其他业务系统调用,算下来量不是很大,不过业务本身是最核心的数据源,nginx层面做了一层uwsgi cache,命中率在30%左右. 最近上了详细的日志分析质量监控后,发现了一些问题,其中一个问题是所有机房的响应时间会同一时刻突然抖动,平均响应时间从70ms抖动到5到10s,然后瞬间恢复,从状态码上看不出

数据清洗&模型调优

数据清洗来源:https://www.cnblogs.com/charlotte77/p/5606926.html 模型调优来源:https://www.cnblogs.com/zackstang/p/12313789.html 原文地址:https://www.cnblogs.com/jing-yan/p/12335188.html

机器学习系统模型调优实战--所有调优技术都附相应的scikit-learn实现

引言 如果你对机器学习算法已经很熟悉了,但是有时候你的模型并没有很好的预测效果或者你想要追求更好地模型性能.那么这篇文章会告诉你一些最实用的技术诊断你的模型出了什么样的问题,并用什么的方法来解决出现的问题,并通过一些有效的方法可以让你的模型具有更好地性能. 介绍数据集 这个数据集有569个样本,它的前两列为唯一的ID号和诊断结果 (M = malignant, B = benign) ,它的3->32列为实数值特征,我不是医学专家,我不太明白具体特征的是什么意思,都是关于细胞的,但是,机器学习的

[大数据性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析

本課主題 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质是什么,以及 Spark 在性能调优部份的要点,这两点让直式进入性能调优都是一个至关重要的问题,它的本质限制了我们调优到底要达到一个什么样的目标或者说我们是从什么本源上进行调优.希望这篇文章能为读者带出以下的启发: 了解大数据性能调优的本质 了解 Spark 性能调优要点分析 了解 Spark 在资

PHP 性能分析第三篇: 性能调优实战

注意:本文是我们的 PHP 性能分析系列的第三篇,点此阅读 PHP 性能分析第一篇: XHProf & XHGui 介绍 ,或  PHP 性能分析第二篇: 深入研究 XHGui. 在本系列的 第一篇 中,我们介绍了 XHProf .而在 第二篇 中,我们深入研究了 XHGui UI, 现在最后一篇,让我们把 XHProf /XHGui 的知识用到工作中! 性能调优 不用运行的代码才是绝好的代码.其他只是好的代码.所以,性能调优时,最好的选择是首先确保运行尽可能少的代码. OpCode 缓存 首先

Java虚拟机内存模型及垃圾回收监控调优

Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存模型         正如你上图所看到的,JVM内存可以划分为不同的部分,广义上,JVM堆内存可以划分为两部分:年轻代和老年代(Young Generation and Old Generation) 年轻代(Young Generation) 年轻代用于存放由new所生成的对象.当年轻代空间满时,

Spark2 Model selection and tuning 模型选择与调优

Model selection模型选择 ML中的一个重要任务是模型选择,或使用数据为给定任务找到最佳的模型或参数. 这也称为调优. 可以对诸如Logistic回归的单独Estimators进行调整,或者对包括多个算法,特征和其他步骤的整个Pipeline进行调整. 用户可以一次调整整个Pipeline,而不必单独调整Pipeline中的每个元素. MLlib支持使用CrossValidator和TrainValidationSplit等工具进行模型选择.这些工具需要以下items:    Est

通过案例学调优之--Oracle Time Model(时间模型)

通过案例学调优之--Oracle Time Model(时间模型) 数据库时间  优化不仅仅是缩短等待时间.优化旨在缩短最终用户响应时间和(或)尽可能减少每个请求占用的平均资源.有时这些目标可同时实现,而有时则需要进行折衷(如在并行查询时).通常可以认为,优化就是避免以浪费的方式占用或保留资源. 对数据库发出的任何请求都由两个不同的段组成:等待时间(数据库等待时间)和服务时间(数据库 CPU 时间).等待时间是各种数据库实例资源的所有等待时间的总和.CPU 时间是实际处理请求时消耗的时间的总和.

Spark2.0机器学习系列之2:基于Pipeline、交叉验证、ParamMap的模型选择和超参数调优

Spark中的CrossValidation Spark中采用是k折交叉验证 (k-fold cross validation).举个例子,例如10折交叉验证(10-fold cross validation),将数据集分成10份,轮流将其中9份做训练1份做验证,10次的结果的均值作为对算法精度的估计. 10折交叉检验最常见,是因为通过利用大量数据集.使用不同学习技术进行的大量试验,表明10折是获得最好误差估计的恰当选择,而且也有一些理论根据可以证明这一点.但这并非最终结论,争议仍然存在.而且似