Stanford 机器学习(吴恩达)课程小笔记

机器学习的定义

“A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.”

程序根据任务T和性能度量P对经验E进行学习,它在以P衡量的任务T中,性能会随着E增加。

机器学习的分类

监督学习非监督学习(supervise learning & unsupervise learning)

  • 监督学习是给定了正确答案的机器学习,又分类为回归(regression)和分类(classification)两种类型
  • 非监督学习没有给定结果和标签,非监督学习不会对预测结果产生反馈,分为聚类(cluster)和非聚类(non-cluster)两种。

表示

vector表示向量,通常都是列向量,n×1的矩阵,如
x=[x1x2xn] x=\begin{bmatrix} x_1\\ x_2\\ \vdots \\ x_n \end{bmatrix}

数据缩放(scaling)

在使用梯度下降算法时需要使用数据缩放,在使用解方程的方法解决线性回归问题的时候不需要使用数据缩放
其实是一种正则化,使得每个特征的取值范围不至于相差过大。
x^=xμs \hat{x}=\frac{x-\mu}{s}
其中,μ\mu是平均值,ss是 最大值-最小值

梯度下降中学习率α\alpha的选取

  • 通过绘画 迭代次数-误差函数 图来确定梯度下降算法是否出现问题


    正常情况下,将会越来越小

Stanford 机器学习(吴恩达)课程小笔记

  • 如果学习率过大,算法通常不收敛,甚至误差会越来越大

    Stanford 机器学习(吴恩达)课程小笔记
    或者Stanford 机器学习(吴恩达)课程小笔记
  • 如果学习率过小,则收敛速度非常慢

线性回归拓展为多项式回归

线性回归的常规形式是y=θ0x0+θ1x1++θnxny=\theta_0 x_0+\theta_1x_1+\dots+\theta_n x_n,这其中的xnx_n可以换成其他变量的非线性组合,比如x=x1x2,x=x1x2,x=x2x=x^1 \cdot x^2,x=\sqrt{x^1\cdot x^2},x=x^2等等。但是要记得对变量进行scaling,方法仍然是x^=xμs\hat{x}=\frac{x-\mu}{s}

参数优化的算法

除了最常见的梯度下降(gradient descend)之外,还有不少好的算法:

  • Conjugate gradient 共轭梯度
  • BFGS 被认为是数值效果最好的拟牛顿法,并且具有全局收敛性和超线性收敛速度。
  • L-BFGS 也就是Limited-memory BFGS

(这几种优化算法的数学推导和实现较为困难,但是不需要详细了解也不妨碍使用,用就行了不需要自己去实现)

将二分类拓展为多分类:One vs. All

这种方法的基本思想是:先将某一类作为正例,剩下的类别统统作为反例,这样就得到一个二分类的情景,以此训练一个分类器;然后将另一个类作为正例,剩下的都作为反例,以此类推,一共要训练m个分类器(m为所有的类别数)
一共有m=3个分类:
Stanford 机器学习(吴恩达)课程小笔记
分别将class1、class2、class3作为正例,剩下的作为反例,训练3个分类器
Stanford 机器学习(吴恩达)课程小笔记

使用时,将测试样本分别输入3个分类器,选取使得分类器结果为正例的概率最大的分类结果为该测试样本的分类。

Stanford 机器学习(吴恩达)课程小笔记

过拟合问题

  • underfit 欠拟合,也称为high bias
  • overfit 过拟合,也称为high variance

过拟合:对训练集拟合的非常好,但是对新数据的预测不好,无法泛化到新的数据集中。

过拟合的可能原因:

  • 特征太多而训练数据太少
  • 拟合函数(hypothesis)过于复杂

解决办法:

  • 减少特征
  • 更换模型算法
  • 正则化(regularization) 保留所有的特征变量,但是会减小特征变量的数量级(参数数值的大小θ(j))

梯度量化

梯度是一个关于权重θ\theta的函数,我们在进行梯度下降的时候,希望能知道梯度是否真的在下降,之前我们采用可视化代价函数值的方式,但是代价函数值在下降并不意味着梯度真的在下降,因此有必要将梯度可视化。

采用近似的方法:
Stanford 机器学习(吴恩达)课程小笔记
ddθJ(θ)J(θ+ϵ)J(θϵ)2ϵ \frac{d}{d\theta}J(\theta)\approx \frac{J(\theta+\epsilon)-J(\theta - \epsilon)}{2\epsilon}
通常ϵ\epsilon10210410^{-2} - 10^{-4}量级的数。

