整理自 Andrew Ng 的 machine learning 课程 week6.
目录:
Advice for applying machine learning (Decide what to do next)
Debugging a learning algorithm
- machine learning diagnostic
- Evaluating a hypothesis
- Model selection and Train / validation / test set
- Bias and Variance
Diagnosing bias and variance
Regularization and bias / variance
- learning curve
- High bias
- High variance
- summary of decide what to do next
- diagnosing neural network
- Model complexity effects
Build a spam classifier
- Prioritzing what to work on
- Error analysis
- Error matric for skewed classes
- precision / recall
trade off precision and recall
- Data for machine learning
- 1,Advice for applying machine learning (Decide what to do next)
1.1,debugging a learning algorithm
假设你用 regularized linear regression 去解决预测房价的问题, 但是, 当你用模型去预测新的房价数据时, 发现预测的误差很大, 那么接下来你会怎么办呢?
获取更多的训练数据?
尝试使用更小的特征集合?
尝试使用更多的特征?
尝试增大 $\lambda$?
尝试减小 $\lambda$?
对于以上的一些做法, 你会怎么做呢? 依靠直觉吗?
现实中常常有人仅仅依靠直觉去选取某一种做法, 比如说获取更多的训练数据, 但是当他们耗费了大量的时间去完成这件事之后, 却发现模型性能并没有什么提升, 依靠直觉显然是一种不划算的做法
1.2,machine learning diagnostic
A test that you can run to gain insight what is/isn't working with a learning algorithm, and gain guidance as to how best to improve its performance.
machine learning diagnostic 是一个 test, 它可以让我们知道一个特定的算法是否是有用的, 并且可以指导我们, 怎么做才可以最大的提升模型的性能.
Diagnostic 可能会耗费你的时间, 但是相比于在实战中耗费大量的时间却发现结果不好而言, 这点时间是值得的.
1.3,Evaluating a hypothesis
如何去评估一个模型的好坏? 就像之前一直说过的, 训练模型做得好, 并不一定说明这个模型就是好的, 这个模型很有可能是过拟合的(如下图), 那么对新的数据集而言, 这个模型可能做的并不好.
所以用训练数据集上的误差评估模型的好坏是不可以的.
通常的做法是, 将数据集分为训练数据 (70%) 和测试数据(30%), 然后:
用训练数据去训练模型, 得到模型参数
用上面的模型去预测测试数据集上的数据, 计算测试集上的误差 error
用测试集上的 error 去评估模型的好坏
对于 linear regression:error 是($\frac{平方和}{m_{test}}$)
对于 logistic regression:
1.4,Model selection and Train / validation / test set
如果现在有多个模型 alg1,alg2,alg3......, 如下所示, 10 个不同阶的模型(代表着不同的模型复杂度), 我们需要选择最好的一个模型, 那么如何去选择呢(依照怎样的标准去选择)?
如果仿照 1.3 的做法, 先用训练数据训练出来模型, 再用测试数据去计算误差, 选择在测试数据集上误差最小的模型作为我们最终选定的模型;
思考一下, 如果这么做的话, 其实是和仅用训练数据误差评估模型好坏是一个道理, 此时选择出的只是在我们所用的测试集上误差最小的模型, 但是用其他的测试集的话, 可能并不是当前的模型误差最小, 那么这个误差并不能真正反映模型的好坏;
通常的做法是, 将数据集分成 train set / 训练集(60%),cross validation set / 验证集(20%),test set / 测试集(20%), 然后:
用训练集去训练多个模型, 获取每个模型的参数
用训练好的这些模型去预测验证集, 计算验证集上的误差, 选择出其中误差最小的模型
计算测试集在误差最小的模型上的误差, 作为此模型的评估标准
各个集合的误差计算如下:
2,Bias and Variance
在之前的文章中就接触过 bias 和 variance 的概念, 这里回顾一下:
训练集和验证集和误差计算如下:
2.1,Diagnosing bias and variance
随着 d(多项式的阶数)的增大, training error 和 cross validation error 的变化如下:
当模型比较简单的时候, 训练的程度低, 有欠拟合的现象 (high bias), 此时训练误差和测试误差(或者验证误差) 都比较大, 当 d 越来越大, 训练的程度越来越高, 训练误差和测试误差都在减小, 到达一个点之后, 模型过于复杂, 训练误差在继续减小, 但是此时已经出现了过拟合现象(high variance), 测试误差越来越大, 即:
Bias(underfit): 训练误差和测试误差都高, 两者差不多
Variance(overfit): 训练误差小, 测试误差很大, 远大于训练误差
2.2,Regulization and bias / variance
$\lambda$ 是惩罚因子, 如下图所示:
当 $\lambda$ 十分大时, 模型相当于只有是常数估计, 图像近似为一条横线, 欠拟合(high bias)
当 $\lambda$ 十分小时, 惩罚项的作用不大, 模型出现过拟合(high variance)
我们需要选取一个恰当的 $\lambda$, 使得模型刚刚好
那么问题来了, 如何选择一个恰当的 $\lambda$ 呢? 我们可以尝试:
设定一系列的 $\lambda$=[0, 0.01, 0.02, 0.04, 0.08, ......., 10.24], 比如说这 12 个 $\lambda$;
构造一组不同的模型(with different degrees or other variants)
对于每个模型遍历每个 $\lambda$, 用训练数据去训练这些组合确定的模型, 得到最终的模型参数;
计算验证集上的误差;
选取模型中使得验证集误差最小的模型;
计算选出的模型在测试集上的误差, 评估得到的模型的好坏;
利用一系列的 $\lambda$ 我们可以看到随着 $\lambda$ 的增大, training error 和 cv(cross validation) error 的变化:
当 $\lambda$ 非常小时, train error 很小, test error 很大, 此时训练程度高, 模型过拟合;
随着 $\lambda$ 的增大, train error 越来越大, test error 在减小, 模型过拟合现象在缓和;
当 $\lambda$ 增大到某个点之后, train error 和 test error 都开始变大, 因为此时模型是欠拟合的;
3,learning curves
这一部分主要是来评估训练数据集的大小和模型误差之间的关系, 对于训练误差而言:
当 training set 非常小(1,2,3 个训练数据),train error 就会接近 0, 因为如果点少的话, 当然可以找到一个曲线几乎完美的拟合这几个点;
当 training set 变大, train error 也会相应的变大;
当 training set 的数据量达到一个值后, train error 会趋于不变;
3.1,High bias
红线处是理应达到的误差下限, 训练误差和测试误差都远高于理想的误差
对此可以用下图来解释, 此时出现的问题是模型太过于简单, 这个时候获取更多的训练数据对模型是没什么帮助的
3.2,High variance
测试误差远大于训练误差, 此时出现了过拟合现象;
可用下图来解释这个现象, 模型太过于复杂, 惩罚也不大到位, 所以模型出现了过拟合现象, 此时如果可以增大训练数据的数目, 对模型应该是有帮助的;
4,summary of decide what to do next
针对文章一开始提出的问题, 经过一系列的梳理, 有了答案:
获取更多的训练数据? 解决 high variance 问题(overfitting)
尝试使用更小的特征集合? 解决 high variance 问题(overfitting)
尝试使用更多的特征? 解决 high bias 问题(underfitting)
尝试增大 $\lambda$? 解决 high variance 问题(overfitting)
尝试减小 $\lambda$? 解决 high bias 问题(underfitting)
5,Diagnosing neural network
具有较少的参数的 neural network 容易 underfitting, 同时也 computationally cheaper;
具有较多的参数的 neural network 容易 overfitting, 同时也 computationally expensive(此时可用 regulization 去处理过拟合问题);
默认是一层的 hidden layer, 但是也可以用 cv set 去选择最合适的 hidden layer 数目;
6,Model complexity effects
低阶多项式 (简单模型) 有 high bias 和 low variance, 训练集和测试集的误差都大;
高阶多项式 (复杂模型) 有 high variance 和 low bias, 训练集误差小, 测试集误差大;
我们最终想要得到的是一个中和的模型, 拟合数据能力不错, 泛化能力也不错;
7,Build a spam classifier
7.1,proritizing what to work on
系统设计: 对于给定的邮件数据, 可以给每个邮件设计一个 vector, 向量中每个元素代表了一个 word,word 在邮件中就设为 1, 不在就设为 0, 搜索邮件中最常出现的 words.
如下图所示:
那么, 如何去提升分类器的精度呢?
收集更多的数据?
加入更加经验性的特征?(header data in spam)
处理输入数据?(reprocessing miss-spelling)
7.2,Error analysis
推荐的解决机器学习问题的方法是:
start with a simple algorithm,implement it quickly, and test it on cv data
画出 learning curve 去决定一些策略是否是有用的, 比如 more data,more features
手动检测 cv 的误差, 找出最常出错的那些点, 分析它
比如说, 5000 封邮件, 有 100 封被错分了, 此时思考:
这 100 封邮件属于邮件里面的什么类别(如大多是 steal password,miss-spelling)
用什么办法可以把这个类型的邮件分对(比如加入新的特征), 然后把新的策略加入到模型中去;
得到了新的策略之后, 就将其加入到模型中看一看结果是否更好, 此时需要一个评判标准, 一个简单粗暴的评判标准;
在评估模型的时候我们要得到一个 real error number, 如果新的策略加入之后, 这个 error 减小了, 那就值得继续做下去, 否则就不需要再做下去了;
8,Error metrics for skewed classes
对于癌症判别的问题, 训练出来的分类器在测试集上达到了 1% 的 error rate, 乍一看觉得结果很好啊;
但是, 实际上测试集中只有 0.5% 的病人患有癌症, 也就是说, 即时我们的分类器只是简单的将所有人都认为不患癌症, 也可以达到 0.5% 的 error rate, 那我们能说这个分类器比之前的那个 1% error rate 的分类器好吗? 显然不能啊, 因为这根本就不是一个分类器啊!
这种类别分布的情况就称为 skewed classes, 此时用 error rate 来评估模型是不是进步了就不准确了
8.1,precision / recall
对于 skewed classes, 常用的误差分析方法是 precision / recall
$precision=\frac{True positive}{number of predicted positive}=\frac{True positive}{Ture positive + False positive}$
代表了在所有的预测为患癌症的病人中, 实际患癌症的比例
$recall=\frac{True positive}{number of actural positive}=\frac{True positive}{Ture positive + False negative}$
代表在实际患有癌症的病人中, 被预测出来的比例
8.2,trade off precision and recall
precision 和 recall 是一个需要与实际情况相结合的量;
比如在癌症问题上, 使用 logistic regression,
如果为了安抚病人的心理, 只有在非常确定 (概率大) 病人得了癌症时才会判定为得了癌症(y=1), 那么就会把分类中的阈值设置的很大, 比如 0.7,0.9, 此时, 我们有 higher precision,lower recall
如果为了病人的健康, 那么只有有一些可能性, 就判定为癌症, 以便于他可以去治疗, 那么就会把分类中的阈值设置的很大, 比如 0.3, 此时, 我们有 higher recall,lower precision
precision 和 recall 的图像类似如下, 曲线不确定:
现在这里有两个值, 我们如何去选择模型呢, 如何指导一些策略对模型是否有改善的作用呢?
这里就有了 $F_1 score=2\frac{PR}{P+R}$,F1 score 是一个同时考虑到了 precision 和 recall 的值:
当 P=0 or R=0, 则 F1 score=0
当 P=1 and R=1, 则 F1 score=1
9,Data for machine learning
有人曾说过: it's not who has the best algorithm that wins, it's who has the most data., 这句话对吗? 看两个例子:
有可以提供足够多的信息的 features,$x \in R_n$, 此时去预测 y;
如: for breakfast I ate _____ eggs.(two,too,to)
在只有房屋面积信息时, 预测房价;
思考: 对于一个专家 (针对指定问题) 而言, 她们可以解答吗? 对于第 1 个问题, 可以; 对于第二个问题而言, 显然是不可以的;
那么回到最初的问题, big data 一定会赢吗?
不一定, 如果信息不够的话, 再多的数据也没有用
来源: https://www.cnblogs.com/echo-coding/p/8989416.html