《Python机器学习(原书第3版)》 image.png 作者:[美]塞巴斯蒂安·拉施卡(Sebastian Raschka) / [美]瓦希德·米尔贾利利(Vahid Mirjalili)
原作名:Python Machine Learning,Third Edition
ISBN:9787111681373
豆瓣链接:https://book.douban.com/subject/35485398/ (目前评分不足)
得到链接:https://www.dedao.cn/ebook/detail?id=5lZOKpMGr9mgdOvYa6Ej75XRo1NML3j2qk3k8ZVzb2nqPpDxBeJlK4AyQ8RPQv2z
Packt:https://www.packtpub.com/product/python-machine-learning-third-edition/9781789955750 (eBook 10$)
建议

  1. 建议英文好的看英文原版,中文版本公式比较粗糙,而且图形不是彩色的。
  2. 如果看中文版本,结合官方ipynb代码即markdown说明比较清晰。

C01 赋予计算机从数据中学习的能力

+ 1.2 机器学习分类

种类 \ 对比 特点 反馈 目的
监督学习 使用有标签数据 直接反馈 预测结果 / 未来
无监督学习 使用无标签数据 无反馈 寻找数据中的隐藏结构
强化学习 设定决策过程 奖励机制 学习一系列的行动

【超参数】

超参数:模型的调节旋钮

【标注约定】

image.png
鸢尾属植物数据集包含150个样本和4个特征,可以用150×4矩阵表示: :::success 读书笔记《Python机器学习》 - 图3

  1. 大写粗体字母表示矩阵读书笔记《Python机器学习》 - 图4
  2. 小写字母表示向量读书笔记《Python机器学习》 - 图5
  3. 读书笔记《Python机器学习》 - 图6的上标i指第读书笔记《Python机器学习》 - 图7个训练样本,下标读书笔记《Python机器学习》 - 图8表示训练样本的第j个维度
  4. 维度(列向量):读书笔记《Python机器学习》 - 图9表示第150个鸢尾花样本的第一个维度,即萼片长度
    读书笔记《Python机器学习》 - 图10
  5. 样本(行向量):该矩阵的每行代表一朵花的数据,可以写成4维行向量
    读书笔记《Python机器学习》 - 图11 :::

    + 1.4 机器学习构建路线图

    image.png

  6. 预处理:为了获得模型的最佳性能,许多机器学习算法要求所选特征的测量结果单位相同,通常通过把特征数据变换到[0,1]的取值范围,或者均值为0、方差为1的标准正态分布来实现

  7. 训练及选择预测模型:在实践中,至少要比较几种不同的算法,以便训练和选择性能最好的模型。但在比较不同的模型之前,我们首先要确定度量性能的指标。通常用分类准确率作为度量指标,其定义为正确分类的个体占所有个体的百分比
  8. 评估:在训练数据集上拟合并选择模型之后,我们可以用测试数据集来评估它在从来没见过的新数据上的表现,以评估泛化误差
  9. 预测:如果我们对模型的表现满意,那么就可以用它来预测未来的新数据

    C02 训练简单的机器学习分类算法

    【plus】线性代数表示说明

    1. 黑板粗体(Blackboard Bold)表示期望及线性代数空间读书笔记《Python机器学习》 - 图13
    2. 大写字母只有一种加粗表示方法,表示矩阵读书笔记《Python机器学习》 - 图14
    3. 小写加粗,表示向量;带下标不加粗表示向量中的单一维度的值
      读书笔记《Python机器学习》 - 图15
    4. 参考
      1. 加粗表示方法使用Latex中多种方式都可
        https://blog.csdn.net/sincerehz/article/details/88385217
        1. 推荐使用\bm
        2. mathpix识别出来的可以不改,效果一样
        3. \bf之后的所有字母都会加深,不要使用
      2. 不同字体渲染效果
        https://www.jianshu.com/p/6de552393933

+ 2.1 人工神经元

【神经元】

image.png

  1. Dendrites 树突
  2. Cell nucleus 细胞核
  3. Myelin sheath 髓鞘
  4. Axon 轴突
  5. Axon terninals 轴突终末

    【人工神经元】

    输入 —> (经过计算)静输入—> 决策函数 —> 输出 :::success

  6. 输入:输入值读书笔记《Python机器学习》 - 图17的线性组合与权重向量读书笔记《Python机器学习》 - 图18
    读书笔记《Python机器学习》 - 图19

  7. 静输入:读书笔记《Python机器学习》 - 图20
  8. 决策函数:读书笔记《Python机器学习》 - 图21如果某个特定样本的净输入值读书笔记《Python机器学习》 - 图22大于定义的阈值读书笔记《Python机器学习》 - 图23,则预测结果为1,否则为-1
    读书笔记《Python机器学习》 - 图24
  9. 简化:为了简化起见,我们把阈值读书笔记《Python机器学习》 - 图25放在等式的左边,权重零定义为读书笔记《Python机器学习》 - 图26(称为偏置)并定义读书笔记《Python机器学习》 - 图27。之后就可以更紧凑的方式来表达读书笔记《Python机器学习》 - 图28
    读书笔记《Python机器学习》 - 图29 ::: image.png

    2.1.2 感知器学习规则

    用代码实现的功能称为感知器,实现步骤为:

  10. 把权重初始化为0或者小的随机数

  11. 分别对每个训练样本读书笔记《Python机器学习》 - 图31
    1. 计算输出值
    2. 更新权重

