Sixth week of machine learning on Coursera

来源:互联网 发布:手机助手 for mac 编辑:程序博客网 时间:2024/06/18 14:10

Sixth week of machine learning on Coursera

@(Coursera)


模型选择最佳方法是将数据集分为训练集、交叉验证集和测试集,比例为6:2:2
模型选择问题如下图:
这里写图片描述
举线性模型例子来说,提供了10个线性模型,最高项从x1,...,x10,那么该如何选择误差最小的模型呢?
我们使用交叉验证集来验证各个模型的误差,取损失函数最小的模型,比如是第四个模型,也就是hθ(x)=θ0+θ1x1+...+θ4x4,然后再在测试集看hθ(x)的泛化误差。


偏差和方差(Bias and Variance)
  • 高偏差:Jtrain(θ)Jcv(θ)
  • 高方差:Jtrain(θ)Jcv(θ)
    这里写图片描述
    这里写图片描述

一般我们会画出学习曲线(learning curves)来查看此时算法处在high bias or high variance:
high bias:
如下图,
- 当训练集size比较小时,Jtrain(Θ) is low and JCV(Θ) is high;
- 当训练集size比较大时,Jtrain(Θ) and JCV(Θ) to be high,Jtrain(Θ)JCV(Θ);

训练集size对high bias减小cost没什么帮助。
这里写图片描述


high variance:
如下图,
- 当训练集size比较小时,Jtrain(Θ) is low and JCV(Θ) is high;
- 当训练集size比较大时,Jtrain(Θ)在不断上升,因为highvariance实际对应过拟合情况,当训练集样本增多,想要假设函数满足所有训练样本就很困难,所有Jtrain(Θ)就会慢慢增大,而JCV(Θ)在慢慢减小。

训练集size对high variance减小cost有较大帮助。
这里写图片描述


建造一个垃圾邮件分类器

我们使用x表示邮件的特征,使用y=1y=0
这里写图片描述

xj=[1,word j appears in email0, oterwise]


推荐的开始方式是:
- 从一个可以快速实现的简单算法开始,实现它并且在交叉验证集上测试;(我觉得这个思想很重要,在看《Algorithms》那本算法书的时候,同样指导在遇到一个问题时首先可以使用暴力法将问题解决,再从暴力法中查找是否有些地方可以优化,而不用一开始就想着设计一个非常复杂的方法。)
- 画出学习曲线(learning curves)来决定是否需要更多的数据、更多的特征等等。
- 误差分析:手动查找错误分类的样本,看一下它们本来属于什么类型?你认为什么特征可以帮助来正确分类它们?可以发现一些系统性的规律某类样本一直被错误分类。
这里写图片描述


评价分类器性能的指标一般是分类准确率:对于给定的测试数据集,分类器正确分类的样本数与总样本数之比。
还有一些常用的评价指标比如Precision精确率、Recall召回率
其中:
- TP—将正类预测为正类;
- FN—将正类预测为负类;
- FP—将负类预测为正类;
- TN—将负类预测为负类;

Percision=TPTP+FP

Recall=TPTP+FN

此外还有F1值,是PrecisionRecall的调和均值,
2F1=1F+1R

F1=2TP2TP+FP+FN

为什么我们除了准确率以外还需要上述其他评价指标呢?
看个例子,比如对癌症病人的预测,其实是个0-1分类问题,我能做到分类的准确率为97%,但其实癌症的概率为2%,也就是说如果我对所有的样本都分类为没有得癌症,那么我的准确率是不是有98%了,这比我用分类算法来分类的效果还要好,所以单纯用一种评价标准是不够的。
如上所述,(习惯性用y=1表示出现很少的类别),在这里将得癌症的y值为1,也就是正类,那么TP=0,TN=98,FP=0,FN=2
Percision=02+0=00,Recall=00+2=0

可以发现Recall=0表示模型始终预测y=0,不是一个好模型。
和准确率accuracy一样,我们希望Percision 和Recall越高越好,越高表示模型越好。


平衡precision和Recall

还是以癌症的例子举例,我们使用logistic regression来给新样本做分类,
- hθ(x)0.5,y=1;
- hθ(x)0.5,y=0;

如果我们想能非常自信的预测一个新样本确实是患有癌症(y=1),可以将阈值0.5增大,那此时被分为y=1的样本,本身更大概率就是患有癌症的。也就是FP会减小,FN会增大,所以

Percision=TPTP+FP
Recall=TPTP+FN


另一种情况,癌症是中非常严重的病,不能错漏一个可能有病的人,此时可以将阈值0.5调低一些,对应的percisionRecall
这里写图片描述
那么如何在PercisionRecall
可以使用我们上文使用的F1值,取F1值大的那组PercisionRecall


原创粉丝点击