机器学习算法基本工作流程

数据科学家 — 主要步骤

  1. 观察大局
  2. 获得数据
  3. 从数据探索和可视化中获得洞见
  4. 机器学习算法的数据准备
  5. 选择和训练模型
  6. 微调模型
  7. 展示解决方案
  8. 启动、监控和维护系统

观察大局

  1. 获取明确的目标任务
  2. 明确目标任务在整个系统流水线中的位置以及重要性
  3. 明确在流水线中前面的输入以及后面的输出情况

框架问题

  • 业务目标
  • 设定问题
  • 选择算法
  • 评测模型
  • 调整模型
  • pipeline
  • 是否已有解决方案
  • 监督or无监督or强化学习?分类or回归?批量or在线?(MapReduce)

选择性能指标

回归问题

  • RMSE
  • MAE

检查假设

列举和验证目前为止做出的假设,良好习惯,初期检查

获得数据

  1. 明确数据的来源以及是否实时或者定期更新数据
  2. 自动化创建函数获取数据以及常见工作目录
  3. 快速查看浏览数据的大致情况以及基本统计情况
  4. 划分数据集,创建出未受污染的测试集数据

创建工作区和下载数据

  • 编写函数系统自动创建工作区目录和自动下载数据(以便于数据的实时更新)

快速查看数据

  • 查看数据集的结构、数据的结构和统计描述,简单查看特征属性,可视化特征属性等等

创建测试集

  • 经常被忽略但却是至关重要的
  • 纯随机的抽样方法
  • 分层抽样方法

从数据探索和可视化中获得洞见

  1. 明确数据集的特征属性以及目标变量
  2. 探索数据集的特征属性,获取有价值的信息
  3. 可视化数据集的特征属性,获取有意义的信息
  4. 简单统计特征属性,分析之间相关性,以及与目标变量的相关性
  5. 组合不同特征属性,创建新特征属性,以达到更能适合目标变量

看数据集的大小情况

  • 如果训练集数据量特别大,就可以抽样一个探索数据集,操作更加简便快捷一些(探索的速度和效率)
  • 如果数据集数据量小,可以直接在整个训练集上操作
  • 将所有特征属性进行简单统计分析以及可视化分析
  • 分析特征属性与目标变量之间的相关性 corr :线性关系 或者 非线性关系

试验不同属性的组合

  1. 识别一些异常值,需要提前清洗
  2. 发现不同属性之间相关性,特别与目标属性相关的属性
  3. 某些属性的分布明显 “重尾” 分布,需要进行转换处理,取对数
  4. 尝试不同属性之间的组合,试着创建新的属性

机器学习算法的数据准备

  1. 自动化对训练集数据进行转换,编写函数实现完整的数据处理流水线
  2. 数据清理,数据转换,特征选择、特征缩放等等处理流程
  3. 将算法的数据准备形成一个可以复用的流水线 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 来支持这样的转换

选择和训练模型

  1. 选择算法模型
  2. 训练算法模型
  3. 评估算法模型
  4. 可视化算法模型效果

培训和评估训练集

  • 训练一个线性回归模型
  • why? 完全没有错误?这个模型真的做到完美?更有可能是这个模型对数据严重过度拟合了,怎么确定过拟合?
  • 在对算法模型有信心之前,都不要触碰测试集,这里需要将训练集中一部分数据用于训练,另一部分用于模型的验证

使用交叉验证来更好的进行模型评估

  • 评估决策时模型的一种方法是使用 train_test_split 函数对训练集划分为较小的训练集和验证集,
    然后根据这些较小的训练集来训练模型,并对其进行评估。虽然有一定工作量,但是不会太难,而且非常有效。
  • 另一个不错的选择就是使用 sklearn 的交叉验证功能。
  • K-折(K-fold)交叉验证:将训练集随机划分 10 个不同的子集,每一个子集称之为一个折叠(fold),然后对决策树模型进行 10 次训练和评估——每次挑选一个折叠进行评估,其他9个折叠进行训练。最后的结果是一个包含 10 次评估分数的数组
  • 随机森林模型的表现就要好一点,但请注意,训练集上的分数依然低于验证集,这意味着该模型依然对训练集过度拟合