更新权重的过程如下描述: :::success

  1. 输出值为预先定义好的单位阶跃函数预测的分类标签读书笔记《Python机器学习》 - 图32
  2. 更新权重矩阵读书笔记《Python机器学习》 - 图33,具体的向量更新读书笔记《Python机器学习》 - 图34
  3. 读书笔记《Python机器学习》 - 图35是用来更新读书笔记《Python机器学习》 - 图36的值,根据感知器学习规则计算该值:读书笔记《Python机器学习》 - 图37
  4. 读书笔记《Python机器学习》 - 图38为学习速率(一般是0.0~1.0之间的常数)
  5. 读书笔记《Python机器学习》 - 图39为第读书笔记《Python机器学习》 - 图40个训练样本的正确类标签,读书笔记《Python机器学习》 - 图41为预测的分类标签
  6. 二维数据集的更新可以表达为:
    读书笔记《Python机器学习》 - 图42 ::: 按照这个逻辑,我们可以用例子说明下当实际分类与预测分类相同时,权重更新值为0:
    读书笔记《Python机器学习》 - 图43
    而当实际分类与预测分类不同时,权重则会进行更新:
    读书笔记《Python机器学习》 - 图44
    带入数值感受一下,假设读书笔记《Python机器学习》 - 图45,而模型错把该样本判断为-1。在这种情况下,把相应的权重增加1,这样当下次再遇到该样本时,净输入读书笔记《Python机器学习》 - 图46就会更偏向阳,从而更有可能超过单位阶跃函数的阈值,把该样本分类为+1。
    读书笔记《Python机器学习》 - 图47
    权重更新与成正比,假设有另外一个样本读书笔记《Python机器学习》 - 图48被错误地分类为-1,得出的值为:
    读书笔记《Python机器学习》 - 图49
    注意:

  7. 注意只有两个类线性可分且学习速率足够小时,感知器的收敛性才能得到保证

  8. 如果不能用线性决策边界分离两个类,可以为训练数据集设置最大通过数(迭代次数)及容忍误分类的阈值,否则分类感知器将会永不停止地更新权重, 如下图中间及右侧的数据为线性不可分image.png
  9. 小结
    image.png
  10. 2.2.1代码解释

    1. 不把权重初始化为零的原因是,只有当权重初始化为非零的值时,学习速率才会影响分类的结果
    2. 如果把所有的权重都初始化为零,那么学习速率参数只会影响权重向量的大小,而无法影响其方向

      + 2.3 自适应线性神经元 vs 感知器

      image.png
      在感知器的基础上,Adaline有更好的表现,如上图所示:
  11. Adalin使用了线性函数(Perceptron使用的是阶跃函数)作为激活函数

  12. 这种方式让误差值随着静输入的大小而变化(错的越多,调整越多)
  13. Adaline激活函数为:读书笔记《Python机器学习》 - 图53

    2.3.1 通过梯度下降最小化代价函数

    【最小化代价函数】

  14. 代价函数Cost Function(翻译约定俗成:一般cost对应代价,error对应误差)。另外还有损失函数Loss Fuction:

    1. 损失函数:是定义在单个训练样本上的,也就是就算一个样本的误差,一般用读书笔记《Python机器学习》 - 图54表示
    2. 代价函数:是定义在整个训练集上面的,也就是所有样本的误差进行汇总求值,有多种汇总方式可选,比如可证这节的SSE,一般用读书笔记《Python机器学习》 - 图55表示
  15. 目标函数Target Function是进行算法优劣判断最后的函数,等于经验风险+结构风险,也就是Cost Function + 正则化项。其中正则化项是对损失函数复杂度的考量,越复杂这部分越大,这样计算是为了防止过拟合
  16. 对Adaline而言,权重的代价函数读书笔记《Python机器学习》 - 图56定义为:计算结果与真正分类标签之间的误差平方和(SSE):
    读书笔记《Python机器学习》 - 图57
  17. 添加读书笔记《Python机器学习》 - 图58只是为了方便,它使与权重参数相关的代价函数或者损失函数的梯度推导更容易
  18. 这种连续线性激活函数的主要优点是代价函数变得可分

    【批量梯度下降(Batch Gradient Descent,BGD)】


    image.png

  19. 可以用简单而强大的梯度下降的优化算法来寻找权重

  20. 通过在代价函数读书笔记《Python机器学习》 - 图60的梯度读书笔记《Python机器学习》 - 图61的相反方向上迈出一步来更新权重读书笔记《Python机器学习》 - 图62
  21. 要计算代价函数的梯度,我们需要分别用每个权重读书笔记《Python机器学习》 - 图63来计算代价函数的偏导数
    读书笔记《Python机器学习》 - 图64
  22. 这样就可以把权重读书笔记《Python机器学习》 - 图65的更新表达为
    读书笔记《Python机器学习》 - 图66
  23. 第三步的具体计算为
    读书笔记《Python机器学习》 - 图67
  24. 尽管Adaline的学习规则看起来与感知器一样,但应该注意的是当读书笔记《Python机器学习》 - 图68时,读书笔记《Python机器学习》 - 图69为实数而不是整数型分类标签
  25. 权重更新是基于训练数据集中所有样本进行计算的,而不是在每个样本之后逐步更新权重,这也就是为什么这种方法被称为批量梯度下降
  26. 在梯度下降中,learning rate参数对结果有很大影响,比如代码中0.01和0.001的对比
    image.png
  27. 左图显示选择学习速率太大将会出现的情况。因为所选的全局最小值太低,以至于代价函数无法最小化,结果误差经过每次迭代变得越来越大。另一方面,从右图可以看到代价在降低,但所选的学习速率η=0.0001太小,以至于算法需要经过多次迭代才能收敛到全局最低代价。
  28. 了如果改变某个特定权重参数的值来最小化代价函数J时会发生的情况。左图显示如果选择一个好的学习速率,代价会逐渐降低,向全局最小的方向发展。然而,右图显示如果选择的学习速率太大,将会错过全局最小值。
    image.png

    2.3.3 通过特征缩放改善梯度下降

  29. 梯度下降是从特征缩放受益的众多算法之一。

  30. 本节将用一种称为标准化的特征缩放方法,它可以使数据具有标准正态分布的特性:零均值和单位方差。标准化会使每个特征的均值以零为中心,并且每个特征的标准差为1。
  31. 对第读书笔记《Python机器学习》 - 图72个特征的标准化,我们可以简单地用每个训练样本值减去均值读书笔记《Python机器学习》 - 图73,然后再除以标准差读书笔记《Python机器学习》 - 图74:
    读书笔记《Python机器学习》 - 图75
  32. 转换前后对比:
    image.png

    2.3.4 大规模机器学习与随机梯度下降

    【随机梯度下降(Stochastic Gradient Descent,SGD)】

  33. 随机梯度下降(Stochastic Gradient Descent,SGD)算法是批量梯度下降算法的一种常用替代方法,它有时也称为迭代或在线梯度下降法。该方法并不是基于所有样本读书笔记《Python机器学习》 - 图77的累积误差之和来更新权重:
    读书笔记《Python机器学习》 - 图78

  34. 虽然随机梯度下降可以看作梯度下降的近似,但因为需要更频繁地更新权重,所以通常收敛得更快。
  35. 因为要根据单个训练实例来计算每个梯度,所以误差平面比梯度下降噪声更大。
  36. 当然这也有优势,因为如果采用非线性代价函数,随机梯度下降更容易逃脱浅度局部极小值。
  37. 要通过随机梯度下降获得满意的结果,很重要的一点是将训练数据以随机顺序呈现出来,同时要对训练数据集重新洗牌以防止迭代循环。
  38. 在随机梯度下降的实现中,固定的学习速率读书笔记《Python机器学习》 - 图79经常被随时间下降的自适应学习速率所取代,例如:
    读书笔记《Python机器学习》 - 图80
  39. 随机梯度下降的另外一个优点是它可以用于在线学习,在线学习中模型可以在数据到达时实时完成训练。
  40. 这对累积大量数据的情况特别有用(例如网络应用中的用户数据)。
  41. 采用在线学习的方法,系统可以立即适应变化,而且在存储空间有限的情况下,可以在更新模型后丢弃训练数据。

    【小批量(随机)梯度下降 mini-batch SGD】

  42. 批量梯度下降和随机梯度下降之间的折中就是所谓的小批量学习。正式名称中有个随机,一般省略,称为小批量梯度下降。

  43. 小批量学习可以理解为对训练数据的较小子集采用批量梯度下降,例如,每次32个训练样本。
  44. 小批量梯度下降的优点是可以通过更频繁的权重更新,实现快速收敛。
  45. 小批量学习允许利用线性代数概念中的向量化操作(例如,通过点积实现加权求和)取代随机梯度下降中训练样本上的for循环,进一步提高学习算法的计算效率。
  46. 如果要更新模型,例如,要实现流式数据的在线学习,可以对单个训练样本直接调用partial_fit方法,比如ada_sgd.partial_fit(X_std[0, :], y[0])

    C03 scikit-learn机器学习分类器

    + 3.3 基于逻辑回归的分类模型

  47. 逻辑回归是一种很容易实现的分类模型,但仅在线性可分类上表现不错,它是行业中应用最广泛的分类算法。

  48. 本章所介绍的逻辑回归模型也是一个用于二元分类的线性模型。
  49. 逻辑回归可以很容易地推广到多元分类,这被称为多项式逻辑回归或softmax回归。参考资料 http://rasbt.github.io/mlxtend/user_guide/classifier/SoftmaxRegression/

    3.3.1 逻辑回归与条件回归

    【原理解释】

  50. 让步比odds,当p表示预测事件(正事件,分类标签为1)发生的概率时读书笔记《Python机器学习》 - 图81

  51. logit函数是让步比的自然对数形式 读书笔记《Python机器学习》 - 图82
  52. logit函数的输入值取值在0到1之间,并将其转换为整个实数范围的值,可以用它来表示特征值和对数概率(log-odds)之间的线性关系:
    读书笔记《Python机器学习》 - 图83
  53. 这里的读书笔记《Python机器学习》 - 图84是给定特征读书笔记《Python机器学习》 - 图85,某个特定样本属于类1的条件概率。
  54. 实际上,我们感兴趣的是预测某个样本属于某个特定类的概率,它是logit函数的逆函数,即逻辑sigmoid函数,也称sigmoid函数或者S型函数:
    读书笔记《Python机器学习》 - 图86
    image.png
  55. 其中z为净输入,是权重和样本特征的线性组合:
    读书笔记《Python机器学习》 - 图88
  56. 可以看出,当读书笔记《Python机器学习》 - 图89趋向无限大时读书笔记《Python机器学习》 - 图90的值接近于1,因为当读书笔记《Python机器学习》 - 图91值很大时,读书笔记《Python机器学习》 - 图92的值会变得非常小。

    【Logit Regression —vs— Adaline】

  57. 区别为激活函数不同,Sigmoid -vs- Linear
    image.png

  58. sigmoid函数的输出则被解释为特定样本属于类1的概率读书笔记《Python机器学习》 - 图94其中读书笔记《Python机器学习》 - 图95读书笔记《Python机器学习》 - 图96参数化。
  59. 例如计算出读书笔记《Python机器学习》 - 图97说明该样本属于Iris-versicolor的概率为80%,该样本属于Iris-setosa的概率为20%。
  60. 预测概率可以通过阈值函数简单地转换为二元输出:
    读书笔记《Python机器学习》 - 图98

    3.3.2 学习逻辑代价函数的权重

  61. 根据上一章代价函数定义读书笔记《Python机器学习》 - 图99

  62. 为了在Adaline分类模型中学习权重读书笔记《Python机器学习》 - 图100,我们简化了函数。
  63. 在建立逻辑回归模型时,需要首先定义最大似然函数读书笔记《Python机器学习》 - 图101,假设数据集中的每个样本都是相互独立的:
    读书笔记《Python机器学习》 - 图102
  64. 应用对数函数降低数值下溢的可能性,这种情况在似然率非常小的情况下可能发生。其次,假如你还记得微积分的话,可以把因子乘积转换成因子求和,这样就可以通过加法技巧更容易地得到该函数的导数:
    读书笔记《Python机器学习》 - 图103
  65. 为了能更好地理解这个代价函数,让我们计算一个训练样本的代价:
    读书笔记《Python机器学习》 - 图104
  66. 如果y=0,第一项为零,如果y=1,第二项为零:
    读书笔记《Python机器学习》 - 图105

    【逻辑回归的梯度下降学习算法】

  67. 首先从计算对数似然函数的偏导数开始:
    读书笔记《Python机器学习》 - 图106

  68. 在继续我们的讨论之前,先计算sigmoid函数的偏导数:
    读书笔记《Python机器学习》 - 图107
  69. 现在可以在第一个等式中替换读书笔记《Python机器学习》 - 图108,得到下列等式:
    读书笔记《Python机器学习》 - 图109
  70. 目的是要找出可以最大化对数似然的权重,这样我们就可以通过下列方式更新每个权重:
    读书笔记《Python机器学习》 - 图110
  71. 由于最大化对数似然相当于最小化前面定义的代价函数读书笔记《Python机器学习》 - 图111,因此,可以得到下述梯度下降更新规则:
    读书笔记《Python机器学习》 - 图112

    3.3.3 将Adaline实现转换为一个逻辑回归算法

  72. 如果要自己动手实现逻辑回归,可以直接用新的代价函数取代第2章Adaline实现中的代价函数
    读书笔记《Python机器学习》 - 图113

    3.3.5 通过正则化解决过拟合问题

    image.png

  73. 过拟合是机器学习中的常见问题,虽然模型在训练数据上表现良好,但不能很好地泛化未见过的新数据或测试数据。

  74. 如果某个模型出现了过拟合问题,我们会说该模型有高方差,这有可能是因为相对于给定的数据,参数太多,从而导致模型过于复杂。
  75. 同样,模型也可能会出现欠拟合(高偏差)的情况,这意味着模型不足以捕捉训练数据中的复杂模式,因此对未知数据表现不佳。

    【偏差-方差权衡】

  76. 方差可以用于测量模型对特定样本进行分类时预测结果的一致性(或可变性)。可以说,模型对训练数据中的随机性很敏感。

  77. 偏差测量的是,假如在不同的训练数据集上反复建模,预测值离正确值有多远;偏置测量的是非随机性引起的系统误差。
  78. 课堂讲义扩展:https://sebastianraschka.com/pdf/lecture-notes/stat479fs18/08_eval-intro_notes.pd

    【正则化】

  79. 正则化背后的逻辑是引入额外的信息(偏差)来惩罚极端的参数值(权重)。最常见的正则化是所谓的L2正则化(有时也称为L2收缩或权重衰减),可写作:
    读书笔记《Python机器学习》 - 图115

  80. 读书笔记《Python机器学习》 - 图116为所谓的正则化参数。

    【正则化与特征归一化】

  81. 通过增加一个简单的正则项,就可以正则化逻辑回归的代价函数,这将在模型训练的过程中缩小权重
    读书笔记《Python机器学习》 - 图117

    + 3.4 使用支持向量机最大化分类间隔

  82. 另外一种强大而且广泛应用的机器学习算法是支持向量机(SVM),它可以看作感知器的扩展。

  83. 感知器算法的目标是最小化分类误差。而支持向量机算法的优化目标是最大化的分类间隔。
    image.png

    3.4.1 对分类间隔最大化的直观认识

  84. 决策边界间隔较大往往会产生较低的泛化误差,而间隔较小的模型则更容易产生过拟合。

  85. 推到之后,最终得到正、负超平面之间的距离:
    读书笔记《Python机器学习》 - 图119
  86. 在样本分类正确的条件约束下,最大化分类间隔也就是使读书笔记《Python机器学习》 - 图120最大化,这也是支持向量机的目标函数可以将其表示为:
    读书笔记《Python机器学习》 - 图121
  87. 这两个方程可以解释为:所有的负类样本基本上都落在负超平面一侧,而所有的正类样本都落在正超平面一侧,我们可以用更为紧凑的方式表达如下:
    读书笔记《Python机器学习》 - 图122
  88. 实际上,计算最小化读书笔记《Python机器学习》 - 图123的倒数更为容易,这可以通过二次规划的方法实现。

    3.4.2 用松弛变量解决非线性可分问题

  89. 松弛变量读书笔记《Python机器学习》 - 图124引出了所谓的软间隔分类。

  90. 引入松弛变量ξ的目的是对于非线性可分数据来说,需要放松线性约束,以允许在分类错误存在的情况下通过适当代价的惩罚来确保优化可以收敛。
  91. 可以直接把取值为正的松弛变量加入线性约束:
    (公式为剧中右对齐,左侧居中对齐的比较)
    读书笔记《Python机器学习》 - 图125
    读书笔记《Python机器学习》 - 图126
  92. 其中读书笔记《Python机器学习》 - 图127为数据集样本总数量。因此新的最小化(有约束)目标为:
    读书笔记《Python机器学习》 - 图128
  93. 可以通过变量C来控制对分类错误的惩罚。C值越大相应的错误惩罚就越大,如果选择的目标较小,则对分类错误的要求就不那么严格。因此,可以用参数C来控制间隔的宽度来权衡偏差与方差:
    image.png
  94. 这个概念与上节所讨论的正则化回归相关,即减小C值会增加偏差并降低模型的方差。
  95. 在实际的分类任务中,线性逻辑回归和线性支持向量机通常会产生非常相似的结果。
  96. 逻辑回归试图最大化训练数据的条件似然,使其比支持向量机更容易处理异常值点,支持向量机主要关心的是最接近决策边界(支持向量)的点。
  97. 另一方面,逻辑回归也有优点,其模型更简单且更容易实现。此外,逻辑回归模型更容易更新,这在处理流式数据时很有吸引力。

    3.4.3 其他的scikit-learn实现

  98. 在前几节中,我们用到了scikit-learn中的LogisticRegression类,它利用基于C/C++开发和高度优化的LIBLINEAR库。

  99. 类似地,用于训练SVM的SVC类使用了LIBSVM,它是一个专门为SVM准备的C/C++库。
  100. 与原生Python相比,用LIBLINEAR和LIBSVM的好处是,它允许快速训练大量线性分类器。
  101. 然而,有时候数据集太大而无法加载到内存。因此,scikit-learn也提供了SGDClassifier类供用户选择。
  102. 这个类还通过partial_fit方法支持在线学习。
  103. SGDClassifier类的逻辑与第2章为Adaline实现的随机梯度算法类似。初始化随机梯度下降感知器、逻辑回归感知器和带有默认参数的支持向量机的具体过程如下所示: ```python from sklearn.linear_model import SGDClassifier

ppn = SGDClassifier(loss=’perceptron’) lr = SGDClassifier(loss=’log’) svm = SGDClassifier(loss=’hinge’) ```

