蒋振飞的博客 - 机器学习04:应用机器学习   
正在加载蒋振飞的博客...
V3.0
蒋振飞的博客

机器学习04:应用机器学习

发布时间: 2018年10月04日 发布人: 蒋振飞 热度: 303 ℃ 评论数: 0

一、应用机器学习

1.评估一个假设

    确定学习算法的参数的时候,考虑的是选择参量来使训练误差最小化,但不能认为一个非常小的训练误差一定是一件好事。因为仅仅是因为这个假设具有很小的训练误差,并不能说明它就一定是一个好的假设函数,而且也可能出现过拟合。
    为了检验算法是否过拟合,需要将数据分成训练集和测试集,通常用70%的数据作为训练集,用剩下30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常还要对数据进行“洗牌”,然后再分成训练集和测试集。

9c769fd59c8a9c9f92200f538d1ab29c_20181004185403_182.png

    测试集评估在通过训练集让我们的模型学习得出其参数后,对测试集运用该模型,我们有两种方式计算误差:
    ①线性回归模型,利用测试集数据计算代价函数。
    ②逻辑回归模型,除了可以利用测试数据集来计算代价函数外,还可以对于每一个测试集样本,计算误分类的比率,然后对计算结果求平均。

751e868bebf4c0bf139db173d25e8ec4.png

2.模型选择和交叉验证集

    使用60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用20%的数据作为测试集
    模型选择的方法为:
    ①使用训练集训练出10个模型。
    ②用10个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)。
    ③选取代价函数值最小的模型。
    ④用步骤3中选出的模型对测试集计算得出推广误差(代价函数的值)。

3.诊断偏差和方差

    运行一个学习算法时,如果这个算法的表现不理想,那么多半是出现两种情况:要么是偏差比较大,要么是方差比较大。也就是说出现的情况要么是欠拟合,要么是过拟合问题。
    ①训练集误差和交叉验证集误差近似时:偏差/欠拟合
    ②交叉验证集误差远大于训练集误差时:方差/过拟合

4.正则化和偏差/方差

    在训练模型的过程中,一般会使用一些正则化方法来防止过拟合。但是可能正则化的程度太高或太小了,即在选择λ的值时也需要思考与多项式模型次数类似的问题。
    λ通常是 0-10之间的呈现2倍关系的值(如:$0, 0.01, 0.02, 0.04, 0.08, 0.15, 0.32, 0.64, 1.28, 2.56, 5.12, 10$共12个)选择λ的方法为:
    ①使用训练集训练出12个不同程度正则化的模型。
    ②用12个模型分别对交叉验证集计算的出交叉验证误差。
    ③选择得出交叉验证误差最小的模型。
    ④运用步骤3中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与λ的值绘制在一张图表上:

5.学习曲线

    学习曲线是学习算法的一个很好的**合理检验**(**sanity check**),它是将训练集误差和交叉验证集误差作为训练集样本数量($m$)的函数绘制的图表。
    即,如果有100行数据,从1行数据开始,逐渐学习更多行的数据。思想是:当训练较少行数据的时候,训练的模型将能够非常完美地适应较少的训练数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据。
    ①利用学习曲线识别高偏差/欠拟合:作为例子,尝试用一条直线来适应下面的数据,可以看出,无论训练集有多么大误差都不会有太大改观。

4a5099b9f4b6aac5785cb0ad05289335.jpg

    

    也就是说在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。
    ②学习曲线识别高方差/过拟合:假设使用一个非常高次的多项式模型,并且正则化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。

2977243994d8d28d5ff300680988ec34.jpg

    也就是说在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。

6.决定下一步做什么

    ①获得更多的训练样本——解决高方差。
    ②尝试减少特征的数量——解决高方差。
    ③尝试获得更多的特征——解决高偏差。
    ④尝试增加多项式特征——解决高偏差。
    ⑤尝试减少正则化程度λ——解决高偏差。
    ⑥尝试增加正则化程度λ——解决高方差。

