- 机器学习
- 监督学习(Supervised Learning )
- 无监督学习(Unsupervised Learning)
- 单变量线性回归(Linear Regression with One Variable)
- 多变量线性回归(Linear Regression with Multiple Variables)
- 逻辑回归(Logistic Regression)
- 正则化(Regularization)
- 神经网络:表述(Neural Networks: Representation)
- 神经网络的学习(Neural Networks: Learning)
- 机器学习建议(Advice for Applying Machine Learning)
- 机器学习系统的设计(Machine Learning System Design)
- 支持向量机(Support Vector Machines)
2014 machine learning
Andrew Ng Stanford
机器学习
阿瑟·萨缪尔 Arthur Samuel,在进行特定编程的情况下,给予计算机学习能力的领域(我自己下棋菜,但是编个程序,程序自己跟自己下了上万盘棋,这下棋程序明白了什么是好的局什么样是坏的布局这就厉害了)。
Tom Mitchell,一个程序被认为能从经验 E 中学习,解决任务 T,达到性能度量值 P,当且仅当,有了经验 E 后,经过 P 评判,程序在处理 T 时的性能有所提升。
监督学习(Supervised Learning )
监督学习,其基本思想是,我们数据集中的每个样本都有相应的“正确答案”,再根据这些样本作出预测。
回归问题,即通过回归来推出一个连续的输出。如下:我们试着推测出一个连续值的结果,即房子的价格。
分类问题,其目标是推出一组离散的结果。如下:判断良心恶性肿瘤。
无监督学习(Unsupervised Learning)
无监督学习中没有任何的标签或者是有相同的标签或者就是没标签。所以我们已知数据集,却不知如何处理,也未告知每个数据点是什么。别的都不知道,就是一个数据集。针对数据集,无监督学习就能判断出数据有两个不同的聚集簇,无监督学习算法可能会把这些数据分成两个不同的簇,所以叫做聚类算法。
Octave、Matlab工具,现在 Python 变主流了。
区别例子
监督学习:垃圾邮件、良心恶性肿瘤
无监督学习:新闻事件分类、细分市场
单变量线性回归(Linear Regression with One Variable)
模型表示(Model Representation)


𝑚 代表训练集中实例的数量
𝑥 代表特征/输入变量
𝑦 代表目标变量/输出变量
(𝑥, 𝑦) 代表训练集中的实例
(𝑥(𝑖), 𝑦(𝑖)) 代表第𝑖 个观察实例
ℎ 代表学习算法的解决方案或函数也称为假设(hypothesis)
一种可能的表达方式为:ℎ𝜃(𝑥) = 𝜃0 + 𝜃1𝑥,因为只含有一个特征/输入变量,因此这样
的问题叫作单变量线性回归问题。
代价函数(Cost Function )
代价函数 :𝐽(𝜃0, 𝜃1) = 21𝑚 ∑ (ℎ𝜃(𝑥(𝑖)) − 𝑦(𝑖))2
代价函数也被称作平方误差函数,有时也被称为平方误差代价函数。之所以要求出 误差的平方和,是因为误差平方代价函数,对于大多数问题,特别是回归问题是一个合理的选择。还有其他的代价函数也能很好地发挥作用,但是平方误差代价函数可能是解决回归问题最常用的段。

理解这些代价函数𝐽所表达的值是什么样的,它们对应的假设是什么样的,以及什么样的假设对应的点,更接近于代价函数𝐽的最小值。
梯度下降(Gradient Descent)
梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数 𝐽(𝜃0, 𝜃1) 的最小值。
梯度下降背后的思想是:开始时我们随机选择一个参数的组合(𝜃0, 𝜃1, . . . . . . , 𝜃𝑛),计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到到到一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值
其中𝑎是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大,在批量梯度下降中,每一次都同时让所有的参数减去学习速率乘以代价函数的导数。
导数理解