+ 3.5 用核支持向量机求解非线性问题

  1. 支持向量机在机器学习领域享有较高知名度的另一个原因是,它可以很容易使用“核技巧”来解决非线性分类问题。
  2. 在讨论核支持向量机的原理之前,让我们先创建一个样本数据集来认识一下所谓的非线性分类问题到底是什么。

    3.5.1 处理线性不可分数据的核方法

  3. 核方法的基本思想是针对线性不可分数据,建立非线性组合,通过映射函数ϕ把原始特征投影到一个高维空间,使特征在该空间变得线性可分。
    读书笔记《Python机器学习》 - 图130
    image.png

    3.5.2 利用核技巧发现高维空间的分离超平面

  4. 为了使用SVM解决非线性问题,需要调用映射函数读书笔记《Python机器学习》 - 图132将训练数据变换到高维特征空间,然后训练线性SVM模型对新特征空间里的数据进行分类。

  5. 可以用相同的映射函数读书笔记《Python机器学习》 - 图133对未知新数据进行变换,用线性支持向量机模型进行分类。
  6. 然而,这种映射方法的问题是构建新特征的计算成本太高,特别是在处理高维数据时。这就是所谓的核技巧可以发挥作用的地方。
  7. 际上只需要用读书笔记《Python机器学习》 - 图134替换点乘读书笔记《Python机器学习》 - 图135
    读书笔记《Python机器学习》 - 图136
  8. 其中使用最为广泛的核函数是径向基函数(RBF)核或简称为高斯核:
    读书笔记《Python机器学习》 - 图137
  9. 可以简化为:
    读书笔记《Python机器学习》 - 图138
  10. 其中读书笔记《Python机器学习》 - 图139是要优化的自由参数
  11. 简而言之,术语“核”可以理解为一对样本之间的相似函数。公式中的负号把距离转换为相似性得分,而指数运算把由此产生的相似性得分值控制在1(完全相似)和0(非常不同)之间。

    + 3.6 决策树学习

    image.png

  12. 基于训练数据集的特征,决策树模型通过对一系列问题的学习来推断样本的分类标签。

  13. 如果特征是像鸢尾花数据集这样的实数,这些概念也同样适用。例如,我们可以简单地定义萼片宽度特征轴的临界值,并且问一个二元问题:“萼片的宽度≥2.8厘米吗?”
  14. 使用决策树算法,我们从树根开始,在信息增益(IG)最大的特征上分裂数据。
  15. 各子节点在迭代过程中重复该分裂过程,直至只剩下叶子节点为止。这意味着所有节点上的样本都属于同一类。
  16. 在实践中,这可能会出现根深叶茂的树,这样容易导致过拟合。因此,我们通常希望通过限制树的最大深度来对树进行修剪(prune)。

    3.6.1 最大化信息增益

  17. 为保证在特征信息增益最大的情况下分裂节点,我们需要先定义目标函数,然后进行决策树学习和算法优化。
    读书笔记《Python机器学习》 - 图141

    1. 读书笔记《Python机器学习》 - 图142是分裂数据的特征依据
    2. 读书笔记《Python机器学习》 - 图143为父节点和第读书笔记《Python机器学习》 - 图144个子节点
    3. 读书笔记《Python机器学习》 - 图145为杂质含量
    4. 读书笔记《Python机器学习》 - 图146为父节点的样本数,读书笔记《Python机器学习》 - 图147是第读书笔记《Python机器学习》 - 图148个子节点的样本数
  18. 为简便起见,同时考虑到减少组合搜索空间,大多数软件库(包括scikit-learn)只实现二元决策树。这意味着每个父节点只有读书笔记《Python机器学习》 - 图149两个子节点:读书笔记《Python机器学习》 - 图150
  19. 二元决策树中,度量杂质含量或者分裂标准的三个常用指标分别为为基尼杂质度读书笔记《Python机器学习》 - 图151、熵读书笔记《Python机器学习》 - 图152、分类误差读书笔记《Python机器学习》 - 图153
  20. 我们从非空类读书笔记《Python机器学习》 - 图154(某节点t属于i类样本的概率)开始:
    读书笔记《Python机器学习》 - 图155
  21. 如果节点上的所有样本都属于同一个类,则熵为0,如果类的分布均匀,则熵值最大。
  22. 直观地说,可以把基尼杂质理解为尽量减少错误分类概率的判断标准:
    读书笔记《Python机器学习》 - 图156
  23. 与熵类似,如果类是完全混合的,那么基尼杂质最大,例如在二元分类中(c=2):
    读书笔记《Python机器学习》 - 图157