网络结构的选取

  • 输入层的节点数是训练数据的特征数
  • 输出层的节点是是分类的类别数
  • 隐藏层通常都是一层,也可以选取多层,每层具有同样数量的节点,一般来说,层数越多,性能越好,但是计算花销就更大。

确定模型之后的优化策略

  • 更多的训练数据
  • 增加/减少特征数量
  • 增加多项式特征(x2,x1x2,x^2,x_1x_2,\dots)
  • 增大/减小正则化项参数

训练集与测试集

  • 一般来说,训练集:测试集=7:3

    最好先进行随机排序,保持训练集的数据与测试集的数据相差不至于太大

  • 另一种划分方法:

    训练集:验证集:测试集=6:2:2

为什么要加入验证集:假如我们有多个模型,需要选择一个,我们在训练集训练之后如果直接用测试集来测,那么其实这之中多了一个参数:模型的不同。别忘了我们的测试集是为了检测最终模型的泛化误差的,不应该让模型见过多余的知识(其他参数)。所以我们要引入验证集,用来选择其中最合适的模型/参数集。通常,验证集的误差要比测试集的误差要 (因为验证集多了一个参数:模型的不同)

偏差与方差

偏差(bias):是指模型的期望值值与真实值之间的差,描述一个模型的拟合能力。偏差通常是由欠拟合造成的。
方差(variance):是指模型的期望值与预测值之间的差的平方,描述一个模型的稳定性。方差通常是由过拟合造成的。

Stanford 机器学习(吴恩达)课程小笔记
如图,如果训练误差高,验证集误差高->偏差大,欠拟合

训练误差低,验证集误差高->方差大,过拟合

与正则化的关系:

正则项λ\lambda越大,在训练集上拟合的越差,偏差就越高,但是方差越小。

正则项λ\lambda越小,在训练集上拟合的越好,偏差就越低,但是方差越大。

大致如下图:
Stanford 机器学习(吴恩达)课程小笔记

解决机器学习项目的一般过程

  1. 快速的构建一个简单的算法,实现它,然后将它在验证集上测试。
  2. 画学习曲线,决定是需要添加更多的特征还是更多的训练数据。
  3. 挑选出那些预测错误的数据,手动分析,以添加特定的特征解决这些问题。

一个很重要的点是要将错误率进行量化,也就是要算出当前的特征以及参数下这个模型的错误率是多少,进行调整之后的错误率又是多少,这样能很直观的知道对模型的改进是否有用。

准确率与召回率

混淆矩阵:
Stanford 机器学习(吴恩达)课程小笔记

  • 准确率是指:在预测为class=1的样本中,有多少个是真的为class=1
    $$
    precision=\frac{true ; positive}{true ; positive + false ; positive}

$$

  • 召回率是指:在所有class=1的样本中,预测出了其中的多少个
    recall=true  positivetrue  positive+false  negative recall = \frac{true \; positive}{true \; positive+ false \; negative}

几个问题

  1. 数据集的规模对过拟合/欠拟合有影响吗?

大量的数据集可以改善过拟合(防止过拟合),但是小的数据集影响不了过拟合。 大量的数据集对欠拟合问题没有帮助,小个数据集对欠拟合问题也没有帮助。

  1. 在逻辑回归的模型中,由线性函数通过sigmoid函数转换成output的时候,阈值一定要设为0.5吗(也就是使h(θTx)h(\theta^T x)=0.5作为output y=1或y=0的界限)?

不一定,虽然一般情况下是以0.5作为阈值,但是这不是硬性规定的,可以按照对精确率(precision)和召回率(recall)的特殊要求进行调整。影响效果如下:当阈值>0.5时,精确率提高,但是召回率下降;当阈值<0.5时,准确率下降,但是召回率提高。

  1. 精确率(precision)和准确率(accuracy)是同一个东西吗?

不是同一个东西,精确率是指在预测为1的例子中实际上为1的比值有多少,准确率是指所有的预测中预测正确的比值是多少,他们的公式如下:

precision=true&ThickSpace;positivetrue&ThickSpace;positive+false&ThickSpace;positive precision=\frac{true \; positive}{true \; positive + false \; positive}
accuracy=true&ThickSpace;positive+true&ThickSpace;negativeall&ThickSpace;samples accuracy = \frac{true \; positive + true \; negative}{all \; samples}