机器学习实战:基于Scikit-Learn、Keras和TensorFlow(原书第2版)

奥雷利安·杰龙

第1章 机器学习概览

  • 监督学习和无监督学习、在线学习和批量学习、基于实例学习和基于模型学习。

1.1 什么是机器学习

  • 让计算机无须进行明确编程就具备学习能力
  • 一个计算机程序利用经验E来学习任务T,性能是P,如果针对任务T的性能P随着经验E不断增长,则称为机器学习。

1.2 为什么使用机器学习

  • 善于处理对于传统方法而言太复杂或没有已知算法的问题
  • 使用机器学习方法挖掘大量数据来帮助发现不太明显的规律。这称作数据挖掘。
  • 有解决方案(但解决方案需要进行大量人工微调或需要遵循大量规则)的问题:机器学习算法通常可以简化代码,相比传统方法有更好的性能

1.4 机器学习系统的类型

  • 是否可以动态地进行增量学习(在线学习和批量学习)
  • 有监督学习、无监督学习、半监督学习和强化学习
  • 另一个典型的任务是通过给定一组称为预测器的特征(里程、使用年限、品牌等)来预测一个目标数值(例如汽车的价格)。
  • 属性是一种数据类型(例如“里程”),而特征取决于上下文,可能有多个含义,但是通常状况下,特征意味着一个属性加上其值
  • 这里是一些最重要的有监督学习算法(本书中会介绍):·k-近邻算法·线性回归·逻辑回归·支持向量机(SVM)·决策树和随机森林·神经网络[2]
  • 无监督学习的训练数据都是未经标记的
  • 这里有一些最重要的无监督学习算法(大部分会在第8章和第9章中介绍): ·聚类算法 ·k-均值算法 ·DBSCAN ·分层聚类分析(HCA) ·异常检测和新颖性检测 ·单类SVM ·孤立森林 ·可视化和降维 ·主成分分析(PCA) ·核主成分分析 ·局部线性嵌入(LLE) ·t-分布随机近邻嵌入(t-SNE) ·关联规则学习 ·Apriori ·Eclat
  • 降维的目的是在不丢失太多信息的前提下简化数据
  • 通常比较好的做法是,先使用降维算法减少训练数据的维度,再将其提供给另一个机器学习算法(例如有监督学习算法)
  • 关联规则学习,其目的是挖掘大量数据,发现属性之间的有趣联系。
  • 有些算法可以处理部分已标记的数据。这被称为半监督学习
  • 大多数半监督学习算法是无监督算法和有监督算法的结合
  • 所以它必须自行学习什么是最好的策略,从而随着时间的推移获得最大的回报。策略代表智能体在特定情况下应该选择的动作。
  • 在批量学习中,系统无法进行增量学习——即必须使用所有可用数据进行训练
  • 在在线学习中,你可以循序渐进地给系统提供训练数据,逐步积累学习成果。这种提供数据的方式可以是单独的,也可以采用小批量的小组数据来进行训练
  • 对于超大数据集——超出一台计算机的主存储器的数据,在线学习算法也同样适用(这称为核外学习)
  • 在线学习这个名字很容易让人产生误解。我们可以将其视为增量学习
  • 在线学习系统的一个重要参数是其适应不断变化的数据的速度,这就是所谓的学习率。如果设置的学习率很高,那么系统将会迅速适应新数据,但同时也会很快忘记旧数据
  • 如果给系统输入不良数据,系统的性能将会逐渐下降。
  • 基于实例的学习和基于模型的学习
  • 这被称为基于实例的学习:系统用心学习这些示例,然后通过使用相似度度量来比较新实例和已经学习的实例(或它们的子集),从而泛化新实例
  • 从一组示例集中实现泛化的另一种方法是构建这些示例的模型,然后使用该模型进行预测。这称为基于模型的学习
  • 通过你提供的训练样本,找出最符合提供数据的线性模型的参数,这称为训练模型
  • 训练一个模型意味着运行一种寻找模型参数的算法,使其最适合训练数据
  • 研究数据。·选择模型。·使用训练数据进行训练(即前面学习算法搜索模型参数值,从而使成本函数最小化的过程)。·最后,应用模型对新示例进行预测(称为推断),希望模型的泛化结果不错。

1.5 机器学习的主要挑战

  • 即便是非常大的样本数据,如果采样方式欠妥,也同样可能导致非代表性数据集,这就是所谓的采样偏差。
  • 一个成功的机器学习项目,其关键部分是提取出一组好的用来训练的特征集。这个过程叫作特征工程
  • 在机器学习中,这称为过拟合,也就是指模型在训练数据上表现良好,但是泛化时却不尽如人意。
  • 简化模型:可以选择较少参数的模型(例如,选择线性模型而不是高阶多项式模型)也可以减少训练数据中的属性数量,或者是约束模型。
  • 通过约束模型使其更简单,并降低过拟合的风险,这个过程称为正则化。
  • 在学习时,应用正则化的程度可以通过一个超参数来控制。超参数是学习算法(不是模型)的参数。因此,它不受算法本身的影响。超参数必须在训练之前设置好,并且在训练期间保持不变。
  • ·选择一个带有更多参数、更强大的模型。·给学习算法提供更好的特征集(特征工程)。·减少模型中的约束(例如,减少正则化超参数)
  • 如果算法是基于模型的,它会调整一些参数来将模型适配于训练集(即对训练集本身做出很好的预测),然后算法就可以对新的场景做出合理的预测。如果算法是基于实例的,它会记住这些示例,并根据相似度度量将它们与所学的实例进行比较,从而泛化这些新实例。

1.6 测试与验证

  • 保持验证:你只需保持训练集的一部分,以评估几种候选模型并选择最佳模型。新的保留集称为验证集
  • 如果你对数据绝对没有任何假设,那么就没有理由更偏好于某个模型,这称为没有免费的午餐(No Free Lunch,NFL)定理

2.2 观察大局

  • 你问老板的第一个问题应该是业务目标是什么,因为建立模型本身可能不是最终的目标。
  • 一个序列的数据处理组件称为一个数据流水线。
  • 你需要回答框架问题:是有监督学习、无监督学习还是强化学习?是分类任务、回归任务还是其他任务?应该使用批量学习还是在线学习技术?
  • 回归问题的典型性能指标是均方根误差(RMSE)
  • 范数指标越高,它越关注大值而忽略小值。这就是RMSE对异常值比MAE更敏感的原因。但是,当离群值呈指数形式稀有时(如钟形曲线),RMSE表现非常好,通常是首选。

2.3 获取数据

  • 常见的解决方案是每个实例都使用一个标识符来决定是否进入测试集(假定每个实例都有一个唯一且不变的标识符)

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

  • 相关系数仅测量线性相关性(“如果x上升,则y上升/下降”)。所以它有可能彻底遗漏非线性相关性(例如“如果x接近于0,则y会上升”)
  • 你还可能注意到某些属性的分布显示出了明显的“重尾”分布,于是你还需要对它们进行转换处理(例如,计算其对数)

2.5 机器学习算法的数据准备

  • 最小-最大缩放(又叫作归一化)很简单:将值重新缩放使其最终范围归于0~1之间。实现方法是将值减去最小值并除以最大值和最小值的差。

2.6 选择和训练模型

  • Scikit-Learn的交叉验证功能更倾向于使用效用函数(越大越好)而不是成本函数(越小越好)

2.7 微调模型

  • 可以用Scikit-Learn的GridSearchCV来替你进行探索

3.3 性能测量

  • 这说明准确率通常无法成为分类器的首要性能指标,特别是当你处理有偏数据集时