image.png

  1. 对于上图它包含40个分类标签为1的样本和40个分类标签为2的样本
  2. 分类误差作为标准,A与B相同(读书笔记《Python机器学习》 - 图159):
    读书笔记《Python机器学习》 - 图160
  3. 与场景A(读书笔记《Python机器学习》 - 图161)相比,基尼杂质有利于分裂场景B(读书笔记《Python机器学习》 - 图162):
    读书笔记《Python机器学习》 - 图163
  4. 与场景A(读书笔记《Python机器学习》 - 图164)相比,熵准则有利于分裂场景B(读书笔记《Python机器学习》 - 图165):
    读书笔记《Python机器学习》 - 图166

    3.6.3 多个决策树的随机森林组合

  5. 由于集成方法具有良好的分类性能和对过拟合的鲁棒性,该算法在机器学习的应用中广受欢迎。

  6. 第7章中,我们将讨论包括装袋(bagging)和集成(boosting)在内的不同集成方法,但是在这里我们将先讨论基于决策树的随机森林算法。
  7. 该算法以其良好的可扩展性和易用性而闻名。可以把随机森林视为决策树的集成。
  8. 随机森林的原理是对受较大方差影响的多个决策树分别求平均值,然后构建一个具有更好泛化性能和不易过拟合的强大模型。随机森林算法可以概括为以下四个简单的步骤:

    1. 随机提取一个规模为n的bootstrap样本(从训练数据集中有放回地随机选择n个样本)。
    2. 基于bootstrap样本生成决策树。在每个节点上完成以下的任务:
      1. 不放回地随机选择d个特征。
      2. 根据目标函数的要求,例如信息增益最大化,使用选定的最佳特征来分裂节点。
    3. 把步骤1和2重复k次。
    4. 聚合每棵树的预测结果,并以多数票机制确定标签的分类。在第7章中,我们将更详细地讨论多数票机制。

      3.7 k近邻(一种惰性学习算法)

      image.png
  9. 正确选择k值对在过拟合与欠拟合之间找到恰当的平衡至关重要。

  10. 必须确保选择的距离度量适合数据集中的特征。通常用简单的欧氏距离来度量,例如,鸢尾花数据集中的花样本,其特征以厘米为单位度量。
  11. 如果用欧氏距离度量,那么对数据进行标准化也很重要,确保每个特征都能对距离起着同样的作用。在前面代码中使用的minkowski距离是欧氏距离和曼哈顿距离的结合,可以表达如下:
    读书笔记《Python机器学习》 - 图168
  12. 维数诅咒:当固定规模的训练数据集的维数越来越大时,特征空间就变得越来越稀疏,这种现象被称为维数诅咒。直观地说,可以认为即使是最近的邻居在高维空间的距离也很远,以至于无法合适地估计。所以KNN算法已于过拟合。

    C04 构建良好的训练数据集 - 数据预处理

  13. 拆分数据集:在实践中,根据初始数据集的规模,最常用的划分比例为60:40、70:30或80:20。然而,对于大规模数据集,把训练数据集和测试数据集的划分比例定为90:10或99:1也是常见和适当的做法。例如,如果数据集包含超过100000个训练样本,则可以仅保留10000个样本进行测试,以获得对泛化性能的良好估计。
    Model evaluation, model selection, andalgorithm selection in machine learning
    https://arxiv.org/pdf/1811.12808.pdf

  14. 特征缩放(feature scaling):是预处理环节中很容易被遗忘的关键步骤。决策树和随机森林是机器学习算法中为数不多的不需要进行特征缩放的算法。这两种算法不受特征缩放的影响。然而,大多数其他的机器学习和优化算法,在特征缩放相同的情况下表现更佳。
  15. 归一化:指的是把特征重新缩放到区间[0,1],这是最小-最大缩放(min-max scaling)的特例:
    读书笔记《Python机器学习》 - 图169
  16. 标准化对于许多机器学习算法来说更为实用,通过标准化,我们可以把特征列的中心点设在均值为0且标准差为1的位置,这样特征列就呈标准正态分布(均值为0,方差为1),可以使学习权重更加容易。
    读书笔记《Python机器学习》 - 图170

    4.5.2 L2正则化的几何解释

  17. L2正则化为代价函数增加了惩罚项,与未正则化的代价函数所训练的模型相比,L2还能有效地抑制极端权重值。
    image.png

    4.5.3 L1正则化的稀疏解决方案

  18. 代价函数等高线与L1菱形在读书笔记《Python机器学习》 - 图172处相交。由于L1正则化系统的边界是尖锐的,因此这个交点更可能是最优的代价函数的椭圆与L1菱形边界的交点位于坐标轴上,从而促进了稀疏性。
    image.png

    C05 通过降维压缩数据

  19. 无监督数据压缩的主成分分析(principal component analysis, PCA)。

  20. 线性判别分析(linear discriminant analysis, LDA)作为最大化类可分性的监督降维技术。
  21. 核主成分分析(kernel principal component analysis, KPCA)进行非线性降维

    + 5.2 主成分分析

  22. 当使用逆序选择之类的特征选择算法时,数据集的原始特征保持不变,而当我们用特征提取方法时,会将数据变换或投影到新特征空间。

  23. 在降维的背景下,我们可以把特征提取理解为数据压缩的一种方法,其目的是保持大部分的相关信息。
  24. 在实际应用中,特征提取不仅可以优化存储空间或机器学习算法的计算效率,而且还可以通过减少维数诅咒提高预测性能,尤其是当我们处理非正则化模型的时候。

    5.1.1 主成因分析的主要步骤

  25. 主成分分析(PCA),这是一种无监督的线性变换技术,广泛应用于各种不同领域,特别是特征提取和降维。

  26. PCA的其他流行应用包括股票市场交易的探索性数据分析和去噪,以及生物信息学的基因组数据和基因表达水平分析。
  27. PCA帮助我们根据特征之间的相关性来识别数据中的模式。简单地说,PCA旨在寻找高维数据中存在最大方差的方向,并将数据投影到维数小于或等于原始数据的新子空间。
  28. 假设新特征轴彼此正交,该空间的正交轴(主成分)可以解释为方差最大的方向,如图所示。其中读书笔记《Python机器学习》 - 图174为原始特征轴,而读书笔记《Python机器学习》 - 图175为主成分方向。
    image.png
    1. 假设我们有一个特征向量读书笔记《Python机器学习》 - 图177
      读书笔记《Python机器学习》 - 图178
    2. 通过一个变换矩阵读书笔记《Python机器学习》 - 图179进行变换:
      读书笔记《Python机器学习》 - 图180
    3. 结果以向量的方式表达如下:
      读书笔记《Python机器学习》 - 图181
  29. PCA步骤总结

    1. 标准化d维数据集。
    2. 构建协方差矩阵。
    3. 将协方差矩阵分解为特征向量和特征值。
    4. 以降序对特征值排序,从而对相应的特征向量排序。
    5. 选择对应读书笔记《Python机器学习》 - 图182个最大特征值的读书笔记《Python机器学习》 - 图183个特征向量,其中k为新特征子空间的维数读书笔记《Python机器学习》 - 图184
    6. 由前k个特征向量构造投影矩阵读书笔记《Python机器学习》 - 图185
    7. 用投影矩阵读书笔记《Python机器学习》 - 图186变换d维输入数据集X以获得新的读书笔记《Python机器学习》 - 图187维特征子空间。

      5.1.2 逐步提取主成分

      【构建协方差矩阵】

  30. 构建读书笔记《Python机器学习》 - 图188维协方差:
    读书笔记《Python机器学习》 - 图189

3)获取协方差矩阵的特征值和特征向量。
# 4)以降序对特征值排序,从而对特征向量排序。

5.1.3 总方差和解释方差

  1. 因为我们想要通过将数据集压缩到新特征子空间来降低维数,所以只选择包含最多信息(方差)的特征向量(主成分)的子集。
  2. 特征值代表特征向量的大小,通过对特征值的降序排列,我们可以找出前读书笔记《Python机器学习》 - 图190个最重要的特征向量。
  3. 特征值读书笔记《Python机器学习》 - 图191的方差解释比就是特征值读书笔记《Python机器学习》 - 图192与特征值总和之比:
    读书笔记《Python机器学习》 - 图193

    C06 模型评估和超参数调优的最佳实践

  4. 获得对模型性能的评估。

  5. 诊断机器学习算法的常见问题。
  6. 机器学习模型调优。
  7. 采用不同的性能指标来评估预测模型。

    + 6.1 用流水线方法简化工作流

    6.1.2 在流水线中集成转换器和估计器

    image.png

    6.2.2 k折交叉验证

    【holdout方法】

    image.png

    【k折交叉验证】

    image.png

    + 6.3 用学习和验证曲线调试算法

    6.3.1 用学习曲线诊断偏差和方差问题

    image.png

  8. 左上图说明模型遇到高偏差问题。该模型的训练和交叉验证准确率均低,这说明模型对训练数据欠拟合。解决该问题的常用办法是增加模型的参数个数,例如,通过收集或构建额外的特征,或者放松正则化要求,就像在SVM或逻辑回归分类器所做的那样。

  9. 右上图说明模型遇到高方差问题,表现是模型在训练和交叉验证的准确率上有比较大的差别。要解决过拟合的问题,可以收集更多的训练数据,减少模型的复杂度,或者增加正则化的参数等。对于非正则化模型,它也有助于通过特征选择(参见第4章)或者特征提取(参见第5章)减少特征的数量,从而降低过拟合的程度。

image.png