对于这个问题,求导的目的,基本上可以说取这个红点的切线,就是这样一条红色的直线,刚好与函数相切于这一点,让我们看看这条红色直线的斜率,就是这条刚好与函数曲线相切的这条直线,这条直线的斜率正好是这个三角形的高度除以这个水平长度,现在,这条线有一个正斜率,也就是说它有正导数,因此,我得到的新的𝜃1,𝜃1更新后等于𝜃1减去一个正数乘以𝑎。
𝑎大小结果
如果𝑎太小了,即我的学习速率太小,如果𝑎太小的话,可能会很慢, 需要很多步才能到达全局最低点。
如果𝑎太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,所以,如果𝑎太大,它会导致无法收敛,甚至发散。
梯度下降的线性回归(GradientDescentForLinearRegression )
批量梯度下降,指的是在梯度下降的每一步中,我们都用到了 所有的训练样本,在梯度下降中,在计算微分求导项时,我们需要进行求和运算,所以,在每一个单独的梯度下降中,我们最终都要计算这样一个东西,这个项需要对所有𝑚个训练样本求和。
多变量线性回归(Linear Regression with Multiple Variables)
多维特征(Multiple Features )
多变量梯度下降(Gradient Descent for Multiple Variables )
与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,则这个代价函数是所有建模误差的平方和。目标和单变量线性回归问题中一样,是要找出使得代价函数最小的一系列参数。


def computeCost(X, y, theta):inner = np.power(((X * theta.T) - y), 2)return np.sum(inner) / (2 * len(X))
梯度下降法实践
特征缩放(Feature Scaling)
尝试将所有特征的尺度都尽量缩放到-1 到 1 之间。
学习率(Learning Rate)
梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,我们不能提前预知,我们可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。
梯度下降算法的每次迭代受到学习率的影响,如果学习率𝑎过小,则达到收敛所需的迭代次数会非常高;如果学习率𝑎过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛。
通常可以考虑尝试些学习率:
𝛼 = 0.01,_0.03,0.1,0.3,1,3,_10
特征和多项式回归(Features and Polynomial Regression)

如果采用多项式回归模型,在运行梯度下降算法前,特征缩放非常有必要。
正规方程(Normal Equation)
对于某些线性回归问题,正规方程方法是更好的解决方案。如: 

注:对于那些不可逆的矩阵(通常是因为特征之间不独立,如同时包含英尺为单位的尺寸和米为单位的尺寸两个特征,也有可能是特征数量大于训练集的数量),正规方程方法是不能用的。
比较
| 梯度下降 | 正规方程 |
|---|---|
| 需要选择学习率α | 不需要 |
| 需要多次迭代 | 一次运算得出 |
| 当特征数量𝑛大时也能较好适用 | 需要计算 如果特征数量𝑛较大则 运算代价大,因为矩阵逆的计算时间复杂度 为𝑂(𝑛3),通常来说当𝑛小于 10000 时还是可以接受的 |
| 适用于各种类型的模型 | 只适用于线性模型,不适合逻辑回归模型等其他模型 |
Octave教程(Octave Tutorial)
ps:Course六月要出python版本课程了
基本操作
移动数据
计算数据
绘图数据
控制语句:for,while,if语
向量化
工作和提交的编程练习
逻辑回归(Logistic Regression)
分类问题(Classification)
尝试预测的是结果是否属于某一个类(例如正确或错误)。
逻辑回归算法,是分类算法,算法的性质是:它的输出值永远在 0 到 1 之间。
假说表示(Hypothesis Representation )
在分类问题中,要用什么样的函数来表示我们的假设。此前我们说过,希望我们的分类器的输出值在 0 和 1 之间,因此,我们希望想出一个满足某个性质的假设函数,这个性质是它的预测值要在 0 和 1之间。
逻辑回归,该模型的输出变量范围始终在 0 和 1 之间。 逻辑回归模型的假设是: ℎ𝜃(𝑥) = 𝑔(𝜃𝑇𝑋)其中: 𝑋代表特征向量 𝑔代表逻辑函数是一个常用的逻辑函数为 S 形函数(Sigmoid function),公式为:
判断边界( Decision Boundary )

在逻辑回归中,我们预测:
当ℎ𝜃(𝑥) >= 0.5时,预测 𝑦 = 1。
当ℎ𝜃(𝑥) < 0.5时,预测 𝑦 = 0 。
根据上面绘制出的 S 形函数图像,我们知道当
𝑧 = 0 时 𝑔(𝑧) = 0.5
𝑧 > 0 时 𝑔(𝑧) > 0.5
𝑧 < 0 时 𝑔(𝑧) < 0.5
又 𝑧 = 𝜃𝑇𝑥 ,即:
𝜃𝑇𝑥 >= 0 时,预测 𝑦 = 1
𝜃𝑇𝑥 < 0 时,预测 𝑦 = 0
现在假设我们有一个模型:

并且参数𝜃 是向量[-3 1 1]。 则当−3 + 𝑥1 + 𝑥2 ≥ 0,即𝑥1 + 𝑥2 ≥ 3时,模型将预测 𝑦 = 1。 我们可以绘制直线𝑥1 + 𝑥2 = 3,这条线便是我们模型的分界线,将预测为 1 的区域和预测为 0 的区域分隔开。
因为需要用曲线才能分隔 𝑦 = 0的区域和 𝑦 = 1的区域,我们需要二次方特征: ℎ𝜃(𝑥) = 𝑔(𝜃0 + 𝜃1𝑥1 + 𝜃2𝑥2 + 𝜃3𝑥12 + 𝜃4𝑥22)是[-1 0 0 1 1],则我们得到的判定边界恰好是圆 点在原点且半径为 1 的圆形。 我们可以用非常复杂的模型来适应非常复杂形状的判定边界。
代价函数(Cost Function)
定义用来拟合参数的优化目标或者叫代价函数,这便是监督学习问题中的逻辑回归模型的拟合问题。

import numpy as npdef cost(theta, X, y):theta = np.matrix(theta)X = np.matrix(X)y = np.matrix(y)first = np.multiply(-y, np.log(sigmoid(X* theta.T)))second = np.multiply((1 - y), np.log(1 - sigmoid(X* theta.T)))return np.sum(first - second) / (len(X))
注:虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里的ℎ𝜃(𝑥) = 𝑔(𝜃𝑇𝑋)与线性回归中不同,所以实际上是不一样的。另外,在运行梯度下降算法 之前,进行特征缩放依旧是非常必要的。
除了梯度下降算法以外,还有一些常被用来令代价函数最小的算法,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常比梯度下降算法要更加快速。这些算法有:共轭梯度(Conjugate Gradient),局部优化法(Broyden 机器fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS) 。
简化的成本函数和梯度下降(Simplified Cost Function and Gradient Descent )
找出一种稍微简单一点的方法来写代价函数,来替换我们现在用的方法。同时我们还要弄清楚如何运用梯度下降法,来拟合出逻辑回归的参数。

即使更新参数的规则看起来基本相同,但由于假设的定义发生了变化,所以逻辑函数的梯度下降,跟线性回归的梯度下降实际上是两个完全不同的东西。
高级优化(Advanced Optimization)
共轭梯度法 、BFGS (变尺度法) 和 L-BFGS (限制变尺度法) 就是其中一些更高级的优化算法,它们需要有一种方法来计算 𝐽(𝜃),以及需要一种方法计算导数项,然后使用比梯度下降更复杂的算法来最小化代价函数。
优点
不需要手动选择学习率 𝛼,所以对于这些算法的一种思路是,给出计算导数项和代价函数的方法,可以认为算法有一个智能的内部循环,事实上他们确实有一个智能的内部循环,称为线性搜索(line search)算法,它可以自动尝试不同的学习速率 𝛼,并自动选择一个好的学习速率 𝑎,因此它可以为每次迭代选择不同的学习速率。这些算法实际上在做更复杂的事情,而不仅仅是选择一个好的学习率,所以它们往往最终收敛得远远快于梯度下降。
多类别分类:一对多(Multiclass Classification_ One-vs-all)
正则化(Regularization)
过拟合问题(The Problem of Overfitting)