解决过拟合方案

  1. 简化模型
  2. 约束模型(正规化,正则化)
  3. 获得更多训练数据
  4. 尝试其他算法模型,没有必要耗费过多时间调整超参数,目的是筛选(2-5)个有效模型

模型保存以及加载

  • 每一个尝试过的模型应该保存,可以轻松回到想要的模型中
  • 同时保存超参数以及训练过的参数,以及交叉验证的评分和实际预测的结果
  • 轻松对比不同模型类型的评分,以及不同模型造成的错误类型
  • 通过 Python 的 pickel 模型或者 sklearn.external.joblib 可以保存模型,有效将大型 Numpy 数组序列化

微调模型(调参过程)

  1. 手动调整模型超参数,选择最佳模型超参数
  2. 网格搜索方法
  3. 随机搜索方法
  4. 集成模型方法

微调模型方法

  • 一种微调的方法是手动调整超参数,找到一组很好的超参数组合
  • sklearn 的 GridSearchCV 来替代搜索

网格搜索

  • GridSearchCV, 需要进行实验的超参数是什么,以及需要尝试的值,使用交叉验证来评估超参数值的所有可能组合
  • noting : 数据准备的步骤也可以当做超参数处理
  • 可以处理自动寻找处理问题的最佳方法,例如处理异常值、缺失特征以及特征选择等等

随机搜索

  • 当探索的组合数量较少,网格搜索是一个不错的选择
  • 当超参数的搜索范围较大,通常优先选择使用 RandomizedSearchCV
  • RandomizedSearchCV 与 GridSearchCV 大致相同,但不会尝试所有可能的组合,
  • 而是在每次迭代中为每个超参数选择一个随机值,然后对一定数量的随机组合进行评估
  • RandomizedSearchCV 显著特点
    • 如果运行随机搜索 1000 个迭代,那么将会探索每个超参数的 1000 个不同的值(不是想网格搜索方法那样每个超参数探索几个少量值)
    • 通过简单地设置迭代次数,更好地控制要分配给探索的超参数的计算预算

集成方法

  • 这是一种微调系统的方法,将表现最优的模型组合起来
  • 组合(集成)的模型通常比单一模型表现更佳,特别是在单一模型会产生不同类型的错误时

分析最佳模型以及其错误

  • 通过检查最佳模型,可以得到一些好的洞见
  • 比如在进行准确预估时, RandomForestRegressor 可以指出每个属性的相对重要程度
  • 有了这些信息之后,可以尝试删除一些不太有用的特征
  • 了解系统产生的具体错误,尝试了解是怎么产生的,怎么解决(通过添加额外特征,删除没有信息的特征,清除异常值等等)

通过测试集评估系统

  • 通过训练后,有了一个表现足够优秀的系统,用测试集评估最终模型
  • 从测试集中获取预测器和标签,运行模型 full_pipeline 来转换数据,然后在测试集上评估最终模型
  • 如果之前进行过大量的超参数调整,此时的评估结果通常会逊于之前使用交叉验证时的表现结果
    (因为通过不断的调整,系统在验证数据上终于表现良好,在未知数据上可能达不到怎么好的效果)此时一定要忍住调整超参数的诱惑,不要试图努力让测试集的结果也变得好看,因为这些改进在泛化到新数据集时又会变得徒劳无功

展示解决方案

  1. 获得最佳的问题解决方案
  2. 展示解决方案(强调学习了什么,有什么用,什么没有用,基于什么假设,系统的限制等等)
  3. 记录所有事情,通过清晰的可视化和易于记忆的陈述方式,制作魅力演示文稿

启动、监控和维护算法模型系统

  • 编写监控代码,以定期检查系统的实时性能表现,同时在性能下降时触发警报
  • 需要捕捉的不仅是突然的系统崩溃,系统性能退化值得关注
  • 需要定期的使用新数据训练模型
  • 评估系统性能,需要对系统的预测结果进行抽样并评估,通常这一步需要人工分析,分析师是领域专家
  • 还需要评估输入系统的数据的质量。质量较差的数据会导致性能下降,但是降到触发警报还需要一段时间,所有需要监控输入数据,捕捉这个异常信号
  • 一般来说需要使用新数据定期训练模型,这个过程需要自动化

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/

你可能感兴趣的:(Python)