Machine Learning Week6 学习笔记之机器学习系统设计

解决机器学习问题的方法

正如我们在上一讲中提到过的,机器学习算法针对不同的问题,有不同的解决方式:
1、收集大量的数据(例如“honeypot”工程,故意放出很多邮箱账号,专门收集垃圾邮件,但是并不总是有用的)
2、选择更复杂的特征(例如在垃圾邮件分类中,使用邮件的头部数据)
3、开发出不同的处理输入数据的算法(例如在垃圾邮件分类中使用误拼写识别)
再次强调,问题不一样,解决的方法不一样,我们一定要先确定我们的问题,而不是轻易随便的尝试,这种尝试很可能导致的结果就是我们在一个错误的方向上浪费了数个月的时间。

误差分析

Andrew Ng在课程中建议了一种在解决机器学习问题时经常采用的流程:
1、从一个很简单的算法开始,快速运行,并且测试;
2、画出学习曲线来决定我们接下来应该采取什么办法能够解决机器学习算法遇到的问题:也许是收集更多的数据,也许是选择更多的特征;
3、误差分析:人工检查算法在交叉验证集上的误差的数据,看是否能发现某种规律,并以此改进算法。
例如在垃圾邮件分类算法中,误差分析时,你发现分类错误的例子都有一个共同的特点:那就是它们的头部信息都不寻常。这样我们就可以在后面的算法中加入这个特征,从而解决这个错误。
另外,将我们的误差结果以一个单独的数值来表示非常重要,这对于我们判断算法的性能至关重要;例如我们在对算法进行改变前后,只需要看这个误差结果就可以一眼看出算法的性能差异,从而决定是否按照最初的设想改变算法。
有时候,你可能需要对你的输入数据进行处理,从而使它们变得更有用。例如:如果你的输入是单词集,你可能想要将同一个单词的不同形式(fail/failing/failed)当成一个单词,这个时候你必须使用“stemming software”将它们识别处理成单个单词。

Skewed Classes误差度量

可能按照我们之前讲的,只要误差变小了,那么算法就得到了改善。可是有时候并不是这样的。
例如:在癌症预测中,假设我们有0.5%的人患有癌症,同时,我们发现我们的学习算法有1%的误差。然而事实上,只要我们在分类时将所有的病人都预测为没有癌症,这个时候我们的误差减少到0.5%。但是显然易见,我们并没有改善算法。
这种情况,通常会发生在skewed classes中,也就是说,我们分类时某一类在整个数据集中占的比例很小。
这种情况下,我们可以使用Precision(精确度)/Recall(召回率)
Predicted: 1, Actual: 1 — True positive
Predicted: 0, Actual: 0 — True negative
Predicted: 0, Actual, 1 — False negative
Predicted: 1, Actual: 0 — False positive
Precision的定义就是在所有我们预测 y=1 (有癌症)的病人中,确实患有癌症的病人的比例:
Precision=True PositivesTotal number of predicted positives=True PositivesTrue Positives + False Positives
Recall就是在所有确实患有癌症的病人中,我们预测 y=1 患有癌症的病人所占的比例:
Precision=True Positivesnumber of actual positives=True PositivesTrue Positives + False Negatives
有了这两种度量后,我们可以更好的感知到我们的分类器做的有多好。通常情况下,我们希望精确度和召回率都高。
回到我们最开始提的那个例子中,如果我们将所有的病人预测为 y=0 (没患癌症)的话,这个时候 recall=00 + f=0 ;因此尽管这样预测有一个低的误差,但是我们可以看到它的召回率很低,因此这个算法并不是我们想要的。

精确度和召回率的权衡

还是拿癌症预测为例,假如我们想要我们预测一个病人患有癌症时,更可靠,免得误症让病人担惊受怕,这个是时候,我们可以增加阈值:例如:
Predict 1 if : hθ(x)0.7
Predict 1 if : hθ(x) < 0.7
这样的话,我们就只会在病人有70%的可能有癌症的时候预测病人患有癌症。这样的话,造成的结果就是高精确度、低召回率。
反过来,我们可以增降低阈值:例如:
Predict 1 if : hθ(x)0.3
Predict 1 if : hθ(x) < 0.3
这样的话,我们就会在病人有30%的可能有癌症的时候预测病人患有癌症,因此也会更安全,不让病人错过任何一个患有癌症的可能。这样的话,造成的结果就是低精确度、高召回率。
那么如何选择合适的阈值threshhold,则取决于我们的需要了。
通常说来就是:
阈值越大,精确度越高,召回率越低;
阈值越小,精确度越低,召回率越高。
由于我们引进了精确度和召回率,这是两个值。当两个算法进行比较时,一个精确度高,召回率低,另一个精确度低,召回率高;我们如何判断哪种算法性能更好呢。我们之前提过,我们最好把最终的评价变成一个单独的数值,方便比较。
一种方法是,直接去平均:
P + R2
但是这样简单的取平均,没有什么太好的效果,例如我们有很高的精确度,但是召回率为0,简单的取平均也会把最终的值拉上去。
惯例是计算 F Score (或者 F1 score ):
F Score = 2PRP + R
为了让F Score很大的话,精确度和朝召回率都要很高才行。
我们一般是计算精确度和召回率在验证集上。

数据

可能会困扰我们的一个问题就是我们应该训练多少数据才能保证算法的性能。
在某些情况下,在数据量小的时候表现的性能不好的算法可能在大数据量时性能反超之前小数据量时性能好的算法。
同时,我们在选择我们的机器学习算法时,必须要保证两点∶一是我们选择的特征要包含足够的信息来预测(如何来判断信息是否足够呢,我们通常认为当一个人类的专家能够根据这些信息进行分类和预测时,便认为这些特征包含的信息足够)二是,我们要选择一个low bias的算法(包含很多的参数,很多的隐藏层数或者隐藏单元来组成复杂的函数),
在这种情况下,数据量越大,我们overfitting的情况越少,同时在测试集上的性能越好。

你可能感兴趣的:(机器学习)