第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。我们可以看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎最合适。 
就以多项式理解,𝑥 的次数越高,拟合的越好,但相应的预测的能力就可能变差。
如何处理?
1.丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如 PCA)
2.正则化。 保留所有的特征,但是减少参数的大小(magnitude)。
代价函数(Cost Function)
回归问题模型:
高次项导致了过拟合的产生,所以如果我们能让这些高次项的系数接近于 0 的话,我们就能很好的拟合了。所以我们要做的就是在一定程度上减小这些参数𝜃 的值,这就是正则化的基本方法。减少𝜃3和𝜃4的大小便是修改代价函数,在其中𝜃3和𝜃4 设置一点惩罚。这样做的话,我们在尝试最小化代价时也需要将这个惩罚纳入考虑中,并最终导致选择较小一些的𝜃3和𝜃4。
修改后的代价函数如下:
通过这样的代价函数选择出的𝜃3和𝜃4 对预测结果的影响就比之前要小许多。假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚,并且让代价函数最优化的软件来选择这些惩罚的程度。这样的结果是得到了一个较为简单的能防止过拟合问题的假设:
其中\lambda 又称为正则化参数(Regularization Parameter)。 注:根据惯例,我们不对{\theta{0}} 进行惩罚。经过正则化处理的模型与原模型的可能对比如下图所示:
如果选择的正则化参数 λ 过大,则会把所有的参数都最小化了,导致模型变成 ,也就是上图中红色直线所示的情况,造成欠拟合。
那为什么增加的一项 可以使𝜃的值减小呢?
因为如果我们令 𝜆 的值很大的话,为了使 Cost Function 尽可能的小,所有的 𝜃 的值(不包括𝜃0)都会在一定程度上减小。
但若 λ 的值太大了,那么𝜃(不包括𝜃0)都会趋近于 0,这样我们所得到的只能是一条平行于𝑥轴的直线。
所以对于正则化,要取一个合理的 𝜆 的值,这样才能更好的应用正则化。
正则化线性回归(Regularized Linear Regression)
对于线性回归的求解,我们之前推导了两种学习算法:一种基于梯度下降,一种基于正 规方程。
正则化线性回归的代价函数为
如果我们要使用梯度下降法令这个代价函数最小化,因为我们未对\theta0进行正则化,所以梯度下降算法将分两种情形:

对上面的算法中𝑗 = 1,2, . . . , 𝑛 时的更新式子进行调整可得:

可以看出,正则化线性回归的梯度下降算法的变化在于,每次都在原有算法更新规则的基础上令\theta 值减少了一个额外的值。
我们同样也可以利用正规方程来求解正则化线性回归模型,方法如下所示(图中的矩阵尺寸为 (n+1)*(n+1)。)
正则化的逻辑回归模型(Regularized Logistic Regression)

