机器学习算法基本工作流程
数据科学家 — 主要步骤
- 观察大局
- 获得数据
- 从数据探索和可视化中获得洞见
- 机器学习算法的数据准备
- 选择和训练模型
- 微调模型
- 展示解决方案
- 启动、监控和维护系统
观察大局
- 获取明确的目标任务
- 明确目标任务在整个系统流水线中的位置以及重要性
- 明确在流水线中前面的输入以及后面的输出情况
框架问题
- 业务目标
- 设定问题
- 选择算法
- 评测模型
- 调整模型
- pipeline
- 是否已有解决方案
- 监督or无监督or强化学习?分类or回归?批量or在线?(MapReduce)
选择性能指标
回归问题
- RMSE
- MAE
检查假设
列举和验证目前为止做出的假设,良好习惯,初期检查
获得数据
- 明确数据的来源以及是否实时或者定期更新数据
- 自动化创建函数获取数据以及常见工作目录
- 快速查看浏览数据的大致情况以及基本统计情况
- 划分数据集,创建出未受污染的测试集数据
创建工作区和下载数据
- 编写函数系统自动创建工作区目录和自动下载数据(以便于数据的实时更新)
快速查看数据
- 查看数据集的结构、数据的结构和统计描述,简单查看特征属性,可视化特征属性等等
创建测试集
- 经常被忽略但却是至关重要的
- 纯随机的抽样方法
- 分层抽样方法
从数据探索和可视化中获得洞见
- 明确数据集的特征属性以及目标变量
- 探索数据集的特征属性,获取有价值的信息
- 可视化数据集的特征属性,获取有意义的信息
- 简单统计特征属性,分析之间相关性,以及与目标变量的相关性
- 组合不同特征属性,创建新特征属性,以达到更能适合目标变量
看数据集的大小情况
- 如果训练集数据量特别大,就可以抽样一个探索数据集,操作更加简便快捷一些(探索的速度和效率)
- 如果数据集数据量小,可以直接在整个训练集上操作
- 将所有特征属性进行简单统计分析以及可视化分析
- 分析特征属性与目标变量之间的相关性 corr :线性关系 或者 非线性关系
试验不同属性的组合
- 识别一些异常值,需要提前清洗
- 发现不同属性之间相关性,特别与目标属性相关的属性
- 某些属性的分布明显 “重尾” 分布,需要进行转换处理,取对数
- 尝试不同属性之间的组合,试着创建新的属性
机器学习算法的数据准备
- 自动化对训练集数据进行转换,编写函数实现完整的数据处理流水线
- 数据清理,数据转换,特征选择、特征缩放等等处理流程
- 将算法的数据准备形成一个可以复用的流水线 Pipeline
学习算法的数据准备
编写函数来执行,而不是手动操作
- 可以在任何数据集上轻松实现这些转换(如获得更新的数据库)
- 可以建立起一个转换函数的函数库,项目之中重用
- 可以实时系统中使用这些函数来转换新数据
- 可以轻松尝试多种转换方式,那种转换的组合效果更佳
- 回到一个新的干净数据集(复制 strategic_train_set),然后将预测器和标签分开,两者不一定使用相同的转换方式,drop 函数会创建新副本,不影响 strat_train_set
数据清理
缺失值(total_bedrooms) 处理
- 放弃缺失值相应的地区(对应的行数据) —— DataFrame.dropna()
- 放弃缺失值严重的属性特征字段 —— DataFrame.drop()
- 填充缺失值(0、平均数、中位数等等)—— DataFrame.fillna()
数据转换
处理文本和分类属性
- 大部分算法都是与数值进行交互
- 将文本标签转化为数字
调用类似sklearn的转换器或者自定义转换器
- 虽然 sklearn 提供许多有用的转换器,有时需要自定义清理操作或者组合特定属性等任务,编写自己的转换器
- sklearn 依赖与鸭子类型(duck typing)编译,可以与sklearn自身的功能(如流水线pipeline)无缝衔接
- 创建一个类,然后添加这三个方法:fit() 返回自身、transform()、fit_transform()
特征缩放
- 最重要也是最需要应用到数据上的转换器
- 如果输入的数值属性具有非常大的比例差异,导致算法的性能表现不佳
- 案例中的房屋数据就是这样,房间总数范围从6到39320,而收入中位数的范围是0到15
- noting:目标值不需要缩放
- 同比例缩放所有属性,常用方法:最小-最大缩放 、标准化
最小-最大缩放(有称之 归一化)
- 将数值重新缩放使其最终范围归于 0 到 1 之间
- 实现方法是将值减去最小值并除于最大值和最小值的差
- sklearn 提供 MinMaxScaler 转换器,通过调整超参数 feature_range 进行对范围进行更改,不是 0-1
标准化
- 首先将值减去平均值(所以标准化值的均值总是零),然后除以方差,从而使得结果分布具备单位方差
- 不同于最小-最大缩放,标准化不会将值绑定到特定范围,对某些算法而言,可能是一个问题,但是标准化的方法受异常值的影响非常小
- sklearn 提供 StandardScaler 转换器,进行标准化
转换流水线
- 许多数据转换步骤需要正确的顺序来执行
- sklearn 提供 Pipeline 来支持这样的转换
选择和训练模型
- 选择算法模型
- 训练算法模型
- 评估算法模型
- 可视化算法模型效果
培训和评估训练集
- 训练一个线性回归模型
- why? 完全没有错误?这个模型真的做到完美?更有可能是这个模型对数据严重过度拟合了,怎么确定过拟合?
- 在对算法模型有信心之前,都不要触碰测试集,这里需要将训练集中一部分数据用于训练,另一部分用于模型的验证
使用交叉验证来更好的进行模型评估
- 评估决策时模型的一种方法是使用 train_test_split 函数对训练集划分为较小的训练集和验证集,
然后根据这些较小的训练集来训练模型,并对其进行评估。虽然有一定工作量,但是不会太难,而且非常有效。 - 另一个不错的选择就是使用 sklearn 的交叉验证功能。
- K-折(K-fold)交叉验证:将训练集随机划分 10 个不同的子集,每一个子集称之为一个折叠(fold),然后对决策树模型进行 10 次训练和评估——每次挑选一个折叠进行评估,其他9个折叠进行训练。最后的结果是一个包含 10 次评估分数的数组
- 随机森林模型的表现就要好一点,但请注意,训练集上的分数依然低于验证集,这意味着该模型依然对训练集过度拟合
解决过拟合方案
- 简化模型
- 约束模型(正规化,正则化)
- 获得更多训练数据
- 尝试其他算法模型,没有必要耗费过多时间调整超参数,目的是筛选(2-5)个有效模型
模型保存以及加载
- 每一个尝试过的模型应该保存,可以轻松回到想要的模型中
- 同时保存超参数以及训练过的参数,以及交叉验证的评分和实际预测的结果
- 轻松对比不同模型类型的评分,以及不同模型造成的错误类型
- 通过 Python 的 pickel 模型或者 sklearn.external.joblib 可以保存模型,有效将大型 Numpy 数组序列化
微调模型(调参过程)
- 手动调整模型超参数,选择最佳模型超参数
- 网格搜索方法
- 随机搜索方法
- 集成模型方法
微调模型方法
- 一种微调的方法是手动调整超参数,找到一组很好的超参数组合
- sklearn 的 GridSearchCV 来替代搜索
网格搜索
- GridSearchCV, 需要进行实验的超参数是什么,以及需要尝试的值,使用交叉验证来评估超参数值的所有可能组合
- noting : 数据准备的步骤也可以当做超参数处理
- 可以处理自动寻找处理问题的最佳方法,例如处理异常值、缺失特征以及特征选择等等
随机搜索
- 当探索的组合数量较少,网格搜索是一个不错的选择
- 当超参数的搜索范围较大,通常优先选择使用 RandomizedSearchCV
- RandomizedSearchCV 与 GridSearchCV 大致相同,但不会尝试所有可能的组合,
- 而是在每次迭代中为每个超参数选择一个随机值,然后对一定数量的随机组合进行评估
- RandomizedSearchCV 显著特点
- 如果运行随机搜索 1000 个迭代,那么将会探索每个超参数的 1000 个不同的值(不是想网格搜索方法那样每个超参数探索几个少量值)
- 通过简单地设置迭代次数,更好地控制要分配给探索的超参数的计算预算
集成方法
- 这是一种微调系统的方法,将表现最优的模型组合起来
- 组合(集成)的模型通常比单一模型表现更佳,特别是在单一模型会产生不同类型的错误时
分析最佳模型以及其错误
- 通过检查最佳模型,可以得到一些好的洞见
- 比如在进行准确预估时, RandomForestRegressor 可以指出每个属性的相对重要程度
- 有了这些信息之后,可以尝试删除一些不太有用的特征
- 了解系统产生的具体错误,尝试了解是怎么产生的,怎么解决(通过添加额外特征,删除没有信息的特征,清除异常值等等)
通过测试集评估系统
- 通过训练后,有了一个表现足够优秀的系统,用测试集评估最终模型
- 从测试集中获取预测器和标签,运行模型 full_pipeline 来转换数据,然后在测试集上评估最终模型
- 如果之前进行过大量的超参数调整,此时的评估结果通常会逊于之前使用交叉验证时的表现结果
(因为通过不断的调整,系统在验证数据上终于表现良好,在未知数据上可能达不到怎么好的效果)此时一定要忍住调整超参数的诱惑,不要试图努力让测试集的结果也变得好看,因为这些改进在泛化到新数据集时又会变得徒劳无功
展示解决方案
- 获得最佳的问题解决方案
- 展示解决方案(强调学习了什么,有什么用,什么没有用,基于什么假设,系统的限制等等)
- 记录所有事情,通过清晰的可视化和易于记忆的陈述方式,制作魅力演示文稿
启动、监控和维护算法模型系统
- 编写监控代码,以定期检查系统的实时性能表现,同时在性能下降时触发警报
- 需要捕捉的不仅是突然的系统崩溃,系统性能退化值得关注
- 需要定期的使用新数据训练模型
- 评估系统性能,需要对系统的预测结果进行抽样并评估,通常这一步需要人工分析,分析师是领域专家
- 还需要评估输入系统的数据的质量。质量较差的数据会导致性能下降,但是降到触发警报还需要一段时间,所有需要监控输入数据,捕捉这个异常信号
- 一般来说需要使用新数据定期训练模型,这个过程需要自动化
summary
- 机器学习项目大概是什么样子的流程
- 大部分工作在:数据准备、构建监控工具、建立人工评估的流水线、自动化定期训练模型
- 机器学习算法固然重要,但是对于整个流程熟悉也是前提
- 不是所有的时间都是用来掌握高级算法,而对于整个流程视而不见
- kaggle 是一个不错的平台,选择感兴趣的数据集,尝试整个流程
- kaggle 给定数据集,明确目标,还有小伙伴的经验分析
使用真实数据
流行的开放数据存储库
- UC Irvine Machine Learning Repository (http://archive.ics.uci.edu/ml/datasets.php)
- Kaggle datasets (https://www.kaggle.com/datasets)
- Amazon’s AWS datasets (https://registry.opendata.aws/)
元门户站点(列出开放的数据存储库)
- http://dataportals.org/
- https://opendatamonitor.eu/
- https://www.quandl.com/
机器学习算法基本工作流程相关推荐
- 机器学习的核心工作流程
- 机器学习算法-k-means聚类算法介绍
聚类算法介绍: 在"无监督学习"(unsupervised learning)中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的 ...
- 神经网络算法的具体流程,深度神经网络简单介绍
深度神经网络具体的工作流程是什么样的? 第一,深度神经网络不是黑盒,个人电脑开机直到神经网络运行在内存中的每一比特的变化都是可以很细微的观察的.没有任何神秘力量,没有超出科学解释的现象发生. 第二,深 ...
- 「AI科技」机器学习算法之K-means算法原理及缺点改进思路
https://www.toutiao.com/a6641916717624721933/ 2019-01-03 08:00:00 K-means算法是使用得最为广泛的一个算法,本文将介绍K-mean ...
- Java怎样掉包,如果不想你被称做掉包侠,那么请有效地学习机器学习算法知识...
机器学习远远超出了sklearn中简单的fit和predict方法. 背景: 现在大家都习惯说掉包侠这个词,尤其是人工智能领域.我的一个朋友就嘲笑我,说:"你这么久学会了什么?只是几 ...
- 人工智能概述、人工智能发展历程、人工智能主要分支、机器学习工作流程、完整机器学习项目的流程、机器学习算法分类、独立同分布、模型评估、深度学习简介
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 1.1 人工智能概述 1 人工智能应用场景 2 人工智能小案例 ...
- 关于找工作,说点对后人有用的话(内附机器学习算法岗面经)
作者:理性思考 链接:https://www.nowcoder.com/discuss/123128?type=post&order=time&pos=&page=4& ...
- python机器学习(一)算法学习的步骤、机器学习的应用及流程(获取数据、特征工程、模型、模型评估)
机器学习入门 机器学习中需要理论性的知识,如数学知识为微积分(求导过程,线性回归的梯度下降法),线性代数(多元线性回归,高纬度的数据,矩阵等),概率论(贝叶斯算法),统计学(贯穿整个学习过程),算法根 ...
- 笔记:机器学习的工作流程
1.机器学习工作流程介绍 本文学习如何思考机器学习问题.机器学习(ML)不仅关于数学和建模,而且关于选择问题的设置,识别客户需求和长期目标.本文的组织如下: 1.通过识别关键利益相关者,选择正确的度量 ...
最新文章
- 用composer安装laravel-bjyblog
- oracle 常用sql
- Android之linux基础教学之八 内核同步介绍
- 重写 隐藏 java_Java中方法的重写与成员变量的隐藏
- 为什么int型的数组用memset不能清零(memset的使用规范)
- pip install升级包
- QT的QFileOpenEvent类的使用
- Synergy 一套键鼠同时控制多台电脑的神器
- 坯子库和suapp哪个好用_「双全科技」进销存软件哪个简单好用,管家婆进销存软件教程...
- bat如何执行完上一条命令_一条更新语句是如何执行的?
- IAR下STM32进入HardFault_Handler
- 排序算法浅析(一)比较排序算法
- codeblocks16.01 中配置Opencv3 姿势
- 免积分下载与PDF转换
- React Native布局实践:开发京东客户端首页(三)——轮播图的实现
- 8255控制交通灯实验 c语言 main,交通灯控制实验
- 键盘上分数怎么计算机,分数符号怎样在电脑上?
- 在 UUP dump 被墙的情况下如何用 UUP 下载 ISO 镜像
- ppt的操作——添加页码
- Xms Xmx PermSize MaxPermSize的含义