6.3.2 用验证曲线解决过拟合和欠拟合问题

  1. 验证曲线是通过解决过拟合和欠拟合问题来提高模型性能的有力工具。
  2. 虽然验证曲线与学习曲线有关系,但是绘制的不是训练和测试准确率与样本规模之间的函数关系,而是通过调整模型参数来调优,例如逻辑回归中的逆正则化参数C。

    + 6.4 通过网格搜索调优机器学习模型

    机器学习有两类参数:一类是从训练数据中学习到的参数,例如逻辑回归的权重;另一类是单独优化的算法参数。后者为模型的调优参数,也被称为超参数,例如逻辑回归的正则化参数或者决策树的深度参数。

    6.4.1 通过网格搜索调优超参数

  3. 网格搜索方法非常简单:它属于暴力穷举搜索类型,我们预先定义好不同的超参数值,然后让计算机针对每种组合分别评估模型的性能,从而获得最优组合参数值。

  4. 尽管网格搜索是寻找模型最优参数组合的有力手段,但是评估所有可能参数组合的计算成本也非常昂贵。
  5. 随机搜索是scikit-learn的另外一种从不同参数组合中抽样的方法。随机搜索通常和网格搜索一样好,但是更具成本效益和时间效率。
  6. 如果仅通过随机搜索对60个参数组合进行采样,那么我们已经有95%的概率来获得最优性能5%以内的解(Random searchfor hyper-parameter optimization. Bergstra J, Bengio Y. Journal of Machine Learning Research. pp. 281-305, 2012)
  7. 扩展阅读:http://scikit-learn.org/stable/modules/grid_search.html#randomized-parameter-optimization

    6.4.2 通过嵌套式交叉验证选择算法

    image.png

  8. 这一节翻译有误。嵌套式交叉验证(m*n交叉验证),在外层循环时相同,使用最佳参数。但增加了内部循环。

  9. 内部循环则是使用不同的超参数进行训练,从图中看出,应该是训练集和验证集也有交叉,书中未作解释,待后续补充。
  10. 注意代码中GridsearchCV中的cv参数,即为Inner Loop的切分参数。

    1. cv2的话,CPU times: total: 78.1 ms
    2. 没有这个参数,CPU times: total: 141 ms
    3. 基本是2倍的关系,这里不用看wait time,只看cpu处理的时间。

      + 6.5 了解不同的性能评估指标

  11. 准确率,是有效且可量化的模型性能指标。还有几个其他的性能指标也可以度量模型的相关性:

  12. 精度
  13. 召回率
  14. F1分数

    6.5.1 分析混淆矩阵

    如果你有兴趣更深入地讨论不同的性能指标,例如精度和召回率,请阅读David M. W. Powers的技术报告Evaluation: FromPrecision, Recall and F-Factor to ROC, Informedness, Markedness & Correlation。
    可以在如下网站免费获得:http://www.flinders.edu.au/science_engineering/fms/School-CSEM/publications/tech_reps-research_artfcts/TRRA_2007.pdf

    6.5.3 绘制ROC曲线

  15. ROC(Receiver Operating Characteristic,受试者工作特征)曲线是选择分类模型的有用工具。

  16. 它以FPR和TPR的性能比较结果为依据,通过移动分类器的阈值完成计算。
  17. ROC的对角线可以解释为随机猜测,如果分类器性能曲线在对角线以下,那么其性能就比随机猜测还要差。
  18. TPR为1且FPR为0的完美分类器会落在图的左上角。
  19. 基于ROC曲线,可以计算所谓的ROC曲线下面积(Area Under the Curve,AUC)以描述分类模型的性能。
  20. http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_curve.html
  21. 对ROC AUC的分数感兴趣,也可以从sklearn.metrics子模块直接导入roc_auc_score函数。
  22. 准确率分数可以解释为ROC曲线上的一个截点,A. P. Bradley发现ROC AUC和准确率指标在大多数时间是相互一致的。

    6.5.4 多元分类评分指标

  23. 本节所讨论的评分指标是针对二元分类系统的。然而,scikit-learn也实现了宏观和微观的平均方法,以把二元分类的评分指标通过一对所有(OvA)扩展到解决多元分类问题。

  24. 对多元分类问题,scikit-learn默认支持加权宏平均值,可以调用sklearn.metrics模块的不同评分函数通过参数average来指定平均的方法,例如precision_score或make_scorer函数。

    6.5.5 处理类不均衡问题

  25. 在现实世界中,类的不均衡是个常见问题,即当数据集的一个或多个类的样本被过度代表的时候。

  26. 我们可以想到可能出现该问题的几个场景,如垃圾邮件过滤、欺诈检测或疾病筛查。
  27. 想象一下本章用过的包括90%健康病人的乳腺癌威斯康星数据集。在这种情况下,可以在无监督机器学习算法的帮助下,通过预测所有样本的多数类(良性肿瘤),在测试数据集上达到90%的准确率。因此,在这样的数据集上训练一个模型以达到大约90%的测试准确率,将意味着模型还没有从这个数据集所提供的特征中学到任何有用的东西。
  28. 在这样的数据集上拟合分类器,当比较不同模型的精度、召回率、ROC曲线时,无论在应用中最关心什么,都要将注意力集中在准确率以外的其他指标上。
  29. 在模型拟合过程中,处理不均衡类比例的一种方法是对少数类的错误预测给予更大的惩罚。在scikit-learn中,只要把参数class_weight设置成class_weight=’balanced’,就可以很方便地加大这种惩罚的力度,大多数的分类器都是这么实现的。
  30. scikit-learn库实现了简单的resample函数,可以通过从数据集中有放回地提取新样本来帮助少数类上采样。
  31. 另一种处理类不均衡问题的技术是人工生成训练样本,这超出了本书讨论的范围。使用最广泛的人工生成训练样本算法可能是人工生成少数类的过采样技术(Synthetic Minority Over-sampling Technique, SMOTE),要了解更多关于这项技术的详细信息,可阅读Nitesh Chawla等人撰写的论文(SMOTE: Synthetic Minority Over-sampling Technique, Journal ofArtificial Intelligence Research, 16: 321-357, 2002)。强烈建议下载imbalanced-learn,这是完全聚焦不均衡数据集的Python库,包括SMOTE的实现。可以从下述网站了解更多关于imbalanced-learn的信息:https://github.com/scikit-learn-contrib/imbalanced-learn

    C07 组合不同模型的集成学习

  32. 以多数票机制为基础做出预测。

  33. 使用装袋通过可重复地从训练数据集随机抽取样本组合来减少过拟合。
  34. 在从错误中学习的弱学习机基础上利用boosting建立强大的模型。

    + 7.1 集成学习

    image.png

  35. 如上图,可分为一致同意、多数票、相对多数票三类集成方法。

  36. 在使用中,一般用到的是多数票,Majority这一类。可细分为bagging袋装法和boosting提升法。
  37. 使用装袋通过可重复地从训练数据集随机抽取样本组合来减少过拟合。
  38. 在从错误中学习的弱学习机基础上利用boosting建立强大的模型。
  39. 在多数票机制下,可以集成不同的分类算法,例如,决策树、支持向量机、逻辑回归分类器等。
  40. 另外,我们也可以用相同的基本分类算法,分别拟合不同的训练数据子集。这种方法的突出例子是随机森林算法,它组合了不同的决策树分类器。image.png
  41. 为了通过简单的多数票机制预测分类标签,我们可以把每个独立分类器读书笔记《Python机器学习》 - 图202预测的分类标签组合起来,然后选择分类标签,从而选择得票最多的标签:
    读书笔记《Python机器学习》 - 图203
  42. 在二元分类任务中,class1=-1而class2=+1,多数票预测可以表达为:
    读书笔记《Python机器学习》 - 图204
  43. 为什么集成方法要比单分类器的效果更好。在下面的例子中,我们假设所有n个基本分类器所面对的都是二元分类任务,有相同的错误率读书笔记《Python机器学习》 - 图205。另外,我们假设分类器都是独立而且错误率互不相关。基于这些假设条件,我们可以直接把基本分类器集成的错误率表达为二项分布的概率质量函数:
    读书笔记《Python机器学习》 - 图206
  44. 读书笔记《Python机器学习》 - 图207为二项式系数读书笔记《Python机器学习》 - 图208选择读书笔记《Python机器学习》 - 图209。换句话说,计算集成预测出错的概率。现在,让我们看一个更为具体的示例,其中包括11个基本分类器(n=11),每个分类器错误率为0.25(ε=0.25):
    读书笔记《Python机器学习》 - 图210
  45. 二项式系数指从大小为n的集合中选择k个无序元素子集的组合数,通常被称为“n选k”。因为不考虑顺序,所以二项式系数有时也被称为组合或组合数,表达如下:
    读书笔记《Python机器学习》 - 图211
  46. 从下图中我们可以清楚地看到,只要基本分类器的性能优于随机猜测(ε<0.5),集成分类器的错误率总是比单一基本分类器的错误率要低。请注意,y轴描述了基本错误率(虚线)以及集成错误率(实线):
    image.png

    + 7.2 通过多数票机制组合分类器

    7.2.1 实现一个简单的多数票分类器

  47. 本节将要实现的算法可以把不同的分类算法及其各自相应权重组合起来。目标是建立一个更强大的超级分类器,以平衡单分类器在特定数据集上的弱点。可以用更精确的数学语言把加权多数票机制表达如下:
    读书笔记《Python机器学习》 - 图213

  48. scikit-learn的某些分类器也可以调用predictproba方法返回预测分类标签的概率。如果集成分类器预测得够精准,那么用预测的分类概率代替分类标签进行多数票表决是有用的。用分类概率进行预测的多数票机制的修改版本可以表达为(![](https://cdn.nlark.com/yuque/__latex/682c0b68650a300e306a3c6b09e974b5.svg#card=math&code=p%7Bij%7D&id=YFKCD)为第读书笔记《Python机器学习》 - 图214个分类器对分类标签读书笔记《Python机器学习》 - 图215预测的概率):
    读书笔记《Python机器学习》 - 图216
  49. 尽管MajorityVoteClassifier的实现对于演示非常有用,但在本书第1版的基础上,我们用scikit-learn实现了比多数票分类器更复杂的版本。在scikit-learn版本0.17或更高版的sklearn.ensemble.VotingClassifier上,我们可以找到该集成分类器。

    7.2.2 用多数票原则进行预测

  50. 先准备一个可以测试的数据集。既然已经熟悉了从CSV文件加载数据集的技术,我们就走捷径从scikit-learn的datasets集模块直接加载鸢尾花数据集。

  51. 此外,为了使演示的分类任务更具挑战性,我们将只选择萼片宽度和花瓣长度两个特征。虽然可以把MajorityVoteClassifier泛化到多元分类问题,但是我们只对Iris-versicolor和Iris-virginica花样本进行分类,然后计算ROC的线下面积。

    7.2.3 评估和优化集成分类器

  52. 本节将基于测试数据来计算ROC曲线,以检查MajorityVoteClassifier对未见过的新数据是否有良好的泛化性能。我们要记住,测试数据集将不会用于模型选择,其目的仅仅是对分类器的泛化性能报告无偏估计:
    image.png

  53. 了示例,我们只选择了两个特征来看看集成分类器决策区域的实际情况。虽然在模型拟合之前没有必要对训练数据的特征值进行标准化,但是因为逻辑回归和k-近邻流水线将自动处理它,所以我们要标准化训练数据集,以便决策树的决策区域有相同的比例尺度,从而达到可视化的目的:
    image.png

    + 7.3 bagging - 基于bootstrap样本构建集成分类器

    bagging是一种集成学习技术,它与在上一节中实现的方法紧密相关。然而,我们并没有使用相同的训练数据集来拟合集成中的各个分类器,而是从初始训练数据集中抽取bootstrap样本(随机有放回样本),这就是为什么bagging方法也被称为bootstrap聚合(bootstrap aggregating):
    image.png

    + 7.4 通过自适应boosting提高弱学习机的性能(AdaBoost)

    在boosting中,集成是由很简单的常被称为弱学习机(weak learner)的基本分类器所组成,性能仅比随机猜测略优,弱学习机的典型例子是单层决策树。boosting背后的关键概念是专注于难以分类的训练样本,即让弱学习机从训练样本的分类错误中学习来提高集成的性能。

    7.4.1 boosting的工作原理

    【adaboost工作原理】

    image.png

  54. 首先,我们从子图1开始了解AdaBoost的详情,这是一个二元分类训练数据集,所有的训练样本拥有相同的权重。

  55. 我们基于该训练数据集来训练单层决策树(虚线),以完成对三角形和圆形两类样本的分类,该任务可以通过最小化代价函数(或在决策树集成的特殊情况下的杂质得分)完成。
  56. 其次,在子图2中,我们为前面子图1中误判的两个圆形样本增加权重。此外减少被正确分类的那些样本的权重。
  57. 下一个单层决策树将更多聚焦在权重较大的训练样本上,这些训练样本很难分类。子图2中的弱学习机把三个圆形样本错误地分类,随后这三个样本被赋予较大的权重,如子图3所示。
  58. 假设AdaBoost集成只进行三轮boosting,那么将在三个不同的训练数据子集上通过加权多数票把弱学习机组合起来,如子图4所示。

    【adaboost伪代码】

    让我们用伪代码更加详细地观察该算法。为清楚起见,用读书笔记《Python机器学习》 - 图221表示元素之间的相乘,用·来表示两个向量之间的点积:

  59. 把权重向量读书笔记《Python机器学习》 - 图222定义为一致权重,其中读书笔记《Python机器学习》 - 图223

  60. 对于第读书笔记《Python机器学习》 - 图224轮bootting(一共读书笔记《Python机器学习》 - 图225轮boosting),做以下几件事:
    1. 训练有权重的弱学习机:读书笔记《Python机器学习》 - 图226
    2. 预测分类标签:读书笔记《Python机器学习》 - 图227
    3. 计算加权错误率:读书笔记《Python机器学习》 - 图228
    4. 计算系数:读书笔记《Python机器学习》 - 图229
    5. 更新权重:读书笔记《Python机器学习》 - 图230
    6. 归一化权重使其和为1:读书笔记《Python机器学习》 - 图231
  61. 计算最终的预测结果:
    读书笔记《Python机器学习》 - 图232
  62. 数值表格
    image.png

    【总结】

  63. 单分类器相比,值得我们注意的是,集成学习增加了计算复杂度。需要我们在实践中认真考虑是否愿意为适度提高预测性能而增加计算成本。

  64. 关于预测性能与计算成本两者之间的权衡问题,一个常被提及的例子就是著名的Netflix100万美元大奖,它就是靠集成技术赢得的。
  65. 关于该算法的细节见文献
    https://www.asc.ohio-state.edu/statistics/dmsl/GrandPrize2009_BPC_BigChaos.pdf
  66. “我们离线评估了一些新方法,但是所测量到的额外准确率改善似乎并不能平衡将其引入生产环境所需耗费的工程努力。”
  67. 梯度boosting:自适应boosting和梯度boosting这两种方法的主要区别在于权重的更新方式以及(弱)分类器的组合方式。除了scikit-learn中实现的GradientBoostingClassifie之外,scikit-learn版本0.21包括了甚至比XGBoost更快的梯度boosting版本HistGradientBoostingClassifier。

    C10 用回归分析预测连续目标变量

    + 10.1 线性回归简介

    线性回归的目的是针对一个或多个特征与连续目标变量之间的关系建模。与监督学习分类相反,回归分析的主要目标是在连续尺度上预测输出,而不是在分类标签上。在下面的小节中,我将介绍线性回归的最基本类型,即简单线性回归。

    10.1.1 简单线性回归

    image.png

  68. 简单(单变量)线性回归的目的是针对单个特征(解释变量x)和连续目标值(响应变量y)之间的关系建模。拥有一个解释变量的线性回归模型的方程定义如下:
    读书笔记《Python机器学习》 - 图235

  69. 这里权重读书笔记《Python机器学习》 - 图236代表y轴截距,读书笔记《Python机器学习》 - 图237为解释变量的权重系数。我们的目标是学习线性方程的权重,以描述解释变量和目标变量之间的关系,然后预测训练数据集里未见过的新响应变量。
  70. 这条最佳拟合线也被称为回归线,从回归线到样本点的垂直线就是所谓的偏移(off-set)或残差(residual)——预测的误差。

    10.1.2 多元线性回归

  71. 前一节引入了单解释变量的线性回归分析,也称为简单线性回归。当然,也可以将线性回归模型推广到多个解释变量,这个过程叫作多元线性回归:
    读书笔记《Python机器学习》 - 图238

  72. 与一般的想法相反,训练线性回归模型并不要求解释变量或目标变量呈正态分布。正态假设只是针对某些统计和假设检验的要求,

    10.2.3 用相关矩阵查看关系

  73. 相关矩阵是包含皮尔逊积矩相关系数(通常简称为皮尔逊r)的方阵,我们用它来度量特征对之间的线性依赖关系。

  74. 相关系数的值在-1到1之间。如果r=1,则两个特征之间呈完美的正相关;如果r=0,则两者之间没有关系;如果r=-1,则两者之间呈完全负相关的关系。
  75. 我们可以把皮尔逊相关系数简单地计算为特征x和y之间的协方差
    读书笔记《Python机器学习》 - 图239
  76. 可以证明,一对经标准化的特征之间的协方差实际上等于它们的线性相关系数。

    + 10.3 普通最小二乘线性回归模型的实现

  77. 我们提到过可以把线性回归理解为通过训练数据的样本点获得最佳拟合直线。

  78. 然而,我们既没有定义最佳拟合(best-fitting),也没有讨论过拟合模型的不同技术。
  79. 下面的小节,我们将用普通最小二乘(OLS)法(有时也称为线性最小二乘)来填补缺失的部分并估计线性回归的参数,从而使样本点与线的垂直距离(残差或误差)之平方和最小。

    10.3.1 用梯度下降方法求解回归参数

  80. 在第2章中,我们实现了自适应线性神经元(Adaline)。同时,我们还定义了代价函数读书笔记《Python机器学习》 - 图240,并通过优化算法来最小化代价函数的学习权重,这些算法包括梯度下降(GD)和随机梯度下降(SGD)。Adaline的代价函数是误差平方和(SSE),它与OLS所用的代价函数相同:
    读书笔记《Python机器学习》 - 图241

    + 10.4 利用RANSAC拟合鲁棒回归模型

  81. 线性回归模型可能会受到异常值的严重影响。在某些情况下,一小部分数据可能会对估计的模型系数有很大的影响。

  82. 有许多统计检验可以用来检测异常值,然而,去除异常值需要数据科学家的判断以及相关领域知识。
  83. 除了淘汰异常值之外,我们还有一种鲁棒回归方法,即随机抽样一致性(RANdom SAmple Consensus,RANSAC)算法,根据数据子集(所谓的内点,inlier)来拟合回归模型。(即RANSAC可以避免异常值的影响)
  84. RANSAC算法:

    1. 随机选择一定数量的样本作为内点来拟合模型。
    2. 用模型测试所有其他的数据点,把落在用户给定公差范围内的点放入内点集。
    3. 用内点重新拟合模型。
    4. 估计模型预测结果与内点集相比较的误差。
    5. 如果性能达到用户定义的阈值或指定的迭代数则终止算法;否则返回到步骤1。

      + 10.5 评估线性回归模型的性能

  85. 对MSE的解释取决于数据集和特征缩放。例如,如果以1000(用K表示)为单位计算房价,与未使用特征缩放的模型相比,该模型所产生的MSE较低。

  86. 有时候,报告决定系数读书笔记《Python机器学习》 - 图242可能更为有用,我们可以把这理解为MSE的标准版,其目的是为更好地解释模型的性能。换句话说读书笔记《Python机器学习》 - 图243是模型捕获到的响应方差函数的一部分。我们定义读书笔记《Python机器学习》 - 图244值如下:
    读书笔记《Python机器学习》 - 图245
  87. 这里,SSE是平方误差之和,而SST是平方和之总和:
    读书笔记《Python机器学习》 - 图246
  88. 换句话说,SST只是反应的方差。下面将很快证明读书笔记《Python机器学习》 - 图247的确只是修正版的MSE:
    读书笔记《Python机器学习》 - 图248

    + 10.6 用正则化方法进行回归

  89. 正则化是通过添加额外信息解决过拟合问题的一种方法,而缩小模型参数值却引来复杂性的惩罚。

  90. 正则线性回归最常用的方法包括所谓:

    1. 岭回归
    2. 最小绝对收缩与选择算子(LASSO)
    3. 弹性网络(ElasticNet)

      + 10.7 将线性回归模型转换为曲线 - 多项式回归

  91. 一种有效解决违背线性假设的方法是,通过增加多项式项利用多项式回归模型:
    读书笔记《Python机器学习》 - 图249

    + 10.8 用随机森林处理非线性关系

  92. 随机森林是多棵决策树的组合,可以理解为分段线性函数之和,与以前讨论过的全局性线性和多项式回归模型相反。换句话说,通过决策树算法,我们可以进一步将输入空间细分为更小的区域,这些区域也因此变得更易于管理。

    10.8.1 决策树回归

  93. 决策树算法的一个优点是,如果处理非线性数据,它不需要对特征进行任何转换。因为决策树一次只分析一个特征,而不是考虑加权组合。

  94. 通过迭代分裂节点,直到叶子是纯的,或者满足停止分裂的标准为止,以培养一棵决策树。
  95. 当用决策树进行分类时,定义熵作为杂质的指标以确定采用哪个特征分裂可以最大化信息增益(Information Gain, IG),二进制分裂可以定义为:
    读书笔记《Python机器学习》 - 图250
  96. 在决策树回归的背景下,通常我们也把MSE称为节点方差(within-node variance),这就是我们也把分裂标准称为方差缩减(variance reduction)的原因。
  97. 这种模式的一个局限性在于它并不捕获所需预测的连续性和可微性。
  98. 此外,在选择树的适当深度值时要小心,既要确保不过拟合也要避免欠拟合。这里深度为3似乎是个不错的选择。

    10.8.2 随机森林回归

  99. 核技巧,它可以与支持向量机(SVM)组合完成分类任务,这对处理非线性问题很有用。虽然这方面的讨论超出了本书的范围,但支持向量机也可以用于非线性回归任务。

  100. 感兴趣的读者可以在一篇优秀的研究报告(Support VectorMachines for Classification and Regression)
  101. scikit-learn也实现了SVM回归:http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html#sklearn.svm.SVR

    C11 用聚类分析处理无标签数据

    索聚类分析,这是一种无监督学习技术,在无法预先知道正确答案的情况下发现数据中的隐藏结构。聚类的目标是在数据中找到自然分组,以确保相同集群中的元素比不同集群中的元素更相似。

  102. 使用流行的k-均值算法寻找相似性中心。

  103. 采用自下而上的方法构建层次聚类树。
  104. 用基于密度的聚类方法识别任意形状的物体。

    + 11.1 用k-均值进行相似性分组

    11.1.1 用scikit-learn实现k-均值聚类

  105. 与其他的聚类算法相比,k-均值算法极易实现而且计算效率也很高,这也许可以解释为什么它这么流行。k-均值算法属于基于原型聚类的范畴。在本章的后面,我们将讨论层次化(hierarchical)和基于密度(density-based)的另外两种聚类方法。

  106. 基于原型的聚类意味着每个类都由一个原型表示,该原型通常是具有连续特征的相似点的质心(centroid)(平均值),或者,对分类特征而言,该原型为类中心(medoid)——最具代表性的点,或距离类中所有其他点最近的点。
  107. k-均值方法非常擅长识别球形集群,其缺点是必须指定集群数k,所以它是个【先验方法】。
  108. 在本章的后面,我们将讨论肘部方法(elbow)和轮廓图(silhouette plot),这是评估聚类质量以确定最优集群数k的有效技术。
  109. 虽然k-均值在这个小数据集上工作得很好,但是我们必须指出k-均值的另外一个缺点:必须在无推理的前提下指定集群的数目k。在实际应用中,选择的集群数目可能并不总是那么明显,特别是在处理无法可视化的高维数据集时。

    11.1.2 k-均值++ - 更聪明地设置初始集群质心的方法

  110. 到目前为止,我们已经讨论了用随机种子设置初始值质心的经典k-均值算法,有时如果初始集群质心选择不当就会导致聚类不良或收敛缓慢。解决这个问题的一种方法是在数据集上多次运行k-均值算法,并根据SSE选择性能最佳的模型。

  111. 另一个策略是通过k-均值++算法,让初始质心彼此尽可能远离,带来比经典k-均值更好且更一致的结果。书中的解释有些不好理解,核心是可选择质心点的加权概率。即距离前面质心点越远的点,越容易被选中。具体过程:

    1. 从数据点中随机选择第一个质心
    2. 对于每个数据点,计算它与先前选择的最近质心的距离
    3. 从数据点中选择下一个质心,使得选择一个点作为质心的概率与它与先前选择的最近质心的距离成正比。(也就是说,与最近的质心距离最远的点最有可能被选为下一个质心)
    4. 重复步骤2和步骤3,直到取得 k 个质心

      11.1.3 硬聚类与软聚类

  112. 与此相反,软聚类(有时也称为模糊聚类)将一个样本分配给一个或多个集群。常见的软聚类例子是模糊C-均值(FCM)算法(也被称为软k-均值或模糊k-均值)。

  113. 四个关键步骤:
    1. 指定k质心的数量然后随机为每个质心点分配集群成员。
    2. 计算集群的质心读书笔记《Python机器学习》 - 图251
    3. 更新每个点的集群成员
    4. 重复步骤2和步骤3,直到成员系数不再变化或达到用户定义的容忍阈值或最大迭代数。
    5. 我们把FCM的目标函数缩写为读书笔记《Python机器学习》 - 图252,该函数看起来非常像在k-均值中见过的群内误差平方和:
      读书笔记《Python机器学习》 - 图253
  114. FCM的每次迭代都比k-均值中的迭代更为昂贵。然而FCM通常只需要较少的迭代就能收敛。
  115. scikit-learn目前还没有实现FCM算法。然而,在实际应用中我们已经发现,k-均值和FCM产生非常相似的聚类结果。

    11.1.5 通过轮廓图量化聚类质量

  116. 评估聚类质量的另一个有内在联系的度量是轮廓分析(silhouette analysis),它也可以应用于k-均值以外的聚类算法。

  117. 轮廓分析可以作为图形工具来绘制度量集群中样本分组的紧密程度。可以用以下三个步骤来计算数据集中单个样本的轮廓系数:

    1. 计算集群内聚度(cluster cohesion)读书笔记《Python机器学习》 - 图254,即样本读书笔记《Python机器学习》 - 图255与同一集群内所有其他点之间的平均距离。
    2. 计算集群与最近集群的集群分离度(cluster separation)读书笔记《Python机器学习》 - 图256,即样本读书笔记《Python机器学习》 - 图257与最近集群内所有样本之间的平均距离。
    3. 计算轮廓系数读书笔记《Python机器学习》 - 图258,即集群内聚度与集群分离度之差除以两者中较大的那一个,公式如下:
      读书笔记《Python机器学习》 - 图259
    4. 轮廓系数的范围在-1到1之间。如果集群分离度与集群内聚度相等读书笔记《Python机器学习》 - 图260,那么从前面的方程中我们就可以看到轮廓系数为0。此外,如果读书笔记《Python机器学习》 - 图261,则接近理想的轮廓系数1。
    5. 因为读书笔记《Python机器学习》 - 图262量化该样本与其他集群样本的差异程度,而读书笔记《Python机器学习》 - 图263则告诉样本在自己的集群内与其他样本的相似程度。

      + 11.2 把集群组织成层次树

  118. 层次聚类算法的优点是它允许绘制树状图(二进制层次聚类的可视化),这有助于我们解释创建有意义分类的结果。这种分层方法的另一个优点是不需要预先指定集群数目。

  119. 层次聚类的两种主要方法是凝聚(agglomerative)层次聚类和分裂(divisive)层次聚类。

    1. 在分裂层次聚类中,首先从包含所有样本的集群开始,然后逐步迭代,将集群分裂成更小的集群,直到每个集群只包含一个样本为止。
    2. 本节将重点讨论以相反方式进行的凝聚聚类。首先从每个集群包括单个样本开始,合并最接近的一对集群,直到只剩下一个集群为止。

      11.2.1 以自下而上的方式聚类

  120. 凝聚层次聚类的两个标准算法分别是单连接(single linkage)和全连接(complete linkage)。

  121. 单连接算法计算两个集群中最相近成员之间的距离,然后合并两个集群,其中两个最相近成员之间的距离最小。
  122. 全连接方法类似于单连接,但是,不是比较两个集群中最相近的成员,而是比较最不相近的成员然后合并。
    image.png

    【凝聚层次聚类】

  123. 凝聚层次聚类算法中其他常用的方法包括平均连接(average linkage)和Ward连接。平均连接基于两个集群中所有组成员之间的最小平均距离来合并集群。Ward连接法合并引起总的集群内SSE增长最小的两个集群。

  124. 其中的次全连接聚类是一个迭代过程,我们可以把具体步骤总结如下:

    1. 计算所有样本的距离矩阵。
    2. 将每个数据点表示为单例集群。
    3. 根据最不相似(距离最远)成员之间的距离合并两个最近的集群。
    4. 更新相似矩阵。
    5. 重复步骤2~4,直到只剩下一个集群。

      + 11.3 通过DBSCAN定位高密度区域

  125. 基于密度空间的有噪声应用聚类(Density-Based Spatial Clustering of Applications with Noise, DBSCAN),不像k-均值方法那样假设集群呈球形,把数据集分成不同层,这需要人工设定分界点。

  126. 顾名思义,基于密度的聚类把集群标签分配给样本数据点密集的区域。在DBSCAN中,密度定义为指定半径 ε范围内的样本数据点数。
  127. 采用DBSCAN算法,我们根据下列标准把特殊的标签分配给每个样本(数据点):
    1. 如果有至少指定数量(MinPts)的相邻点落在以该点为圆心的指定半径ε范围内,那么该点为核心点(core point)。
    2. 如果在核心点的半径ε范围内,相邻点的数量比半径ε范围内的MinPts少,该点叫边界点(border point)。
    3. 所有那些既不是核心点也不是边界点的其他点被认为是噪声点(noise point)。
  128. 在把所有的点分别标示为核心点、边界点和噪声点之后。我们可以用以下两个步骤来概括DBSCAN算法:

    1. 用每个核心点或连接的一组核心点组成一个单独的集群(如果核心点在ε的范围,那么核心点被视为连接的)。
    2. 把每个边界点分配到与其核心点相应的集群。
      image.png

      C12 用人工神经网络建立复杂函数模型

      + 12.1 用人工神经网络建立复杂函数模型

      深度神经网络及应用(以及论文):
  129. Facebook’s DeepFace for tagging images (DeepFace: Closing the Gap to HumanLevel Performance in Face Verification, Y. Taigman, M. Yang, M. Ranzato, and L. Wolf, IEEE Conference on Computer Vision and Pattern Recognition (CVPR), pages 1701–1708, 2014)

  130. Baidu’s DeepSpeech, which is able to handle voice queries in Mandarin (DeepSpeech: Scaling up end-to-end speech recognition, A. Hannun, C. Case, J. Casper, B. Catanzaro, G. Diamos, E. Elsen, R. Prenger, S. Satheesh, S. Sengupta, A. Coates, and Andrew Y. Ng, arXiv preprint arXiv:1412.5567, 2014)
  131. Google’s new language translation service (Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation, arXiv preprint arXiv:1412.5567, 2016)
  132. Novel techniques for drug discovery and toxicity prediction (Toxicity prediction using Deep Learning, T. Unterthiner, A. Mayr, G. Klambauer, and S. Hochreiter, arXiv preprint arXiv:1503.01445, 2015)
  133. A mobile application that can detect skin cancer with an accuracy similar to professionally trained dermatologists (Dermatologist-level classification of skin cancer with deep neural networks, A. Esteva, B.Kuprel, R. A. Novoa, J. Ko, S. M. Swetter, H. M. Blau, and S.Thrun, in Nature 542, no. 7639, 2017, pages 115-118)
  134. Protein 3D structure prediction from gene sequences (De novo structure prediction with deep-learning based scoring, R. Evans, J. Jumper, J. Kirkpatrick, L. Sifre, T.F.G. Green, C. Qin, A. Zidek, A. Nelson, A. Bridgland, H. Penedones, S. Petersen, K. Simonyan, S. Crossan, D.T. Jones, D. Silver, K. Kavukcuoglu, D. Hassabis, and A.W. Senior, in Thirteenth Critical Assessment of Techniques for Protein Structure Prediction, 1-4 December, 2018)
  135. Learning how to drive in dense traffic from purely observational data such as camera video streams (Model-predictive policy learning with uncertainty regularization for driving in dense traffic, M. Henaff, A. Canziani, Y. LeCun, 2019, in Conference Proceedings of the International Conference on Learning Representations, ICLR, 2019)

    12.1.1 单层神经网络回顾

  136. 第二章中介绍的用于二元分类的Adaline(自适应神经网络),是一个单层神经网络:
    image.png

  137. 虽然Adaline由输入层和输出层组成,但被称为单层网络,因为在输入层和输出层之间存在着单链接(只有一行)

    12.1.2 多层神经网络体系结构简介

  138. 将多个单神经元连接到多层前馈神经网络。这种特殊类型的全连接网络也被称为MLP( multilayer perceptron 多层感知器)

  139. 区别在于横向增加了中间的隐藏层hidden layer,即有多个感知器接收数据
    image.png
  140. 如果MLP有一个以上的隐藏层,就称为【深度人工神经网络】
  141. 上图中:
    1. 读书笔记《Python机器学习》 - 图268用来表示第读书笔记《Python机器学习》 - 图269(in输入层,h隐藏层,out输出层中的一个)层的第,读书笔记《Python机器学习》 - 图270个激活单元(第i个输入,一共m个)
    2. 这里读书笔记《Python机器学习》 - 图271读书笔记《Python机器学习》 - 图272为偏置单元,定义为1
    3. 输入层的激活单元只是输入单元加上偏置单元:
      读书笔记《Python机器学习》 - 图273
  142. 偏执单元命名规则
    1. 读书笔记《Python机器学习》 - 图274层中每个单元通过权重系数与读书笔记《Python机器学习》 - 图275层中的所有单元连接。例如读书笔记《Python机器学习》 - 图276层中的第读书笔记《Python机器学习》 - 图277个单元与读书笔记《Python机器学习》 - 图278层中的第读书笔记《Python机器学习》 - 图279个单元之间的连接可以表示为:读书笔记《Python机器学习》 - 图280
    2. 我们把连接输入层到隐藏层的权重矩阵表示为读书笔记《Python机器学习》 - 图281
    3. 把连接隐藏层到输出层的矩阵表示为读书笔记《Python机器学习》 - 图282
  143. 我们以更普遍的鸢尾花三分类标签的独热转换为例(0=Setosa,1=Versicolor,2=Virginica)为例:
    读书笔记《Python机器学习》 - 图283

    1. 用矩阵读书笔记《Python机器学习》 - 图284来概括地表达连接输入层和隐藏层的权重,读书笔记《Python机器学习》 - 图285为隐藏层的单元数量,读书笔记《Python机器学习》 - 图286为输入层单元(包括偏置单元)的数量,得到下图:
      image.png

      12.1.3 利用正向传播激活神经网络

      【MLP学习过程】

  144. MLP的学习过程总结为下述三个简单步骤:

    1. 从输入层开始,通过网络正向传播训练数据的模式以生成输出
    2. 基于网络的输出,用稍后即将描述的代价函数来计算想要最小化的误差
    3. 反向传播误差,匹配网络中相应的权重结果并更新模型
  145. 最后,在上述三个步骤经过多次迭代并学习了MLP权重之后,用正向传播计算网络输出,并用阈值函数以前面描述的独热表达方式获得预测的分类标签

    【正向传播计算】

  146. 正向传播详细计算:

    1. 由于隐藏层中的每个单元都与输入层中的所有单元相连接,因此首先对隐藏层的激活单元读书笔记《Python机器学习》 - 图288进行计算:
      读书笔记《Python机器学习》 - 图289
    2. 读书笔记《Python机器学习》 - 图290为静输入
    3. 读书笔记《Python机器学习》 - 图291为激活函数,要以基于梯度的方法学习与神经元连接的权重,则该函数必须可导(原为可微)
    4. 为了能够解决诸如图像分类这种复杂的问题,需要MLP模型中存在非线性激活函数,例如sigmoid(逻辑)激活函数(第3章介绍的):
      读书笔记《Python机器学习》 - 图292
      image.png
  147. MLP是前馈人工神经网络的典型例子。前馈一词指的是每一层的输出作为下一层的输入而且不循环,与本章后面将要讨论的循环神经网络相反
  148. 多层感知器一词听起来可能有些不够贴切,因为这种网络体系结构的人工神经元通常并不是感知器,而是sigmoid单元。直观上说,可以把MLP中的神经元看作是逻辑回归单元,其返回值在0和1之间的连续范围内

    【Numpy实现】

  149. 读书笔记《Python机器学习》 - 图294

    1. 其中读书笔记《Python机器学习》 - 图295为样本读书笔记《Python机器学习》 - 图296读书笔记《Python机器学习》 - 图297维特征向量再加上偏置单元
    2. 读书笔记《Python机器学习》 - 图298读书笔记《Python机器学习》 - 图299维权重矩阵,读书笔记《Python机器学习》 - 图300为隐藏层单元的个数
  150. 读书笔记《Python机器学习》 - 图301
    1. 在完成矩阵-向量计算之后,得到读书笔记《Python机器学习》 - 图302维净输入向量读书笔记《Python机器学习》 - 图303用以计算激活值读书笔记《Python机器学习》 - 图304
    2. 读书笔记《Python机器学习》 - 图305
  151. 进一步将这种计算推广到训练数据集的读书笔记《Python机器学习》 - 图306个样本(前面向量,下面矩阵):
    1. 读书笔记《Python机器学习》 - 图307
    2. 读书笔记《Python机器学习》 - 图308
  152. 类似地,我们可以把多个样本的输出层激活值的计算表达为向量形式:

    1. 读书笔记《Python机器学习》 - 图309
      1. 这里用读书笔记《Python机器学习》 - 图310读书笔记《Python机器学习》 - 图311乘以读书笔记《Python机器学习》 - 图312读书笔记《Python机器学习》 - 图313
      2. 获得读书笔记《Python机器学习》 - 图314读书笔记《Python机器学习》 - 图315
      3. 读书笔记《Python机器学习》 - 图316为输出数据单元的个数(比如鸢尾花中为3)
      4. 注意这里读书笔记《Python机器学习》 - 图317为特征数,读书笔记《Python机器学习》 - 图318为样本数量
    2. 读书笔记《Python机器学习》 - 图319
    3. 读书笔记《Python机器学习》 - 图320

      + 12.2 识别手写数字

      + 12.3 训练人工神经网络

      12.3.1 逻辑代价函数计算

  153. 根据【3.3.3】中介绍的代价函数(sigmond):
    读书笔记《Python机器学习》 - 图321

  154. 变换为:
    读书笔记《Python机器学习》 - 图322
  155. 这里读书笔记《Python机器学习》 - 图323为数据集中第读书笔记《Python机器学习》 - 图324个样本用正向传播算法计算出的sigmoid激活值:
    读书笔记《Python机器学习》 - 图325
  156. 请注意,这个表达式上标读书笔记《Python机器学习》 - 图326是训练样本的索引而不是层的
  157. 现在添加一个正则化项以减少过拟合的机会。正如前面章节中讨论过的那样,L2正则化项的定义如下:
    读书笔记《Python机器学习》 - 图327
  158. 得到以下等式:
    读书笔记《Python机器学习》 - 图328
  159. 在我们已经实现的用于多元分类的MLP中,它返回一个拥有t个元素的输出向量,这需要与t×1维独热编码所表示的目标向量进行比较
  160. 例如,某个样本的第三层和目标类(这里是2类)的激活可能以如下方式来表示(中文版y第一个输出是错的,坑!,这里输出a中0.9即为最可能的分类,正好对应了y真实值中的1):
    读书笔记《Python机器学习》 - 图329
  161. 因此,我们需要将逻辑代价函数推广到网络中所有t激活单元:
    读书笔记《Python机器学习》 - 图330
  162. 再加上L2正则化项,它计算的是添加到第一列的那个层(无偏置项)所有权重的总和:
    读书笔记《Python机器学习》 - 图331
  163. 这里读书笔记《Python机器学习》 - 图332读书笔记《Python机器学习》 - 图333层的单元数,下面的表达式代表惩罚项:
    读书笔记《Python机器学习》 - 图334
  164. 如图所示,读书笔记《Python机器学习》 - 图335连接输入层与隐藏层,读书笔记《Python机器学习》 - 图336连接隐藏层与输出层,虽然这里好像有相同的行数和列数,情况通常并不是这样,除非在初始化MLP时,我们采用相同的隐藏单元数、输出单元数和输入样本数:
    image.png
  165. 目标是最小化代价函数读书笔记《Python机器学习》 - 图338。因此,我们需要计算参数读书笔记《Python机器学习》 - 图339的偏导数:读书笔记《Python机器学习》 - 图340

    12.3.2 理解反向传播

  166. /反向传播历史的参考文献/ Who Invented Backpropagation?

  167. 链式规则,是一种计算复杂嵌套函数导数的方法,如读书笔记《Python机器学习》 - 图341求导:
    读书笔记《Python机器学习》 - 图342
  168. 类似地,我们可以用链式规则来处理任意长的函数组合,假设读书笔记《Python机器学习》 - 图343为函数组合:读书笔记《Python机器学习》 - 图344,则导数为:
    读书笔记《Python机器学习》 - 图345
  169. 对解决这类问题,计算机代数已经开发了一套非常有效的技术,也就是所谓的自动微分 /Automatic Differentiation of Algorithms for Machine Learning/
  170. 扩展 /函数导数、偏导数、梯度和雅可比矩阵/

    12.3.3 通过反向传播训练神经网络

  171. 这里我们把代价定义为最后一层激活与目标分类标签之间的差

  172. 现在将从数学角度来看反向传播算法如何更新MLP模型的权重,该算法在Backpropagation部分的fit方法中实现
  173. 正如我们在本章开头所提到的那样,首先应用正向传播以获得输出层的激活,公式如下:
    读书笔记《Python机器学习》 - 图346
  174. 两层的net input和activation如下图所示,其中读书笔记《Python机器学习》 - 图347中的元素即是每个样本读书笔记《Python机器学习》 - 图348最后的预测值读书笔记《Python机器学习》 - 图349
    image.png
  175. 反向传播从右向左传播误差。首先从计算输出层的误差向量开始,其中读书笔记《Python机器学习》 - 图351为真实分类标签的向量
    读书笔记《Python机器学习》 - 图352
  176. 接着我们来计算隐藏层的误差项:
    读书笔记《Python机器学习》 - 图353
    1. 这里读书笔记《Python机器学习》 - 图354为sigmoid激活函数的导数
    2. 我们在NeuralNetMLP代码的fit方法中这样计算:sigmoid_derivative_h=a_h*(1.-a_h)
      读书笔记《Python机器学习》 - 图355
  177. 总结:
    image.png

    C13 用TensorFlow并行训练神经网络

    image.png