7.神经网络的方差和偏差

    使用较小的神经网络,类似于参数较少的情况,容易导致高偏差欠拟合,但计算代价较小使用较大的神经网络,类似于参数较多的情况,容易导致高方差过拟合,虽然计算代价比较大,但是可以通过正则化手段来调整而更加适应数据。
    通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。
    对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集交叉验证集测试集,针对不同隐藏层层数的神经网络训练神经网络,然后选择交叉验证集代价最小的神经网络。

二、机器学习系统的设计

1.首先要做什么

    以垃圾邮件分类器算法为例,为了解决这样一个问题,首先要做的决定是如何选择并表达特征向量$x$。可以选择一个由100个最常出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中出现,来获得特征向量(出现为1,不出现为0),尺寸为100×1。
    为了构建这个分类器算法,可以做很多事,例如:
    ①收集更多的数据,让我们有更多的垃圾邮件和非垃圾邮件的样本。
    ②基于邮件的路由信息开发一系列复杂的特征。
    ③基于邮件的正文信息开发一系列复杂的特征,包括考虑截词的处理。
    ④探测刻意的拼写错误(把watch 写成w4tch)开发复杂的算法。

2.误差分析

    研究机器学习的问题:选择一个算法,尽早得到一个结果。即便运行得不完美,但是也把它运行一遍,然后通过交叉验证来检验数据。一旦做完,便可以画出学习曲线,通过画出学习曲线,以及检验误差,来找出算法是否有高偏差和高方差的问题,或者别的问题。在这样分析之后,再来决定用更多的数据训练,或者加入更多的特征变量是否有用。
    构建一个学习算法的推荐方法为:
    ①从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法。
    ②绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择。
    ③进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的样本,看看这些样本是否有某种系统化的趋势。
    推荐在交叉验证向量上来做误差分析,而不是在测试集上。

3.类偏斜的误差度量(混淆矩阵)

    类偏斜情况表现为训练集中有非常多的同一种类的样本,只有很少或没有其他类的样本。
    例如希望用算法来预测癌症是否是恶性的,在训练集中只有0.5%的实例是恶性肿瘤。假设编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有0.5%。然而通过训练而得到的神经网络算法却有1%的误差。这时,误差的大小是不能视为评判算法效果的依据的。
    **查准率**(**Precision**)和**查全率**(**Recall**) 将算法预测的结果分成四种情况:
    ①**正确肯定**(**True Positive,TP**):预测为真,实际为真。
    ②**正确否定**(**True Negative,TN**):预测为假,实际为假。
    ③**错误肯定**(**False Positive,FP**):预测为真,实际为假。
    ④**错误否定**(**False Negative,FN**):预测为假,实际为真。

    查准率=**TP/(TP+FP)**。例,在所有预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
    查全率=**TP/(TP+FN)**。例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。

4.机器学习的数据

    不要盲目地开始,而是花大量的时间来收集大量的数据,因为数据有时是唯一能实际起到作用的。但事实证明,在一定条件下,得到大量的数据并在某种类型的学习算法中进行训练,可以是一种有效的方法来获得一个具有良好性能的学习算法。
    事实上,如果选择任意一个算法,可能是一个"劣等的"算法,但是如果给这个劣等算法更多的数据,那么从这些例子中看起来的话,它看上去很有可能会其他算法更好,甚至会比"优等算法"更好。这些结果表明,许多不同的学习算法有时倾向于表现出非常相似的表现,这还取决于一些细节,但是真正能提高性能的,一个算法大量的训练数据。像这样的结果,引起了一种在机器学习中的普遍共识:"取得成功的人不是拥有最好算法的人,而是拥有最多数据的人"。

打赏 蒋振飞

取消

感谢您的支持,我会继续努力的!

扫码支持
一分也是爱     一块不嫌多

点击 支付宝 或 微信 打赏蒋振飞

打开支付宝扫一扫,即可进行扫码打赏哦

评论列表