- C01 赋予计算机从数据中学习的能力
- + 1.4 机器学习构建路线图
- C02 训练简单的机器学习分类算法
- + 2.3 自适应线性神经元 vs 感知器
- C03 scikit-learn机器学习分类器
- C04 构建良好的训练数据集 - 数据预处理
- C05 通过降维压缩数据
- 3)获取协方差矩阵的特征值和特征向量。
# 4)以降序对特征值排序,从而对特征向量排序。 - C06 模型评估和超参数调优的最佳实践
- C07 组合不同模型的集成学习
- C10 用回归分析预测连续目标变量
- C11 用聚类分析处理无标签数据
- C12 用人工神经网络建立复杂函数模型
- C13 用TensorFlow并行训练神经网络
《Python机器学习(原书第3版)》
作者:[美]塞巴斯蒂安·拉施卡(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$)
建议
- 建议英文好的看英文原版,中文版本公式比较粗糙,而且图形不是彩色的。
- 如果看中文版本,结合官方ipynb代码即markdown说明比较清晰。
C01 赋予计算机从数据中学习的能力
+ 1.2 机器学习分类
种类 \ 对比 | 特点 | 反馈 | 目的 |
---|---|---|---|
监督学习 | 使用有标签数据 | 直接反馈 | 预测结果 / 未来 |
无监督学习 | 使用无标签数据 | 无反馈 | 寻找数据中的隐藏结构 |
强化学习 | 设定决策过程 | 奖励机制 | 学习一系列的行动 |
【超参数】
【标注约定】
鸢尾属植物数据集包含150个样本和4个特征,可以用150×4矩阵表示:
:::success
- 大写粗体字母表示矩阵
- 小写字母表示向量
的上标i指第
个训练样本,下标
表示训练样本的第j个维度
- 维度(列向量):
表示第150个鸢尾花样本的第一个维度,即萼片长度
样本(行向量):该矩阵的每行代表一朵花的数据,可以写成4维行向量
:::
+ 1.4 机器学习构建路线图
预处理:为了获得模型的最佳性能,许多机器学习算法要求所选特征的测量结果单位相同,通常通过把特征数据变换到[0,1]的取值范围,或者均值为0、方差为1的标准正态分布来实现
- 训练及选择预测模型:在实践中,至少要比较几种不同的算法,以便训练和选择性能最好的模型。但在比较不同的模型之前,我们首先要确定度量性能的指标。通常用分类准确率作为度量指标,其定义为正确分类的个体占所有个体的百分比
- 评估:在训练数据集上拟合并选择模型之后,我们可以用测试数据集来评估它在从来没见过的新数据上的表现,以评估泛化误差
- 预测:如果我们对模型的表现满意,那么就可以用它来预测未来的新数据
C02 训练简单的机器学习分类算法
【plus】线性代数表示说明
- 黑板粗体(Blackboard Bold)表示期望及线性代数空间
- 大写字母只有一种加粗表示方法,表示矩阵
- 小写加粗,表示向量;带下标不加粗表示向量中的单一维度的值
- 参考
- 加粗表示方法使用Latex中多种方式都可
https://blog.csdn.net/sincerehz/article/details/88385217- 推荐使用
\bm
- mathpix识别出来的可以不改,效果一样
\bf
之后的所有字母都会加深,不要使用
- 推荐使用
- 不同字体渲染效果
https://www.jianshu.com/p/6de552393933
- 加粗表示方法使用Latex中多种方式都可
- 黑板粗体(Blackboard Bold)表示期望及线性代数空间
+ 2.1 人工神经元
【神经元】
- Dendrites 树突
- Cell nucleus 细胞核
- Myelin sheath 髓鞘
- Axon 轴突
-
【人工神经元】
输入 —> (经过计算)静输入—> 决策函数 —> 输出 :::success
输入:输入值
的线性组合与权重向量
- 静输入:
- 决策函数:
如果某个特定样本的净输入值
大于定义的阈值
,则预测结果为1,否则为-1
简化:为了简化起见,我们把阈值
放在等式的左边,权重零定义为
(称为偏置)并定义
。之后就可以更紧凑的方式来表达
:::
2.1.2 感知器学习规则
用代码实现的功能称为感知器,实现步骤为:
把权重初始化为0或者小的随机数
- 分别对每个训练样本
- 计算输出值
- 更新权重
更新权重的过程如下描述: :::success
- 输出值为预先定义好的单位阶跃函数预测的分类标签
- 更新权重矩阵
,具体的向量更新
是用来更新
的值,根据感知器学习规则计算该值:
为学习速率(一般是0.0~1.0之间的常数)
为第
个训练样本的正确类标签,
为预测的分类标签
二维数据集的更新可以表达为:
::: 按照这个逻辑,我们可以用例子说明下当实际分类与预测分类相同时,权重更新值为0:
而当实际分类与预测分类不同时,权重则会进行更新:
带入数值感受一下,假设,而模型错把该样本判断为-1。在这种情况下,把相应的权重增加1,这样当下次再遇到该样本时,净输入
就会更偏向阳,从而更有可能超过单位阶跃函数的阈值,把该样本分类为+1。
权重更新与成正比,假设有另外一个样本被错误地分类为-1,得出的值为:
注意:注意只有两个类线性可分且学习速率足够小时,感知器的收敛性才能得到保证
- 如果不能用线性决策边界分离两个类,可以为训练数据集设置最大通过数(迭代次数)及容忍误分类的阈值,否则分类感知器将会永不停止地更新权重, 如下图中间及右侧的数据为线性不可分
- 小结
2.2.1代码解释
Adalin使用了线性函数(Perceptron使用的是阶跃函数)作为激活函数
- 这种方式让误差值随着静输入的大小而变化(错的越多,调整越多)
-
2.3.1 通过梯度下降最小化代价函数
【最小化代价函数】
代价函数Cost Function(翻译约定俗成:一般cost对应代价,error对应误差)。另外还有损失函数Loss Fuction:
- 损失函数:是定义在单个训练样本上的,也就是就算一个样本的误差,一般用
表示
- 代价函数:是定义在整个训练集上面的,也就是所有样本的误差进行汇总求值,有多种汇总方式可选,比如可证这节的SSE,一般用
表示
- 损失函数:是定义在单个训练样本上的,也就是就算一个样本的误差,一般用
- 目标函数Target Function是进行算法优劣判断最后的函数,等于经验风险+结构风险,也就是Cost Function + 正则化项。其中正则化项是对损失函数复杂度的考量,越复杂这部分越大,这样计算是为了防止过拟合
- 对Adaline而言,权重的代价函数
定义为:计算结果与真正分类标签之间的误差平方和(SSE):
- 添加
只是为了方便,它使与权重参数相关的代价函数或者损失函数的梯度推导更容易
-
【批量梯度下降(Batch Gradient Descent,BGD)】
可以用简单而强大的梯度下降的优化算法来寻找权重
- 通过在代价函数
的梯度
的相反方向上迈出一步来更新权重
- 要计算代价函数的梯度,我们需要分别用每个权重
来计算代价函数的偏导数
- 这样就可以把权重
的更新表达为
- 第三步的具体计算为
- 尽管Adaline的学习规则看起来与感知器一样,但应该注意的是当
时,
为实数而不是整数型分类标签
- 权重更新是基于训练数据集中所有样本进行计算的,而不是在每个样本之后逐步更新权重,这也就是为什么这种方法被称为批量梯度下降
- 在梯度下降中,learning rate参数对结果有很大影响,比如代码中0.01和0.001的对比
- 左图显示选择学习速率太大将会出现的情况。因为所选的全局最小值太低,以至于代价函数无法最小化,结果误差经过每次迭代变得越来越大。另一方面,从右图可以看到代价在降低,但所选的学习速率η=0.0001太小,以至于算法需要经过多次迭代才能收敛到全局最低代价。
了如果改变某个特定权重参数的值来最小化代价函数J时会发生的情况。左图显示如果选择一个好的学习速率,代价会逐渐降低,向全局最小的方向发展。然而,右图显示如果选择的学习速率太大,将会错过全局最小值。
2.3.3 通过特征缩放改善梯度下降
梯度下降是从特征缩放受益的众多算法之一。
- 本节将用一种称为标准化的特征缩放方法,它可以使数据具有标准正态分布的特性:零均值和单位方差。标准化会使每个特征的均值以零为中心,并且每个特征的标准差为1。
- 对第
个特征的标准化,我们可以简单地用每个训练样本值减去均值
,然后再除以标准差
:
-
2.3.4 大规模机器学习与随机梯度下降
【随机梯度下降(Stochastic Gradient Descent,SGD)】
随机梯度下降(Stochastic Gradient Descent,SGD)算法是批量梯度下降算法的一种常用替代方法,它有时也称为迭代或在线梯度下降法。该方法并不是基于所有样本
的累积误差之和来更新权重:
- 虽然随机梯度下降可以看作梯度下降的近似,但因为需要更频繁地更新权重,所以通常收敛得更快。
- 因为要根据单个训练实例来计算每个梯度,所以误差平面比梯度下降噪声更大。
- 当然这也有优势,因为如果采用非线性代价函数,随机梯度下降更容易逃脱浅度局部极小值。
- 要通过随机梯度下降获得满意的结果,很重要的一点是将训练数据以随机顺序呈现出来,同时要对训练数据集重新洗牌以防止迭代循环。
- 在随机梯度下降的实现中,固定的学习速率
经常被随时间下降的自适应学习速率所取代,例如:
- 随机梯度下降的另外一个优点是它可以用于在线学习,在线学习中模型可以在数据到达时实时完成训练。
- 这对累积大量数据的情况特别有用(例如网络应用中的用户数据)。
采用在线学习的方法,系统可以立即适应变化,而且在存储空间有限的情况下,可以在更新模型后丢弃训练数据。
【小批量(随机)梯度下降 mini-batch SGD】
批量梯度下降和随机梯度下降之间的折中就是所谓的小批量学习。正式名称中有个随机,一般省略,称为小批量梯度下降。
- 小批量学习可以理解为对训练数据的较小子集采用批量梯度下降,例如,每次32个训练样本。
- 小批量梯度下降的优点是可以通过更频繁的权重更新,实现快速收敛。
- 小批量学习允许利用线性代数概念中的向量化操作(例如,通过点积实现加权求和)取代随机梯度下降中训练样本上的for循环,进一步提高学习算法的计算效率。
如果要更新模型,例如,要实现流式数据的在线学习,可以对单个训练样本直接调用
partial_fit
方法,比如ada_sgd.partial_fit(X_std[0, :], y[0])
C03 scikit-learn机器学习分类器
+ 3.3 基于逻辑回归的分类模型
逻辑回归是一种很容易实现的分类模型,但仅在线性可分类上表现不错,它是行业中应用最广泛的分类算法。
- 本章所介绍的逻辑回归模型也是一个用于二元分类的线性模型。
逻辑回归可以很容易地推广到多元分类,这被称为多项式逻辑回归或softmax回归。参考资料 http://rasbt.github.io/mlxtend/user_guide/classifier/SoftmaxRegression/
3.3.1 逻辑回归与条件回归
【原理解释】
让步比odds,当p表示预测事件(正事件,分类标签为1)发生的概率时
- logit函数是让步比的自然对数形式
- logit函数的输入值取值在0到1之间,并将其转换为整个实数范围的值,可以用它来表示特征值和对数概率(log-odds)之间的线性关系:
- 这里的
是给定特征
,某个特定样本属于类1的条件概率。
- 实际上,我们感兴趣的是预测某个样本属于某个特定类的概率,它是logit函数的逆函数,即逻辑sigmoid函数,也称sigmoid函数或者S型函数:
- 其中z为净输入,是权重和样本特征的线性组合:
可以看出,当
趋向无限大时
的值接近于1,因为当
值很大时,
的值会变得非常小。
【Logit Regression —vs— Adaline】
区别为激活函数不同,Sigmoid -vs- Linear
- sigmoid函数的输出则被解释为特定样本属于类1的概率
其中
被
参数化。
- 例如计算出
说明该样本属于Iris-versicolor的概率为80%,该样本属于Iris-setosa的概率为20%。
-
3.3.2 学习逻辑代价函数的权重
根据上一章代价函数定义
- 为了在Adaline分类模型中学习权重
,我们简化了函数。
- 在建立逻辑回归模型时,需要首先定义最大似然函数
,假设数据集中的每个样本都是相互独立的:
- 应用对数函数降低数值下溢的可能性,这种情况在似然率非常小的情况下可能发生。其次,假如你还记得微积分的话,可以把因子乘积转换成因子求和,这样就可以通过加法技巧更容易地得到该函数的导数:
- 为了能更好地理解这个代价函数,让我们计算一个训练样本的代价:
-
【逻辑回归的梯度下降学习算法】
首先从计算对数似然函数的偏导数开始:
- 在继续我们的讨论之前,先计算sigmoid函数的偏导数:
- 现在可以在第一个等式中替换
,得到下列等式:
- 目的是要找出可以最大化对数似然的权重,这样我们就可以通过下列方式更新每个权重:
由于最大化对数似然相当于最小化前面定义的代价函数
,因此,可以得到下述梯度下降更新规则:
3.3.3 将Adaline实现转换为一个逻辑回归算法
如果要自己动手实现逻辑回归,可以直接用新的代价函数取代第2章Adaline实现中的代价函数
3.3.5 通过正则化解决过拟合问题
过拟合是机器学习中的常见问题,虽然模型在训练数据上表现良好,但不能很好地泛化未见过的新数据或测试数据。
- 如果某个模型出现了过拟合问题,我们会说该模型有高方差,这有可能是因为相对于给定的数据,参数太多,从而导致模型过于复杂。
同样,模型也可能会出现欠拟合(高偏差)的情况,这意味着模型不足以捕捉训练数据中的复杂模式,因此对未知数据表现不佳。
【偏差-方差权衡】
方差可以用于测量模型对特定样本进行分类时预测结果的一致性(或可变性)。可以说,模型对训练数据中的随机性很敏感。
- 偏差测量的是,假如在不同的训练数据集上反复建模,预测值离正确值有多远;偏置测量的是非随机性引起的系统误差。
课堂讲义扩展:https://sebastianraschka.com/pdf/lecture-notes/stat479fs18/08_eval-intro_notes.pd
【正则化】
正则化背后的逻辑是引入额外的信息(偏差)来惩罚极端的参数值(权重)。最常见的正则化是所谓的L2正则化(有时也称为L2收缩或权重衰减),可写作:
-
【正则化与特征归一化】
通过增加一个简单的正则项,就可以正则化逻辑回归的代价函数,这将在模型训练的过程中缩小权重
+ 3.4 使用支持向量机最大化分类间隔
另外一种强大而且广泛应用的机器学习算法是支持向量机(SVM),它可以看作感知器的扩展。
感知器算法的目标是最小化分类误差。而支持向量机算法的优化目标是最大化的分类间隔。
3.4.1 对分类间隔最大化的直观认识
决策边界间隔较大往往会产生较低的泛化误差,而间隔较小的模型则更容易产生过拟合。
- 推到之后,最终得到正、负超平面之间的距离:
- 在样本分类正确的条件约束下,最大化分类间隔也就是使
最大化,这也是支持向量机的目标函数可以将其表示为:
- 这两个方程可以解释为:所有的负类样本基本上都落在负超平面一侧,而所有的正类样本都落在正超平面一侧,我们可以用更为紧凑的方式表达如下:
实际上,计算最小化
的倒数更为容易,这可以通过二次规划的方法实现。
3.4.2 用松弛变量解决非线性可分问题
松弛变量
引出了所谓的软间隔分类。
- 引入松弛变量ξ的目的是对于非线性可分数据来说,需要放松线性约束,以允许在分类错误存在的情况下通过适当代价的惩罚来确保优化可以收敛。
- 可以直接把取值为正的松弛变量加入线性约束:
(公式为剧中右对齐,左侧居中对齐的比较) - 其中
为数据集样本总数量。因此新的最小化(有约束)目标为:
- 可以通过变量C来控制对分类错误的惩罚。C值越大相应的错误惩罚就越大,如果选择的目标较小,则对分类错误的要求就不那么严格。因此,可以用参数C来控制间隔的宽度来权衡偏差与方差:
- 这个概念与上节所讨论的正则化回归相关,即减小C值会增加偏差并降低模型的方差。
- 在实际的分类任务中,线性逻辑回归和线性支持向量机通常会产生非常相似的结果。
- 逻辑回归试图最大化训练数据的条件似然,使其比支持向量机更容易处理异常值点,支持向量机主要关心的是最接近决策边界(支持向量)的点。
另一方面,逻辑回归也有优点,其模型更简单且更容易实现。此外,逻辑回归模型更容易更新,这在处理流式数据时很有吸引力。
3.4.3 其他的scikit-learn实现
在前几节中,我们用到了scikit-learn中的LogisticRegression类,它利用基于C/C++开发和高度优化的LIBLINEAR库。
- 类似地,用于训练SVM的SVC类使用了LIBSVM,它是一个专门为SVM准备的C/C++库。
- 与原生Python相比,用LIBLINEAR和LIBSVM的好处是,它允许快速训练大量线性分类器。
- 然而,有时候数据集太大而无法加载到内存。因此,scikit-learn也提供了SGDClassifier类供用户选择。
- 这个类还通过partial_fit方法支持在线学习。
- SGDClassifier类的逻辑与第2章为Adaline实现的随机梯度算法类似。初始化随机梯度下降感知器、逻辑回归感知器和带有默认参数的支持向量机的具体过程如下所示: ```python from sklearn.linear_model import SGDClassifier
ppn = SGDClassifier(loss=’perceptron’) lr = SGDClassifier(loss=’log’) svm = SGDClassifier(loss=’hinge’) ```
+ 3.5 用核支持向量机求解非线性问题
- 支持向量机在机器学习领域享有较高知名度的另一个原因是,它可以很容易使用“核技巧”来解决非线性分类问题。
在讨论核支持向量机的原理之前,让我们先创建一个样本数据集来认识一下所谓的非线性分类问题到底是什么。
3.5.1 处理线性不可分数据的核方法
核方法的基本思想是针对线性不可分数据,建立非线性组合,通过映射函数ϕ把原始特征投影到一个高维空间,使特征在该空间变得线性可分。
3.5.2 利用核技巧发现高维空间的分离超平面
为了使用SVM解决非线性问题,需要调用映射函数
将训练数据变换到高维特征空间,然后训练线性SVM模型对新特征空间里的数据进行分类。
- 可以用相同的映射函数
对未知新数据进行变换,用线性支持向量机模型进行分类。
- 然而,这种映射方法的问题是构建新特征的计算成本太高,特别是在处理高维数据时。这就是所谓的核技巧可以发挥作用的地方。
- 际上只需要用
替换点乘
:
- 其中使用最为广泛的核函数是径向基函数(RBF)核或简称为高斯核:
- 可以简化为:
- 其中
是要优化的自由参数
简而言之,术语“核”可以理解为一对样本之间的相似函数。公式中的负号把距离转换为相似性得分,而指数运算把由此产生的相似性得分值控制在1(完全相似)和0(非常不同)之间。
+ 3.6 决策树学习
基于训练数据集的特征,决策树模型通过对一系列问题的学习来推断样本的分类标签。
- 如果特征是像鸢尾花数据集这样的实数,这些概念也同样适用。例如,我们可以简单地定义萼片宽度特征轴的临界值,并且问一个二元问题:“萼片的宽度≥2.8厘米吗?”
- 使用决策树算法,我们从树根开始,在信息增益(IG)最大的特征上分裂数据。
- 各子节点在迭代过程中重复该分裂过程,直至只剩下叶子节点为止。这意味着所有节点上的样本都属于同一类。
在实践中,这可能会出现根深叶茂的树,这样容易导致过拟合。因此,我们通常希望通过限制树的最大深度来对树进行修剪(prune)。
3.6.1 最大化信息增益
为保证在特征信息增益最大的情况下分裂节点,我们需要先定义目标函数,然后进行决策树学习和算法优化。
是分裂数据的特征依据
为父节点和第
个子节点
为杂质含量
为父节点的样本数,
是第
个子节点的样本数
- 为简便起见,同时考虑到减少组合搜索空间,大多数软件库(包括scikit-learn)只实现二元决策树。这意味着每个父节点只有
两个子节点:
- 二元决策树中,度量杂质含量或者分裂标准的三个常用指标分别为为基尼杂质度
、熵
、分类误差
- 我们从非空类
(某节点t属于i类样本的概率)开始:
- 如果节点上的所有样本都属于同一个类,则熵为0,如果类的分布均匀,则熵值最大。
- 直观地说,可以把基尼杂质理解为尽量减少错误分类概率的判断标准:
- 与熵类似,如果类是完全混合的,那么基尼杂质最大,例如在二元分类中(c=2):
- 对于上图它包含40个分类标签为1的样本和40个分类标签为2的样本
- 分类误差作为标准,A与B相同(
):
- 与场景A(
)相比,基尼杂质有利于分裂场景B(
):
-
3.6.3 多个决策树的随机森林组合
由于集成方法具有良好的分类性能和对过拟合的鲁棒性,该算法在机器学习的应用中广受欢迎。
- 第7章中,我们将讨论包括装袋(bagging)和集成(boosting)在内的不同集成方法,但是在这里我们将先讨论基于决策树的随机森林算法。
- 该算法以其良好的可扩展性和易用性而闻名。可以把随机森林视为决策树的集成。
随机森林的原理是对受较大方差影响的多个决策树分别求平均值,然后构建一个具有更好泛化性能和不易过拟合的强大模型。随机森林算法可以概括为以下四个简单的步骤:
正确选择k值对在过拟合与欠拟合之间找到恰当的平衡至关重要。
- 必须确保选择的距离度量适合数据集中的特征。通常用简单的欧氏距离来度量,例如,鸢尾花数据集中的花样本,其特征以厘米为单位度量。
- 如果用欧氏距离度量,那么对数据进行标准化也很重要,确保每个特征都能对距离起着同样的作用。在前面代码中使用的
minkowski
距离是欧氏距离和曼哈顿距离的结合,可以表达如下: 维数诅咒:当固定规模的训练数据集的维数越来越大时,特征空间就变得越来越稀疏,这种现象被称为维数诅咒。直观地说,可以认为即使是最近的邻居在高维空间的距离也很远,以至于无法合适地估计。所以KNN算法已于过拟合。
C04 构建良好的训练数据集 - 数据预处理
拆分数据集:在实践中,根据初始数据集的规模,最常用的划分比例为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- 特征缩放(feature scaling):是预处理环节中很容易被遗忘的关键步骤。决策树和随机森林是机器学习算法中为数不多的不需要进行特征缩放的算法。这两种算法不受特征缩放的影响。然而,大多数其他的机器学习和优化算法,在特征缩放相同的情况下表现更佳。
- 归一化:指的是把特征重新缩放到区间[0,1],这是最小-最大缩放(min-max scaling)的特例:
- 标准化对于许多机器学习算法来说更为实用,通过标准化,我们可以把特征列的中心点设在均值为0且标准差为1的位置,这样特征列就呈标准正态分布(均值为0,方差为1),可以使学习权重更加容易。
4.5.2 L2正则化的几何解释
L2正则化为代价函数增加了惩罚项,与未正则化的代价函数所训练的模型相比,L2还能有效地抑制极端权重值。
4.5.3 L1正则化的稀疏解决方案
代价函数等高线与L1菱形在
处相交。由于L1正则化系统的边界是尖锐的,因此这个交点更可能是最优的代价函数的椭圆与L1菱形边界的交点位于坐标轴上,从而促进了稀疏性。
C05 通过降维压缩数据
无监督数据压缩的主成分分析(principal component analysis, PCA)。
- 线性判别分析(linear discriminant analysis, LDA)作为最大化类可分性的监督降维技术。
核主成分分析(kernel principal component analysis, KPCA)进行非线性降维
+ 5.2 主成分分析
当使用逆序选择之类的特征选择算法时,数据集的原始特征保持不变,而当我们用特征提取方法时,会将数据变换或投影到新特征空间。
- 在降维的背景下,我们可以把特征提取理解为数据压缩的一种方法,其目的是保持大部分的相关信息。
在实际应用中,特征提取不仅可以优化存储空间或机器学习算法的计算效率,而且还可以通过减少维数诅咒提高预测性能,尤其是当我们处理非正则化模型的时候。
5.1.1 主成因分析的主要步骤
主成分分析(PCA),这是一种无监督的线性变换技术,广泛应用于各种不同领域,特别是特征提取和降维。
- PCA的其他流行应用包括股票市场交易的探索性数据分析和去噪,以及生物信息学的基因组数据和基因表达水平分析。
- PCA帮助我们根据特征之间的相关性来识别数据中的模式。简单地说,PCA旨在寻找高维数据中存在最大方差的方向,并将数据投影到维数小于或等于原始数据的新子空间。
- 假设新特征轴彼此正交,该空间的正交轴(主成分)可以解释为方差最大的方向,如图所示。其中
为原始特征轴,而
为主成分方向。
- 假设我们有一个特征向量
:
- 通过一个变换矩阵
进行变换:
- 结果以向量的方式表达如下:
- 假设我们有一个特征向量
PCA步骤总结
构建
维协方差:
3)获取协方差矩阵的特征值和特征向量。
# 4)以降序对特征值排序,从而对特征向量排序。
5.1.3 总方差和解释方差
- 因为我们想要通过将数据集压缩到新特征子空间来降低维数,所以只选择包含最多信息(方差)的特征向量(主成分)的子集。
- 特征值代表特征向量的大小,通过对特征值的降序排列,我们可以找出前
个最重要的特征向量。
-
C06 模型评估和超参数调优的最佳实践
获得对模型性能的评估。
- 诊断机器学习算法的常见问题。
- 机器学习模型调优。
-
+ 6.1 用流水线方法简化工作流
6.1.2 在流水线中集成转换器和估计器
6.2.2 k折交叉验证
【holdout方法】
【k折交叉验证】
+ 6.3 用学习和验证曲线调试算法
6.3.1 用学习曲线诊断偏差和方差问题
左上图说明模型遇到高偏差问题。该模型的训练和交叉验证准确率均低,这说明模型对训练数据欠拟合。解决该问题的常用办法是增加模型的参数个数,例如,通过收集或构建额外的特征,或者放松正则化要求,就像在SVM或逻辑回归分类器所做的那样。
- 右上图说明模型遇到高方差问题,表现是模型在训练和交叉验证的准确率上有比较大的差别。要解决过拟合的问题,可以收集更多的训练数据,减少模型的复杂度,或者增加正则化的参数等。对于非正则化模型,它也有助于通过特征选择(参见第4章)或者特征提取(参见第5章)减少特征的数量,从而降低过拟合的程度。
6.3.2 用验证曲线解决过拟合和欠拟合问题
- 验证曲线是通过解决过拟合和欠拟合问题来提高模型性能的有力工具。
虽然验证曲线与学习曲线有关系,但是绘制的不是训练和测试准确率与样本规模之间的函数关系,而是通过调整模型参数来调优,例如逻辑回归中的逆正则化参数C。
+ 6.4 通过网格搜索调优机器学习模型
机器学习有两类参数:一类是从训练数据中学习到的参数,例如逻辑回归的权重;另一类是单独优化的算法参数。后者为模型的调优参数,也被称为超参数,例如逻辑回归的正则化参数或者决策树的深度参数。
6.4.1 通过网格搜索调优超参数
网格搜索方法非常简单:它属于暴力穷举搜索类型,我们预先定义好不同的超参数值,然后让计算机针对每种组合分别评估模型的性能,从而获得最优组合参数值。
- 尽管网格搜索是寻找模型最优参数组合的有力手段,但是评估所有可能参数组合的计算成本也非常昂贵。
- 随机搜索是scikit-learn的另外一种从不同参数组合中抽样的方法。随机搜索通常和网格搜索一样好,但是更具成本效益和时间效率。
- 如果仅通过随机搜索对60个参数组合进行采样,那么我们已经有95%的概率来获得最优性能5%以内的解(Random searchfor hyper-parameter optimization. Bergstra J, Bengio Y. Journal of Machine Learning Research. pp. 281-305, 2012)
扩展阅读:http://scikit-learn.org/stable/modules/grid_search.html#randomized-parameter-optimization
6.4.2 通过嵌套式交叉验证选择算法
这一节翻译有误。嵌套式交叉验证(m*n交叉验证),在外层循环时相同,使用最佳参数。但增加了内部循环。
- 内部循环则是使用不同的超参数进行训练,从图中看出,应该是训练集和验证集也有交叉,书中未作解释,待后续补充。
注意代码中
GridsearchCV
中的cv参数,即为Inner Loop的切分参数。准确率,是有效且可量化的模型性能指标。还有几个其他的性能指标也可以度量模型的相关性:
- 精度
- 召回率
-
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.pdf6.5.3 绘制ROC曲线
ROC(Receiver Operating Characteristic,受试者工作特征)曲线是选择分类模型的有用工具。
- 它以FPR和TPR的性能比较结果为依据,通过移动分类器的阈值完成计算。
- ROC的对角线可以解释为随机猜测,如果分类器性能曲线在对角线以下,那么其性能就比随机猜测还要差。
- TPR为1且FPR为0的完美分类器会落在图的左上角。
- 基于ROC曲线,可以计算所谓的ROC曲线下面积(Area Under the Curve,AUC)以描述分类模型的性能。
- http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_curve.html
- 对ROC AUC的分数感兴趣,也可以从sklearn.metrics子模块直接导入roc_auc_score函数。
准确率分数可以解释为ROC曲线上的一个截点,A. P. Bradley发现ROC AUC和准确率指标在大多数时间是相互一致的。
6.5.4 多元分类评分指标
本节所讨论的评分指标是针对二元分类系统的。然而,scikit-learn也实现了宏观和微观的平均方法,以把二元分类的评分指标通过一对所有(OvA)扩展到解决多元分类问题。
对多元分类问题,scikit-learn默认支持加权宏平均值,可以调用sklearn.metrics模块的不同评分函数通过参数average来指定平均的方法,例如precision_score或make_scorer函数。
6.5.5 处理类不均衡问题
在现实世界中,类的不均衡是个常见问题,即当数据集的一个或多个类的样本被过度代表的时候。
- 我们可以想到可能出现该问题的几个场景,如垃圾邮件过滤、欺诈检测或疾病筛查。
- 想象一下本章用过的包括90%健康病人的乳腺癌威斯康星数据集。在这种情况下,可以在无监督机器学习算法的帮助下,通过预测所有样本的多数类(良性肿瘤),在测试数据集上达到90%的准确率。因此,在这样的数据集上训练一个模型以达到大约90%的测试准确率,将意味着模型还没有从这个数据集所提供的特征中学到任何有用的东西。
- 在这样的数据集上拟合分类器,当比较不同模型的精度、召回率、ROC曲线时,无论在应用中最关心什么,都要将注意力集中在准确率以外的其他指标上。
- 在模型拟合过程中,处理不均衡类比例的一种方法是对少数类的错误预测给予更大的惩罚。在scikit-learn中,只要把参数class_weight设置成class_weight=’balanced’,就可以很方便地加大这种惩罚的力度,大多数的分类器都是这么实现的。
- scikit-learn库实现了简单的resample函数,可以通过从数据集中有放回地提取新样本来帮助少数类上采样。
另一种处理类不均衡问题的技术是人工生成训练样本,这超出了本书讨论的范围。使用最广泛的人工生成训练样本算法可能是人工生成少数类的过采样技术(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 组合不同模型的集成学习
以多数票机制为基础做出预测。
- 使用装袋通过可重复地从训练数据集随机抽取样本组合来减少过拟合。
在从错误中学习的弱学习机基础上利用boosting建立强大的模型。
+ 7.1 集成学习
如上图,可分为一致同意、多数票、相对多数票三类集成方法。
- 在使用中,一般用到的是多数票,Majority这一类。可细分为bagging袋装法和boosting提升法。
- 使用装袋通过可重复地从训练数据集随机抽取样本组合来减少过拟合。
- 在从错误中学习的弱学习机基础上利用boosting建立强大的模型。
- 在多数票机制下,可以集成不同的分类算法,例如,决策树、支持向量机、逻辑回归分类器等。
- 另外,我们也可以用相同的基本分类算法,分别拟合不同的训练数据子集。这种方法的突出例子是随机森林算法,它组合了不同的决策树分类器。
- 为了通过简单的多数票机制预测分类标签,我们可以把每个独立分类器
预测的分类标签组合起来,然后选择分类标签,从而选择得票最多的标签:
- 在二元分类任务中,class1=-1而class2=+1,多数票预测可以表达为:
- 为什么集成方法要比单分类器的效果更好。在下面的例子中,我们假设所有n个基本分类器所面对的都是二元分类任务,有相同的错误率
。另外,我们假设分类器都是独立而且错误率互不相关。基于这些假设条件,我们可以直接把基本分类器集成的错误率表达为二项分布的概率质量函数:
为二项式系数
选择
。换句话说,计算集成预测出错的概率。现在,让我们看一个更为具体的示例,其中包括11个基本分类器(n=11),每个分类器错误率为0.25(ε=0.25):
- 二项式系数指从大小为n的集合中选择k个无序元素子集的组合数,通常被称为“n选k”。因为不考虑顺序,所以二项式系数有时也被称为组合或组合数,表达如下:
从下图中我们可以清楚地看到,只要基本分类器的性能优于随机猜测(ε<0.5),集成分类器的错误率总是比单一基本分类器的错误率要低。请注意,y轴描述了基本错误率(虚线)以及集成错误率(实线):
+ 7.2 通过多数票机制组合分类器
7.2.1 实现一个简单的多数票分类器
本节将要实现的算法可以把不同的分类算法及其各自相应权重组合起来。目标是建立一个更强大的超级分类器,以平衡单分类器在特定数据集上的弱点。可以用更精确的数学语言把加权多数票机制表达如下:
- scikit-learn的某些分类器也可以调用predictproba方法返回预测分类标签的概率。如果集成分类器预测得够精准,那么用预测的分类概率代替分类标签进行多数票表决是有用的。用分类概率进行预测的多数票机制的修改版本可以表达为(为第
个分类器对分类标签
预测的概率):
尽管MajorityVoteClassifier的实现对于演示非常有用,但在本书第1版的基础上,我们用scikit-learn实现了比多数票分类器更复杂的版本。在scikit-learn版本0.17或更高版的sklearn.ensemble.VotingClassifier上,我们可以找到该集成分类器。
7.2.2 用多数票原则进行预测
先准备一个可以测试的数据集。既然已经熟悉了从CSV文件加载数据集的技术,我们就走捷径从scikit-learn的datasets集模块直接加载鸢尾花数据集。
此外,为了使演示的分类任务更具挑战性,我们将只选择萼片宽度和花瓣长度两个特征。虽然可以把MajorityVoteClassifier泛化到多元分类问题,但是我们只对Iris-versicolor和Iris-virginica花样本进行分类,然后计算ROC的线下面积。
7.2.3 评估和优化集成分类器
本节将基于测试数据来计算ROC曲线,以检查MajorityVoteClassifier对未见过的新数据是否有良好的泛化性能。我们要记住,测试数据集将不会用于模型选择,其目的仅仅是对分类器的泛化性能报告无偏估计:
了示例,我们只选择了两个特征来看看集成分类器决策区域的实际情况。虽然在模型拟合之前没有必要对训练数据的特征值进行标准化,但是因为逻辑回归和k-近邻流水线将自动处理它,所以我们要标准化训练数据集,以便决策树的决策区域有相同的比例尺度,从而达到可视化的目的:
+ 7.3 bagging - 基于bootstrap样本构建集成分类器
bagging是一种集成学习技术,它与在上一节中实现的方法紧密相关。然而,我们并没有使用相同的训练数据集来拟合集成中的各个分类器,而是从初始训练数据集中抽取bootstrap样本(随机有放回样本),这就是为什么bagging方法也被称为bootstrap聚合(bootstrap aggregating):
+ 7.4 通过自适应boosting提高弱学习机的性能(AdaBoost)
在boosting中,集成是由很简单的常被称为弱学习机(weak learner)的基本分类器所组成,性能仅比随机猜测略优,弱学习机的典型例子是单层决策树。boosting背后的关键概念是专注于难以分类的训练样本,即让弱学习机从训练样本的分类错误中学习来提高集成的性能。
7.4.1 boosting的工作原理
【adaboost工作原理】
首先,我们从子图1开始了解AdaBoost的详情,这是一个二元分类训练数据集,所有的训练样本拥有相同的权重。
- 我们基于该训练数据集来训练单层决策树(虚线),以完成对三角形和圆形两类样本的分类,该任务可以通过最小化代价函数(或在决策树集成的特殊情况下的杂质得分)完成。
- 其次,在子图2中,我们为前面子图1中误判的两个圆形样本增加权重。此外减少被正确分类的那些样本的权重。
- 下一个单层决策树将更多聚焦在权重较大的训练样本上,这些训练样本很难分类。子图2中的弱学习机把三个圆形样本错误地分类,随后这三个样本被赋予较大的权重,如子图3所示。
假设AdaBoost集成只进行三轮boosting,那么将在三个不同的训练数据子集上通过加权多数票把弱学习机组合起来,如子图4所示。
【adaboost伪代码】
让我们用伪代码更加详细地观察该算法。为清楚起见,用
表示元素之间的相乘,用·来表示两个向量之间的点积:
把权重向量
定义为一致权重,其中
- 对于第
轮bootting(一共
轮boosting),做以下几件事:
- 训练有权重的弱学习机:
- 预测分类标签:
- 计算加权错误率:
- 计算系数:
- 更新权重:
- 归一化权重使其和为1:
- 训练有权重的弱学习机:
- 计算最终的预测结果:
-
【总结】
单分类器相比,值得我们注意的是,集成学习增加了计算复杂度。需要我们在实践中认真考虑是否愿意为适度提高预测性能而增加计算成本。
- 关于预测性能与计算成本两者之间的权衡问题,一个常被提及的例子就是著名的Netflix100万美元大奖,它就是靠集成技术赢得的。
- 关于该算法的细节见文献
https://www.asc.ohio-state.edu/statistics/dmsl/GrandPrize2009_BPC_BigChaos.pdf - “我们离线评估了一些新方法,但是所测量到的额外准确率改善似乎并不能平衡将其引入生产环境所需耗费的工程努力。”
梯度boosting:自适应boosting和梯度boosting这两种方法的主要区别在于权重的更新方式以及(弱)分类器的组合方式。除了scikit-learn中实现的GradientBoostingClassifie之外,scikit-learn版本0.21包括了甚至比XGBoost更快的梯度boosting版本HistGradientBoostingClassifier。
C10 用回归分析预测连续目标变量
+ 10.1 线性回归简介
线性回归的目的是针对一个或多个特征与连续目标变量之间的关系建模。与监督学习分类相反,回归分析的主要目标是在连续尺度上预测输出,而不是在分类标签上。在下面的小节中,我将介绍线性回归的最基本类型,即简单线性回归。
10.1.1 简单线性回归
简单(单变量)线性回归的目的是针对单个特征(解释变量x)和连续目标值(响应变量y)之间的关系建模。拥有一个解释变量的线性回归模型的方程定义如下:
- 这里权重
代表y轴截距,
为解释变量的权重系数。我们的目标是学习线性方程的权重,以描述解释变量和目标变量之间的关系,然后预测训练数据集里未见过的新响应变量。
这条最佳拟合线也被称为回归线,从回归线到样本点的垂直线就是所谓的偏移(off-set)或残差(residual)——预测的误差。
10.1.2 多元线性回归
前一节引入了单解释变量的线性回归分析,也称为简单线性回归。当然,也可以将线性回归模型推广到多个解释变量,这个过程叫作多元线性回归:
与一般的想法相反,训练线性回归模型并不要求解释变量或目标变量呈正态分布。正态假设只是针对某些统计和假设检验的要求,
10.2.3 用相关矩阵查看关系
相关矩阵是包含皮尔逊积矩相关系数(通常简称为皮尔逊r)的方阵,我们用它来度量特征对之间的线性依赖关系。
- 相关系数的值在-1到1之间。如果r=1,则两个特征之间呈完美的正相关;如果r=0,则两者之间没有关系;如果r=-1,则两者之间呈完全负相关的关系。
- 我们可以把皮尔逊相关系数简单地计算为特征x和y之间的协方差
可以证明,一对经标准化的特征之间的协方差实际上等于它们的线性相关系数。
+ 10.3 普通最小二乘线性回归模型的实现
我们提到过可以把线性回归理解为通过训练数据的样本点获得最佳拟合直线。
- 然而,我们既没有定义最佳拟合(best-fitting),也没有讨论过拟合模型的不同技术。
下面的小节,我们将用普通最小二乘(OLS)法(有时也称为线性最小二乘)来填补缺失的部分并估计线性回归的参数,从而使样本点与线的垂直距离(残差或误差)之平方和最小。
10.3.1 用梯度下降方法求解回归参数
在第2章中,我们实现了自适应线性神经元(Adaline)。同时,我们还定义了代价函数
,并通过优化算法来最小化代价函数的学习权重,这些算法包括梯度下降(GD)和随机梯度下降(SGD)。Adaline的代价函数是误差平方和(SSE),它与OLS所用的代价函数相同:
+ 10.4 利用RANSAC拟合鲁棒回归模型
线性回归模型可能会受到异常值的严重影响。在某些情况下,一小部分数据可能会对估计的模型系数有很大的影响。
- 有许多统计检验可以用来检测异常值,然而,去除异常值需要数据科学家的判断以及相关领域知识。
- 除了淘汰异常值之外,我们还有一种鲁棒回归方法,即随机抽样一致性(RANdom SAmple Consensus,RANSAC)算法,根据数据子集(所谓的内点,inlier)来拟合回归模型。(即RANSAC可以避免异常值的影响)
RANSAC算法:
对MSE的解释取决于数据集和特征缩放。例如,如果以1000(用K表示)为单位计算房价,与未使用特征缩放的模型相比,该模型所产生的MSE较低。
- 有时候,报告决定系数
可能更为有用,我们可以把这理解为MSE的标准版,其目的是为更好地解释模型的性能。换句话说
是模型捕获到的响应方差函数的一部分。我们定义
值如下:
- 这里,SSE是平方误差之和,而SST是平方和之总和:
换句话说,SST只是反应的方差。下面将很快证明
的确只是修正版的MSE:
+ 10.6 用正则化方法进行回归
正则化是通过添加额外信息解决过拟合问题的一种方法,而缩小模型参数值却引来复杂性的惩罚。
正则线性回归最常用的方法包括所谓:
一种有效解决违背线性假设的方法是,通过增加多项式项利用多项式回归模型:
+ 10.8 用随机森林处理非线性关系
随机森林是多棵决策树的组合,可以理解为分段线性函数之和,与以前讨论过的全局性线性和多项式回归模型相反。换句话说,通过决策树算法,我们可以进一步将输入空间细分为更小的区域,这些区域也因此变得更易于管理。
10.8.1 决策树回归
决策树算法的一个优点是,如果处理非线性数据,它不需要对特征进行任何转换。因为决策树一次只分析一个特征,而不是考虑加权组合。
- 通过迭代分裂节点,直到叶子是纯的,或者满足停止分裂的标准为止,以培养一棵决策树。
- 当用决策树进行分类时,定义熵作为杂质的指标以确定采用哪个特征分裂可以最大化信息增益(Information Gain, IG),二进制分裂可以定义为:
- 在决策树回归的背景下,通常我们也把MSE称为节点方差(within-node variance),这就是我们也把分裂标准称为方差缩减(variance reduction)的原因。
- 这种模式的一个局限性在于它并不捕获所需预测的连续性和可微性。
此外,在选择树的适当深度值时要小心,既要确保不过拟合也要避免欠拟合。这里深度为3似乎是个不错的选择。
10.8.2 随机森林回归
核技巧,它可以与支持向量机(SVM)组合完成分类任务,这对处理非线性问题很有用。虽然这方面的讨论超出了本书的范围,但支持向量机也可以用于非线性回归任务。
- 感兴趣的读者可以在一篇优秀的研究报告(Support VectorMachines for Classification and Regression)
scikit-learn也实现了SVM回归:http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html#sklearn.svm.SVR
C11 用聚类分析处理无标签数据
索聚类分析,这是一种无监督学习技术,在无法预先知道正确答案的情况下发现数据中的隐藏结构。聚类的目标是在数据中找到自然分组,以确保相同集群中的元素比不同集群中的元素更相似。
使用流行的k-均值算法寻找相似性中心。
- 采用自下而上的方法构建层次聚类树。
-
+ 11.1 用k-均值进行相似性分组
11.1.1 用scikit-learn实现k-均值聚类
与其他的聚类算法相比,k-均值算法极易实现而且计算效率也很高,这也许可以解释为什么它这么流行。k-均值算法属于基于原型聚类的范畴。在本章的后面,我们将讨论层次化(hierarchical)和基于密度(density-based)的另外两种聚类方法。
- 基于原型的聚类意味着每个类都由一个原型表示,该原型通常是具有连续特征的相似点的质心(centroid)(平均值),或者,对分类特征而言,该原型为类中心(medoid)——最具代表性的点,或距离类中所有其他点最近的点。
- k-均值方法非常擅长识别球形集群,其缺点是必须指定集群数k,所以它是个【先验方法】。
- 在本章的后面,我们将讨论肘部方法(elbow)和轮廓图(silhouette plot),这是评估聚类质量以确定最优集群数k的有效技术。
虽然k-均值在这个小数据集上工作得很好,但是我们必须指出k-均值的另外一个缺点:必须在无推理的前提下指定集群的数目k。在实际应用中,选择的集群数目可能并不总是那么明显,特别是在处理无法可视化的高维数据集时。
11.1.2 k-均值++ - 更聪明地设置初始集群质心的方法
到目前为止,我们已经讨论了用随机种子设置初始值质心的经典k-均值算法,有时如果初始集群质心选择不当就会导致聚类不良或收敛缓慢。解决这个问题的一种方法是在数据集上多次运行k-均值算法,并根据SSE选择性能最佳的模型。
另一个策略是通过k-均值++算法,让初始质心彼此尽可能远离,带来比经典k-均值更好且更一致的结果。书中的解释有些不好理解,核心是可选择质心点的加权概率。即距离前面质心点越远的点,越容易被选中。具体过程:
与此相反,软聚类(有时也称为模糊聚类)将一个样本分配给一个或多个集群。常见的软聚类例子是模糊C-均值(FCM)算法(也被称为软k-均值或模糊k-均值)。
- 四个关键步骤:
- 指定k质心的数量然后随机为每个质心点分配集群成员。
- 计算集群的质心
- 更新每个点的集群成员
- 重复步骤2和步骤3,直到成员系数不再变化或达到用户定义的容忍阈值或最大迭代数。
- 我们把FCM的目标函数缩写为
,该函数看起来非常像在k-均值中见过的群内误差平方和:
- FCM的每次迭代都比k-均值中的迭代更为昂贵。然而FCM通常只需要较少的迭代就能收敛。
scikit-learn目前还没有实现FCM算法。然而,在实际应用中我们已经发现,k-均值和FCM产生非常相似的聚类结果。
11.1.5 通过轮廓图量化聚类质量
评估聚类质量的另一个有内在联系的度量是轮廓分析(silhouette analysis),它也可以应用于k-均值以外的聚类算法。
轮廓分析可以作为图形工具来绘制度量集群中样本分组的紧密程度。可以用以下三个步骤来计算数据集中单个样本的轮廓系数:
层次聚类算法的优点是它允许绘制树状图(二进制层次聚类的可视化),这有助于我们解释创建有意义分类的结果。这种分层方法的另一个优点是不需要预先指定集群数目。
层次聚类的两种主要方法是凝聚(agglomerative)层次聚类和分裂(divisive)层次聚类。
凝聚层次聚类的两个标准算法分别是单连接(single linkage)和全连接(complete linkage)。
- 单连接算法计算两个集群中最相近成员之间的距离,然后合并两个集群,其中两个最相近成员之间的距离最小。
全连接方法类似于单连接,但是,不是比较两个集群中最相近的成员,而是比较最不相近的成员然后合并。
【凝聚层次聚类】
凝聚层次聚类算法中其他常用的方法包括平均连接(average linkage)和Ward连接。平均连接基于两个集群中所有组成员之间的最小平均距离来合并集群。Ward连接法合并引起总的集群内SSE增长最小的两个集群。
其中的次全连接聚类是一个迭代过程,我们可以把具体步骤总结如下:
基于密度空间的有噪声应用聚类(Density-Based Spatial Clustering of Applications with Noise, DBSCAN),不像k-均值方法那样假设集群呈球形,把数据集分成不同层,这需要人工设定分界点。
- 顾名思义,基于密度的聚类把集群标签分配给样本数据点密集的区域。在DBSCAN中,密度定义为指定半径 ε范围内的样本数据点数。
- 采用DBSCAN算法,我们根据下列标准把特殊的标签分配给每个样本(数据点):
- 如果有至少指定数量(MinPts)的相邻点落在以该点为圆心的指定半径ε范围内,那么该点为核心点(core point)。
- 如果在核心点的半径ε范围内,相邻点的数量比半径ε范围内的MinPts少,该点叫边界点(border point)。
- 所有那些既不是核心点也不是边界点的其他点被认为是噪声点(noise point)。
在把所有的点分别标示为核心点、边界点和噪声点之后。我们可以用以下两个步骤来概括DBSCAN算法:
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)
- 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)
- 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)
- 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)
- 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)
- 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)
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 单层神经网络回顾
第二章中介绍的用于二元分类的Adaline(自适应神经网络),是一个单层神经网络:
虽然Adaline由输入层和输出层组成,但被称为单层网络,因为在输入层和输出层之间存在着单链接(只有一行)
12.1.2 多层神经网络体系结构简介
将多个单神经元连接到多层前馈神经网络。这种特殊类型的全连接网络也被称为MLP( multilayer perceptron 多层感知器)
- 区别在于横向增加了中间的隐藏层hidden layer,即有多个感知器接收数据
- 如果MLP有一个以上的隐藏层,就称为【深度人工神经网络】
- 上图中:
用来表示第
(in输入层,h隐藏层,out输出层中的一个)层的第,
个激活单元(第i个输入,一共m个)
- 这里
和
为偏置单元,定义为1
- 输入层的激活单元只是输入单元加上偏置单元:
- 偏执单元命名规则
层中每个单元通过权重系数与
层中的所有单元连接。例如
层中的第
个单元与
层中的第
个单元之间的连接可以表示为:
- 我们把连接输入层到隐藏层的权重矩阵表示为
- 把连接隐藏层到输出层的矩阵表示为
我们以更普遍的鸢尾花三分类标签的独热转换为例(0=Setosa,1=Versicolor,2=Virginica)为例:
MLP的学习过程总结为下述三个简单步骤:
- 从输入层开始,通过网络正向传播训练数据的模式以生成输出
- 基于网络的输出,用稍后即将描述的代价函数来计算想要最小化的误差
- 反向传播误差,匹配网络中相应的权重结果并更新模型
最后,在上述三个步骤经过多次迭代并学习了MLP权重之后,用正向传播计算网络输出,并用阈值函数以前面描述的独热表达方式获得预测的分类标签
【正向传播计算】
正向传播详细计算:
- 由于隐藏层中的每个单元都与输入层中的所有单元相连接,因此首先对隐藏层的激活单元
进行计算:
为静输入
为激活函数,要以基于梯度的方法学习与神经元连接的权重,则该函数必须可导(原为可微)
- 为了能够解决诸如图像分类这种复杂的问题,需要MLP模型中存在非线性激活函数,例如sigmoid(逻辑)激活函数(第3章介绍的):
- 由于隐藏层中的每个单元都与输入层中的所有单元相连接,因此首先对隐藏层的激活单元
- MLP是前馈人工神经网络的典型例子。前馈一词指的是每一层的输出作为下一层的输入而且不循环,与本章后面将要讨论的循环神经网络相反
多层感知器一词听起来可能有些不够贴切,因为这种网络体系结构的人工神经元通常并不是感知器,而是sigmoid单元。直观上说,可以把MLP中的神经元看作是逻辑回归单元,其返回值在0和1之间的连续范围内
【Numpy实现】
- 其中
为样本
的
维特征向量再加上偏置单元
为
维权重矩阵,
为隐藏层单元的个数
- 其中
- 在完成矩阵-向量计算之后,得到
维净输入向量
用以计算激活值
- 在完成矩阵-向量计算之后,得到
- 进一步将这种计算推广到训练数据集的
个样本(前面向量,下面矩阵):
类似地,我们可以把多个样本的输出层激活值的计算表达为向量形式:
根据【3.3.3】中介绍的代价函数(sigmond):
- 变换为:
- 这里
为数据集中第
个样本用正向传播算法计算出的sigmoid激活值:
- 请注意,这个表达式上标
是训练样本的索引而不是层的
- 现在添加一个正则化项以减少过拟合的机会。正如前面章节中讨论过的那样,L2正则化项的定义如下:
- 得到以下等式:
- 在我们已经实现的用于多元分类的MLP中,它返回一个拥有t个元素的输出向量,这需要与t×1维独热编码所表示的目标向量进行比较
- 例如,某个样本的第三层和目标类(这里是2类)的激活可能以如下方式来表示(中文版y第一个输出是错的,坑!,这里输出a中0.9即为最可能的分类,正好对应了y真实值中的1):
- 因此,我们需要将逻辑代价函数推广到网络中所有t激活单元:
- 再加上L2正则化项,它计算的是添加到第一列的那个层(无偏置项)所有权重的总和:
- 这里
为
层的单元数,下面的表达式代表惩罚项:
- 如图所示,
连接输入层与隐藏层,
连接隐藏层与输出层,虽然这里好像有相同的行数和列数,情况通常并不是这样,除非在初始化MLP时,我们采用相同的隐藏单元数、输出单元数和输入样本数:
-
12.3.2 理解反向传播
/反向传播历史的参考文献/ Who Invented Backpropagation?
- 链式规则,是一种计算复杂嵌套函数导数的方法,如
求导:
- 类似地,我们可以用链式规则来处理任意长的函数组合,假设
为函数组合:
,则导数为:
- 对解决这类问题,计算机代数已经开发了一套非常有效的技术,也就是所谓的自动微分 /Automatic Differentiation of Algorithms for Machine Learning/
-
12.3.3 通过反向传播训练神经网络
这里我们把代价定义为最后一层激活与目标分类标签之间的差
- 现在将从数学角度来看反向传播算法如何更新MLP模型的权重,该算法在Backpropagation部分的fit方法中实现
- 正如我们在本章开头所提到的那样,首先应用正向传播以获得输出层的激活,公式如下:
- 两层的net input和activation如下图所示,其中
中的元素即是每个样本
最后的预测值
:
- 反向传播从右向左传播误差。首先从计算输出层的误差向量开始,其中
为真实分类标签的向量
- 接着我们来计算隐藏层的误差项:
- 这里
为sigmoid激活函数的导数
- 我们在NeuralNetMLP代码的fit方法中这样计算:
sigmoid_derivative_h=a_h*(1.-a_h)
- 这里
- 总结:
C13 用TensorFlow并行训练神经网络