七月在线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月机器学习算法班-工作流程与模型调优