在设计复杂的机器学习系统时将会遇到的主要问题,以及给出一些如何巧妙构建一个复杂的机器学习系统的建议。
思想:通过分词,将一封邮件转化为一个向量,从而将实际生活问题转化为了数学问题。
具体:\(x\)是对应单词是否出现:出现为1,不出现为0;\(y\)表示邮件是否为垃圾邮件,是为1,否为0。
注意:实际应用中,我们更多情况下是选择最常出现的\(n\)个单词,而不是手动挑选100个单词。
Howtospendyourtimetomakeithavelowerror如何使你的垃圾邮件分类器具有较高准确度?
例子:
\(m_{CV}=500\)examplesincrossvalidationset.Algorithmmisclassifies100emails.一个垃圾邮件分类器,它的交叉验证集中有500个实例,它错误分类了一百个交叉验证实例。
Manuallyexaminethe100errors,andcategorizethembasedon:人工检查这100个错误实例,并将它们分类
如果区分后发现算法总是在某一方面表现的很差/对于某种特征处理的不好,那就重点处理这种情况。
Shoulddiscount/discounts/discounted/discountingbetreatedasthesamewordCanuse"stemming"software(E.g."Porterstemmer")?-->university,universe
假设我们正在决定是否应该将这些单词视为等同,一种方法是检查这些单词开头几个字母。在NLP中,这种方法是通过一种叫词干提取的软件实现的。因为这种方法只会检测单词的前几个字母,所以也会产生相应的问题,如将"university,universe"这两个单词视为同一个单词。
Erroranalysismaynotbehelpfulfordecidingifthisislikelytoimproveperformance.Onlysolutionistotryitandseeifitworks.
误差分析也不能帮助你决定词干提取是否是一个好方法。最好的方法是着手一试并看它表现如何。
Neednumericalevalution(e.g.,crossvalidationerror)ofalgorithm'sperformancewithandwithoutstemming.
需要量化的数值评估(如交叉验证集的误差):使用词干提取和不使用词干提取算法的误差分别是多少。
其它方面也同样适用。如,是否要区分单词大小写。
偏斜类问题的错误指标
Trainlogisticregressionmodel\(h_\theta(x)\).(\(y=1\)ifcancer,\(y=0\)otherwise)训练逻辑回归模型来预测病人是否得了癌症
Findthatyougot1%errorontestset.(99%correctdiagnoses)用测试集检查后发现它只有1%的错误
Only0.50%ofpatientshavecancer.但是在测试集中只有0.50%的患者真正得了癌症,此时用下面的代码将会得出预测误差更小的结果,但它是一个非机器学习代码。
functiony=predictCancer(x) y=0;%ignorex!return当样本中正例和负例比率非常接近于一个极端时,通过总是预测\(y=1\)或\(y=0\),算法可能表现得非常好,这种情况就叫做偏斜类。
总结:假设有个算法,精确度是99.2%,对算法进行一定改动后得到了99.5%的精确度,但这是否就可以认为是算法的一个提升?用某个实数来作为评估度量值的一个好处就是,它可以帮助我们迅速决定是否需要对算法做出一些改进。而使用分类误差或分类精确度来作为评估度量,可能会产生上面出现的那种局面,所以当遇到这样一个偏斜类时,我们希望有一个不同的误差度量值。
\(y=1\)inpresenceofrareclassthatwewanttodetect
此例列表结果如下
备注:在定义查准率和召回率时,习惯性的使用\(y=1\)表示出现的很少的类,如检测癌症的例子。
Logisticregression:\(0\leqh_\theta(x)\leq1\)
Predict\(1\)if\(h_\theta(x)\ge0.5\)
Predict\(0\)if\(h_\theta(x)\lt0.5\)
Howtocompareprecision/recallnumbers我们该如何比较不同的查准率和召回率呢?
法一:Average:\(\frac{P+R}{2}\),不一定是个好的方法,如上面的例子中Algorithm3效果并不好,但它通过此方法得到的值是最高的。
法二:\(F_1\)Score:\(2\frac{PR}{P+R}\),此方法会给查找率和召回率中较低的值一个更高的权重,因此此方法要想有个较大的权值,必须两者相差不大。
真正能够提高算法性能的,是你能够给予一个算法大量的训练数据。
"It'snotwhohasthebestalgorithmthatwins.It'swhohasthemostdata."
这在很多情况下是适用的。
Assumefeature\(x\inR^{(n+1)}\)hassufficientinformationtopredict\(y\)accurately.在特征值有足够的信息来准确预测\(y\)的情况下。