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
表示邮件的特征,使用
推荐的开始方式是:
- 从一个可以快速实现的简单算法开始,实现它并且在交叉验证集上测试;(我觉得这个思想很重要,在看《Algorithms》那本算法书的时候,同样指导在遇到一个问题时首先可以使用暴力法将问题解决,再从暴力法中查找是否有些地方可以优化,而不用一开始就想着设计一个非常复杂的方法。
)
- 画出学习曲线(learning curves)来决定是否需要更多的数据、更多的特征等等。
- 误差分析:手动查找错误分类的样本,看一下它们本来属于什么类型?你认为什么特征可以帮助来正确分类它们?可以发现一些系统性的规律某类样本一直被错误分类。
评价分类器性能的指标一般是分类准确率:对于给定的测试数据集,分类器正确分类的样本数与总样本数之比。
还有一些常用的评价指标比如Precision精确率、Recall召回率
其中:
- TP—将正类预测为正类;
- FN—将正类预测为负类;
- FP—将负类预测为正类;
- TN—将负类预测为负类;
此外还有 F1 值,是 Precision和Recall 的调和均值,
为什么我们除了准确率以外还需要上述其他评价指标呢?
看个例子,比如对癌症病人的预测,其实是个0-1分类问题,我能做到分类的准确率为97%,但其实癌症的概率为2%,也就是说如果我对所有的样本都分类为没有得癌症,那么我的准确率是不是有98%了,这比我用分类算法来分类的效果还要好,所以单纯用一种评价标准是不够的。
如上所述,(
习惯性用y=1表示出现很少的类别
),在这里将得癌症的y值为1,也就是正类,那么
TP=0,TN=98,FP=0,FN=2
可以发现 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 会增大,所以
另一种情况,癌症是中非常严重的病,不能错漏一个可能有病的人,此时可以将阈值0.5调低一些,对应的
percision减小,Recall增大
。
那么如何在
Percision和Recall中取得平衡呢
?
可以使用我们上文使用的
F1
值,取
F1
值大的那组
Percision和Recall值
。