自己计算导数同样对于逻辑回归,我们也给代价函数增加一个正则化的表达式,得到代
价函数:
神经网络:表述(Neural Networks: Representation)
非线性假设(Non-linear Hypotheses )
神经元和大脑(Neurons and the Brain)
模型表示(Model Representation I)
样本和直关理解(Examples and Intuitions)
多类分类(Multiclass Classification )
当我们有不止两种分类时(也就是𝑦 = 1,2,3 ….),比如以下这种情况,该怎么办?如果我们要训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层我们应该有 4 个值。例如,第一个值为 1 或 0 用于预测是否是行人,第二个值用于判断是否为汽车。输入向量𝑥有三个维度,两个中间层,输出层 4 个神经元分别用来表示 4 类,也就是每一个数据在输出层都会出现[𝑎 𝑏 𝑐 𝑑]𝑇,且𝑎, 𝑏, 𝑐, 𝑑中仅有一个为 1,表示当前类。下面是该神经网络的可能结构示例:
神经网络的学习(Neural Networks: Learning)
代价函数(Cost Function )
反向传播算法(Backpropagation Algorithm)
实现注意:展开参数(Implementation Note_ Unrolling Parameters)
梯度检验(Gradient Checking)
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的 𝜃,我们计算出在 𝜃-𝜀 处和 𝜃+𝜀 的代价值(𝜀是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 𝜃 处的代价值。
随机初始化(Random Initialization)
任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为 0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为 0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非 0 的数,结果也是一样的。
我们通常初始参数为正负𝜀之间的随机值,假设我们要随机初始一个尺寸为 10×11 的参数矩阵,代码如下:
Theta1 = rand(10, 11) * (2*eps) – eps
综合起来(Putting It Together)
小结一下使用神经网络时的步骤:
网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。
第一层的单元数即我们训练集的特征数量。
最后一层的单元数是我们训练集的结果的类的数量。
如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。
我们真正要决定的是隐藏层的层数和每个中间层的单元数。
训练神经网络:
- 参数的随机初始化
- 利用正向传播方法计算所有的h_{\theta}(x)
- 编写计算代价函数 J 的代码
- 利用反向传播方法计算所有偏导数
- 利用数值检验方法检验这些偏导数
- 使用优化算法来最小化代价函数。
自动驾驶(Autonomous Driving)

机器学习建议(Advice for Applying Machine Learning)
决定下一步做什么(Deciding What to Try Next)
获得更多的训练实例——通常是有效的,但代价较大,下面的方法也可能有效,可考虑先采用下面的几种方法。
1.尝试减少特征的数量
2.尝试获得更多的特征
3.尝试增加多项式特征
4.尝试减少正则化程度𝜆
5.尝试增加正则化程度?
我们不应该随机选择上面的某种方法来改进我们的算法,而是运用一些机器学习诊断法来帮助我们知道上面哪些方法对我们的算法是有效的。评估一个假设(Evaluating a Hypothesis)
你该如何判断一个假设函数是过拟合的呢?对于这个简单的例子,我们可以对 假设函数ℎ(𝑥)进行画图,然后观察图形趋势,但对于特征变量不止一个的这种一般情况,还有像有很多特征变量的问题,想要通过画出假设函数来进行观察,就会变得很难甚至是不可能实现。
为了检验算法是否过拟合,将数据分成训练集和测试集,通常用 70%的数据作为训练集,用剩下 30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。
1.对于线性回归模型,我们利用测试集数据计算代价函数𝐽
2.对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外:
误分类的比率,对于每一个测试集实例,计算:
模型选择和交叉验证集(Model Selection and Train_Validation_Test Sets)
假设我们要在 10 个不同次数的二项式模型之间进行选择:

显然越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集并不代表着能推广至一般情况,我们应该选择一个更能适应一般情况的模型。我们需要使用交叉验证集来帮助选择模型。即:使用 60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用 20%的数据作为测试集 。
模型选择的方法为:
1. 使用训练集训练出 10 个模型
2. 用 10 个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)
3. 选取代价函数值最小的模型
4. 用步骤 3 中选出的模型对测试集计算得出推广误差(代价函数的值)
诊断偏差和方差(Diagnosing Bias vs. Variance)
如果这个算法的表现不理想,那么多半是出现两种情况:要么是偏差比较大,要么是方差比较大。换句话说,出现的情况要么是欠拟合,要么是过拟合问题。那么这两种情况,哪个和偏差有关,哪个和方差有关,或者是不是和两个都有关?搞清楚这一点非常重要,因为能判断出现的情况是这两种情况中的哪一种。其实是一个很有效的指示器,指引着可以改进算法的最有效的方法和途径。对它们有一个更深入的理解,并且也能弄清楚怎样 评价一个学习算法,能够判断一个算法是偏差还是方差有问题,因为这个问题对于弄清如何改进学习算法的效果非常重要,高偏差和高方差的问题基本上来说是欠拟合和过拟合的问
题。
通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图表上来帮助分析:

