一个完整的机器学习项目在Python中演练(四)
大家往往会选择一本数据科学相关书籍或者完成一门在线课程来学习和掌握机器学习。但是,实际情况往往d是,学完之后反而并不清楚这些技术怎样才能被用在实际的项目流程中。就像你的脑海中已经有了一块块”拼图“(机器学习技术),你却不知道如何讲他们拼起来应用在实际的项目中。如果你也遇见过同样的问题,那么这篇文章应该是你想要的。本系列文章将介绍一个针对真实世界实际数据集的完整机器学习解决方案,让你了解所有部分如何结合在一起。
本系列文章按照一般机器学习工作流程逐步进行:
- 数据清洗与格式处理
- 探索性数据分析
- 特征工程和特征选取
- 机器学习模型性能指标评估
- 微调最佳模型(超参数)
- 在测试集上评估最佳模型
- 解释模型结果
- 总结分析
通过完成所有流程,我们将看到每个步骤之间是怎么联系起来的,以及如何在Python中专门实现每个部分。该项目在GitHub上可以找到,附实现过程。本篇文章将详细介绍第五-六个步骤,剩下的内容将在后面的文章中介绍。前四个步骤详见:数据清洗与格式处理、探索性数据分析、特征工程和特征选取、机器学习模型性能指标评估。
随机搜索与交叉验证
我们通过随机搜索与交叉验证的方法实现超参数调整:
我们使用随机搜索(Randam Search)来为我们的模型选择最佳超参数。我们定义一个网格(grid)后采用的是随机抽样的方式(random search)选取不同的超参数组合而不是像网格搜索尝试每一个超参数组合。(值得一提的是,使用随机搜索方法选择超参数的表现几乎和网格搜索一样,同时大大缩短了搜索时间。)
我们使用交叉验证(Cross Validation)的方法来评估所选超参数组合表现。这里我们选择使用K-Fold交叉验证,而不是将训练集直接分成单独的训练集和验证集,那样会减少我们可以使用的训练数据量。在k-折交叉验证中,原始样本被随机划分为k等份子样本。在k份子样本中,保留一个子样本作为测试模型的验证集,剩下的k-1子样本用作模型训练。重复进行k次(the folds)交叉验证过程,每一个子样本都作为验证数据被使用一次。然后,这些折叠的k结果可以被平均(或其他组合)产生一个单一的估计。最后,我们将K次迭代的平均误差作为最终的性能指标。
K = 5的K-fold交叉验证过程如下所示:
使用随机搜索与交叉验证验证选择最优超参数组合的步骤为:
-设置一个超参数的网格(grid)用于评估
- 随机抽样一组超参数
- 用选定的超参数组合创建一个模型
- 使用K-fold交叉验证评估模型
- 确定表现最佳的超参数组合
当然,我们实际上是调用Scikit-Learn工具库中封装好的RandomizedSearchCV函数来实现上述操作的。
背景介绍:梯度提升法(GBM)
我们先简单介绍一下我们将要使用的梯度提升回归(Gradient Boosted Regression)模型。梯度提升是一种用于回归和分类问题的机器学习技术,该技术以弱预测模型(通常为决策树)的集合的形式产生预测模型。本项目中使用的也是决策树。虽然诸如随机森林之类的集成算法是通过并行地训练弱“学习者”并分别“投票”进行预测,但像梯度提升这样的增强方法(boosting method)则是通过依次训练“学习者”,并且每个学习者“集中”学习前面“学习者”所不擅长的部分。
增强方法(boosting method)近年来越来越流行,并且频繁地在各种机器学习竞赛中名列前茅。梯度提升法(GBM)是使用梯度下降来优化代价函数的一种特定实现。具体来说,它通过基于残差顺序训练“学习者”来实现。另外,使用scikit-learn工具库来实现Gradient Boosting的效率通常被认为是低于XGBoost 等其他库的。但是,它对于我们本项目所用到的小数据集来说是足够的,并且相当准确。
超参数调整
梯度提升回归模型(Gradient Boosted Regressor)有多项超参数,具体可以查看Scikit-Learn官方文档以了解详细信息。本项目中将优化以下超参数:
-loss:损失函数的最小值设定
- n_estimators:所使用的弱“学习者”(决策树)的数量
- max_depth:决策树的最大深度
- min_samples_leaf:决策树的叶节点所需的最小示例个数
- min_samples_split:分割决策树节点所需的最小示例个数
- max_features:最多用于分割节点的特征个数
完全弄懂这些超参数之间的相互作用是比较难的,所以最佳的方式就是去尝试多种超参数组合。
在下面的代码中,我们构建一个超参数网格,创建一个RandomizedSearchCV对象,并使用含有超过25种不同的超参数组合的4折交叉验证来执行超参数搜索:
执行搜索后,我们可以“核查”RandomizedSearchCV对象来找到最佳模型:
然后,我们还可以再次进行网格搜索,通过选择接近这些最优值的网格参数来执行网格搜索。但是,进一步调整不太可能显著地改善我们的模型。通常来说,合适的特征工程对模型性能的影响要比广泛的超参数调整更大。机器学习的收益递减规律:特征工程可以帮助你实现较大的提升,而超参数调整通常只会带来很小的收益。
我们可以尝试单一改变estimators(决策树)的数量,来看下模型表现。我们可以通过可视化的方法直观的看到此时模型表现的变化。具体结果如下:
随着模型使用的树的个数增加,训练集误差和测试集误差都会减少。但是,训练集误差比测试集误差下降得快很多。同时也可以直观的推测出来这样的模型存在过拟合现象:它在训练集上表现非常好,但在测试集上无法达到相同的性能。
这可能与我们所期待的不一样,毕竟我们可以看到:它在训练集上表现有所提升。但是,对比训练集上与测试集上的表现的显著差距表明模型存在过拟合现象。通常来说,我们可以通过获取更多训练数据来解决过拟合问题,或者通过调整超参数降低模型的复杂度来解决。对于本项目,我们将保持原先选择的超参数组合,不再对estimators(决策树)的数量进行调整。有兴趣可以再多去尝试一下。
对于最终模型,我们设定estimators=800–交叉验证中最低误差时的超参数值。接下来,让我们测试该模型在测试集上的表现。
在测试集上评估最佳模型
在之前的步骤中我们已经确保了模型训练时不接触到测试集。因此,我们可以根据模型在测试集上的表现准确客观的评估模型的最终性能。
在测试集上进行预测并评价性能是相对直接的方式。这里,我们比较了使用默认超参数的梯度提升回归模型与微调后的模型的性能:
从上面可以看出超参数调整将模型表现提高了约10%。某些情况下10%可能算是一个巨大的改进了,但是在一个大的时间成本前提下。
我们也可以使用%timeit命令来比较一下模型训练花费的时间。首先是默认配置下的模型:
1秒的训练时间似乎是合理的。最终调整超参数后模型并不是那么快:
这也说明了机器学习的一个基本特性:它是一种“权衡游戏”。我们需要不断地平衡准确性与可解释性、偏差与方差、准确性与运行时间等表现。正确的混合将最终取决于问题。本项目中,相对而言运行时间增加12倍是恐怖的,但绝对而言又不是显著(增加了十几秒)。
我们已经得到了最终的测试集预测值,接下来我们就可以评估他们是否与真实值有着明显的偏差了。上边是预测值和实际值的密度图,下边是残差直方图:
从上面的两张图可以看出:虽然模型预测值得密度峰值接近中值在(66)附近,而非真实值的密度峰值(接近100),但模型预测值密度分布大致接近实际值密度分布。尽管我们可以看到一些模型预测值远低于真值的较大的负值,残差几乎是符合正态分布的。我们将在下一篇文章中深入探讨分析模型的结果。
结论
在本篇文章中,我们介绍了机器学习工作流程中的以下几个步骤:
- 使用随机网格搜索和交叉验证进行超参数调整
- 67在测试集上评估最佳模型
本次工作的结果表明,机器学习适用于本次任务-使用能源数据建立一个模型,可以预测建筑物的能源之星评分(ENERGY STAR Score)。使用梯度提升回归模型能够在测试集上的表现达到9.1分左右。此外,超参数调整可以在增加时间成本的情况下显著提高模型性能。虽然从实际表现来看我们的模型预测是准确的,但是我们也许想要或者应该知道模型可以做出来这种预测的原因和这些表现在针对我们的任务方面,实际上告诉了我们什么。这些问题将在下一篇文章中详细探讨。
一个完整的机器学习项目在Python中演练(四)的更多相关文章
- 一个完整的机器学习项目在Python中演练(三)
大家往往会选择一本数据科学相关书籍或者完成一门在线课程来学习和掌握机器学习.但是,实际情况往往是,学完之后反而并不清楚这些技术怎样才能被用在实际的项目流程中.就像你的脑海中已经有了一块块"拼 ...
- 一个完整的机器学习项目在Python中的演练(二)
大家往往会选择一本数据科学相关书籍或者完成一门在线课程来学习和掌握机器学习.但是,实际情况往往是,学完之后反而并不清楚这些技术怎样才能被用在实际的项目流程中.就像你的脑海中已经有了一块块"拼 ...
- 一个完整的机器学习项目在Python中的演练(一)
大家往往会选择一本数据科学相关书籍或者完成一门在线课程来学习和掌握机器学习.但是,实际情况往往是,学完之后反而并不清楚这些技术怎样才能被用在实际的项目流程中.就像你的脑海中已经有了一块块"拼 ...
- Sklearn 与 TensorFlow 机器学习实战—一个完整的机器学习项目
本章中,你会假装作为被一家地产公司刚刚雇佣的数据科学家,完整地学习一个案例项目.下面是主要步骤: 项目概述. 获取数据. 发现并可视化数据,发现规律. 为机器学习算法准备数据. 选择模型,进行训练. ...
- Hands on Machine Learning with sklearn and TensorFlow —— 一个完整的机器学习项目(加州房地产)
数据集地址:https://github.com/ageron/handson-ml/tree/master/datasets 先行知识准备:NumPy,Pandas,Matplotlib的模块使用 ...
- 3.Scikit-Learn实现完整的机器学习项目
1 完整的机器学习项目 完成项目的步骤: (1) 项目概述 (2) 获取数据 (3) 发现并可视化数据,发现规律. (4) 为机器学习算法准备数据. (5) ...
- 手把手搭建一个完整的javaweb项目
手把手搭建一个完整的javaweb项目 本案例使用Servlet+jsp制作,用MyEclipse和Mysql数据库进行搭建,详细介绍了搭建过程及知识点. 下载地址:http://download.c ...
- react全家桶从0搭建一个完整的react项目(react-router4、redux、redux-saga)
react全家桶从0到1(最新) 本文从零开始,逐步讲解如何用react全家桶搭建一个完整的react项目.文中针对react.webpack.babel.react-route.redux.redu ...
- 一个完整Java Web项目背后的密码
前言 最近自己做了几个Java Web项目,有公司的商业项目,也有个人做着玩的小项目,写篇文章记录总结一下收获,列举出在做项目的整个过程中,所需要用到的技能和知识点,带给还没有真正接触过完整Java ...
随机推荐
- Codeforces Round #612 (Div. 2)C. Garland
第四次写题解,请多指教! http://codeforces.com/contest/1287/problem/C题目链接 题目大意是有一个数字串挂有1-n n个数字,现在上面缺失了一些数字,让你找出 ...
- 远程桌面协议RDP
远程桌面协议RDP(Remove Desktop Protocol) 通过mstsc客户端远程连接计算机,并对其进行管理等操作. 与TELNET的区别在于,TELNET显示的是远程计算机的命令行窗口, ...
- Python 将两个绝对路径拼接
import os def two_abs_join(abs1, abs2): """ 将 绝对路径将两个绝对路径拼接, 就是将第二个的开路径(windows 的 C, ...
- Java程序员考研失败后的面试经历,oppo、VIVO、等面经
温馨提示:有些可能会遗漏个别问题,都是最近一周的面试,有点忘了. 浪潮(一面挂) 你是网络工程的?对网络很了解? 解释一下什么是广播域 怎么划分子网 说一下CSS的几种分类器 数据库中有哪些聚集函 ...
- 前端每日实战:149# 视频演示如何用纯 CSS 创作一个宝路薄荷糖的动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oagrvz 可交互视频 此视频是可 ...
- 运维介绍以及虚拟机,centos安装
运维的职责 1.企业的数据安全 2.网站7*24小时运行 3.企业服务好 服务器 服务器尺寸: 高度为单位:U(unit)1U=1.75英寸=4.45cm 服务器的分类: 机架式服务器 刀片式服务器 ...
- Navicat for MySQL12破解
本文摘抄自:https://blog.csdn.net/zhangli0910/article/details/83785147,https://blog.csdn.net/mmake1994/art ...
- Unity C# Scoket Thread
关于 Scoket和Thread 也没什么要说的,网上有很多资料.但是需要注意的是 Scoket和Thread 都需要创建和杀死.不然一定会造成程序假死.好了上代码 服务器: using System ...
- 添加谷歌拓展程序 vue.js devtools过程中的问题
在用vue做项目过程中,需要用到vue.js devtools,在从github上面clone下来代码,然后再npm install ,过程报错,然后更新npm包也是会有问题,以下是install的问 ...
- Flutter的盒子约束
由Expanded widget引发的思考 设计稿如下 布局widget分解 很常见的一种布局方式:Column的子widget中包含ListView @override Widget build(B ...