对于训练集,当 𝑑 较小时,模型拟合程度更低,误差较大;随着 𝑑 的增长,拟合程度提高,误差减小。
对于交叉验证集,当 𝑑较小时,模型拟合程度低,误差较大;但是随着 𝑑的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。
训练集误差和交叉验证集误差近似时:偏差/欠拟合
交叉验证集误差远大于训练集误差时:方差/过拟合正则化和偏差/方差(Regularization and Bias_Variance )
在我们在训练模型的过程中,一般会使用一些正则化方法来防止过拟合。但是我们可能会正则化的程度太高或太小了,即我们在选择 λ 的值时也需要思考与刚才选择多项式模型次数类似的问题。
我们选择一系列的想要测试的 𝜆值,通常是 0-10 之间的呈现 2 倍关系的值(如0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10共 12 个)同样把数据分为训练集、交叉验证集和测试集。
选择𝜆的方法为:
1.使用训练集训练出 12 个不同程度正则化的模型
2.用 12 个模型分别对交叉验证集计算的出交叉验证误差
3.选择得出交叉验证误差最小的模型
4.运用步骤 3 中选出模型对测试集计算得出推广误差
也可以同时将训练集和交叉验证集模型的代价函数误差与 λ 的值绘制在一张图表上
• 当 𝜆 较小时,训练集误差较小(过拟合)而交叉验证集误差较大
• 随着 𝜆 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加学习曲线(Learning Curves)
使用学习曲线来判断某一个学习算法是否处于偏差、方差问题。学习曲线是学习算法的一个很好的合理检验(sanity check)。学习曲线是将训练集误差和交叉验证集误差作为训练集实例数量(𝑚)的函数绘制的图表。
如何利用学习曲线识别高偏差/欠拟合:作为例子,我们尝试用一条直线来适应下面的数据,可以看出,无论训练集有多么大误差都不会有太大改观。也就是说在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。
如何利用学习曲线识别高方差/过拟合:假设我们使用一个非常高次的多项式模型,并 且正则化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。也就是说在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。
Deciding What to Do Next Revisited
- 获得更多的训练实例——解决高方差
2. 尝试减少特征的数量——解决高方差
3. 尝试获得更多的特征——解决高偏差
4. 尝试增加多项式特征——解决高偏差
5. 尝试减少正则化程度 λ——解决高偏差
6. 尝试增加正则化程度 λ——解决高方差
使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过正则化手段来调整而更加适应数据。
通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。
对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络, 然后选择交叉验证集代价最小的神经网络。机器学习系统的设计(Machine Learning System Design)
首先做什么(Prioritizing What to Work On)
误差分析(Error Analysis)
以垃圾邮件过滤器为例,误差分析要做的既是检验交叉验证集中我们的算法产生错误预测的所有邮件,看是否能将这些邮件按照类分组。例如医药品垃圾邮件,仿冒品垃圾邮件或者密码窃取邮件等。然后看分类器对哪一组邮件的预测误差最大,并着手优化。
误差分析并不总能帮助我们判断应该采取怎样的行动。有时需要尝试不同的模型,然后进行比较,在模型比较时,用数值来判断哪一个模型更好更有效,通常看交叉验证集的误差。
构建一个学习算法的推荐方法为:
1. 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法
2. 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择
3. 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的实例,看看这些实例是否有某种系统化的趋势
总结
- 在研究一个新的机器学习问题时,推荐实现一个较为简单快速、即便不是那么完美的算法。
- 假设你有了一个快速而不完美的算法实现,又有一个数值的评估数据,这会帮助你尝试新的想法,快速地发现你尝试的这些想法是否能够提高算法的表现,从而你会更快地做出决定,在算法中放弃什么,吸收什么,误差分析可以帮助我们系统化地选择该做什么。
类偏斜的误差度量(Error Metrics for Skewed Classes)
设定某个实数来评估你的学习算法,并衡量它的表现,有了算法的评估和误差度量值。有一件重要的事情要注意,就是使用一个合适的误差度量值,这有时会对于你的学习算法造成非常微妙的影响,这件重要的事情就是偏斜类(skewed classes)的问题。类偏斜情况表现为我们的训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。
查准率和查全率之间的权衡(Trading Off Precision and Recall)
作为遇到偏斜类问题的评估度量值。在很多应用中,我们希望能够保证查准率和召回率的相对平衡。
可以将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同:
我们希望有一个帮助我们选择这个阀值的方法。一种方法是计算F1 值(F1 Score),其计算公式为:,选择使得F1值最高的阀值。
机器学习的数据(Data For Machine Learning)
事实上,如果你选择任意一个算法,可能是选择了一个”劣等的”算法,如果你给这个劣等算法更多的数据,那么从这些例子中看起来的话,它看上去很有可能会其他算法更好,甚至会比”优等算法”更好。由于这项原始的研究非常具有影响力,因此已经有一系列许多不同的研究显示了类似的结果。这些结果表明,许多不同的学习算法有时倾向于表现出非常相似的表现,这还取决于一些细节,但是真正能提高性能的,是你能够给一个算法大量的训练数据。像这样的结果,引起了一种在机器学习中的普遍共识:”取得成功的人不是拥有最好算法的人,而是拥有最多数据的人”。支持向量机(Support Vector Machines)
支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)
支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。优化目标(Optimization Objective)

大边界的直观理解(Large Margin Intuition)



如果特征数量𝑛较大则 运算代价大,因为矩阵逆的计算时间复杂度 为𝑂(𝑛3),通常来说当𝑛小于 10000 时还是可以接受的

