Dawn's Blogs

分享技术 记录成长

0%

机器学习基础 (6) 机器学习应用及系统设计

应用及其学习的建议

决定下一步做什么

当我们运用训练好了的模型来预测未知数据的时候发现有较大的误差,我们下一步可以做什么?

  • 获得更多的训练样本
  • 尝试减少特征的数量,防止过拟合
  • 需要更多的特征
  • 尝试增加多项式特征
  • 减少/增加正则化程度λ

我们不应该随机选择上面的某种方法来改进我们的算法,而是运用一些机器学习诊断法来帮助我们知道上面哪些方法对我们的算法是有效的。

如何评价学习算法

评估假设

为了检验算法是否过拟合,我们将数据分成训练集和测试集,通常用70%的数据作为训练集,用剩下30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。

测试集评估在通过训练集让我们的模型学习得出其参数后,对测试集运用该模型,我们有两种方式计算误差:

  • 对于线性回归模型

    • 首先利用训练集产生参数
    • 计算误差,利用测试集数据计算代价函数J
  • 对于逻辑回归模型

    • 首先利用训练集产生参数

    • 计算误差,可以有两种方法

      • 利用测试集数据计算代价函数J

      1649480057947

      • 错误分类(也称作0/1分类错误),也就是计算误分类的比率。对于每一个测试集样本,计算是否预测错误(预测错误为1,预测成功为-),然后对计算结果求平均。

      img

模型选择和交叉验证集

假设我们要在10个不同次数的二项式模型之间进行选择:

img

显然越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集并不代表着能推广至一般情况,我们应该选择一个更能适应一般情况的模型。我们需要使用交叉验证集来帮助选择模型。 即:使用60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用20%的数据作为测试集

模型选择的方法为:

  1. 使用训练集训练出10个模型
  2. 用10个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)
  3. 选取代价函数值最小的模型
  4. 用步骤3中选出的模型对测试集计算得出推广(测试)误差(代价函数的值)

1649481287879

机器学习诊断法

“诊断法”的意思是:这是一种测试法,你通过执行这种测试,能够深入了解某种算法到底是否有用。这通常也能够告诉你,要想改进一种算法的效果,什么样的尝试,才是有意义的。

诊断偏差和方差

当运行一个学习算法时,如果这个算法的表现不理想,那么多半是出现两种情况:要么是偏差比较大,要么是方差比较大。换句话说,出现的情况要么是欠拟合,要么是过拟合问题。

训练误差和交叉验证误差都比较大的时候,说明出现了较大的偏差,产生了欠拟合的问题,需要用较高的多项式次数来拟合数据。而训练误差很小,交叉验证误差很大时,说明出现了较大的方差,产生了过拟合的问题。

1649490332363

正则化和偏差/方差

在我们在训练模型的过程中,一般会使用一些正则化方法来防止过拟合。但是我们可能会正则化的程度太高(λ太大)或太小(λ太小)了,可能会产生欠拟合/过拟合问题。

img

需要选择一系列的想要测试的测试的λ值,这些λ之间通常呈2倍关系。分别应用这些不同的λ值,对训练集进行训练,并计算交叉验证误差。

训练误差和交叉验证误差都比较大的时候,说明出现了较大的偏差,产生了欠拟合的问题,需要用减小的正则化程度λ。而训练误差很小,交叉验证误差很大时,说明出现了较大的方差,产生了过拟合的问题,需要用增大的正则化程度λ。


需要注意的是,训练误差、交叉验证误差、测试误差不带有正则化项的,因为它们只是表示预测结果与正确结果的“差距大小”。


1649491525881

学习曲线

可以使用学习曲线来判断某一个学习算法是否处于偏差、方差问题。学习曲线是学习算法的一个很好的合理检验sanity check)。学习曲线就是绘制训练误差、交叉验证误差与训练集样本数量的关系曲线。思想是:当训练较少行数据的时候,训练的模型将能够非常完美地适应较少的训练数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据。

img

高偏差/欠拟合:作为例子,我们尝试用一条直线来适应下面的数据,可以看出,无论训练集有多么大误差都不会有太大改观。也就是说在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。交叉验证误差与训练误差很快就随着训练数据的增加不再变化,交叉验证误差与训练误差很接近并且误差值较高

img

高方差/过拟合:假设我们使用一个非常高次的多项式模型,并且正则化非常小。可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。也就是说在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果

img

总结

  1. 获得更多的训练样本——解决高方差
  2. 尝试减少特征的数量——解决高方差
  3. 尝试获得更多的特征——解决高偏差
  4. 尝试增加多项式特征——解决高偏差
  5. 尝试减少正则化程度λ——解决高偏差
  6. 尝试增加正则化程度λ——解决高方差

神经网络中的偏差/方差

使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小。

使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过正则化手段来调整而更加适应数据。 通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。


对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络, 然后选择交叉验证集代价最小的神经网络。


1649494252086

机器学习系统的设计

误差分析

构建一个学习算法的推荐方式为:

  1. 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法。
  2. 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择。
  3. 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的样本,看看这些样本是否有某种系统化的趋势。可以通过一个量化的数值评估(如准确率)去衡量不同方案的表现,通过这个量化的指标,可以容易看出误差是变大还是变小了。

类偏斜的误差度量

类偏斜情况表现为我们的训练集中有非常多的同一种类的样本,只有很少或没有其他类的样本。

例如我们希望用算法来预测癌症是否是恶性的,在我们的训练集中,只有0.5%的实例是恶性肿瘤。假设我们编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有0.5%。然而我们通过训练而得到的神经网络算法却有1%的误差。这时,误差的大小是不能视为评判算法效果的依据的。

可以将算法的预测结果分为4种情况:

  1. 正确肯定True Positive, TP):预测为真,实际为真
  2. 正确否定True Negative, TN):预测为假,实际为假
  3. 错误肯定False Positive, FP):预测为真,实际为假
  4. 错误否定False Negative,FN):预测为假,实际为真
预测值
Positive Negtive
实际值 Positive TP FN
Negtive FP TN

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

查全率=**TP/(TP+FN)**。例如,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。 这样,对于我们刚才那个总是预测病人肿瘤为良性的算法,其查全率是0。

查准率和查全率的权衡

在很多应用中,我们希望能够保证查准率和召回率的相对平衡。 继续沿用刚才预测肿瘤性质的例子。假使,我们的算法输出的结果在0-1之间,我们使用阀值0.5来预测真和假。

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

如果我们希望只在非常确信的情况下预测为真(肿瘤为恶性),即我们希望更高的查准率,我们可以使用比0.5更大的阀值,如0.7,0.9。这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况。 如果我们希望提高查全率,尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比0.5更小的阀值,如0.3。

我们希望有一个帮助我们选择这个阀值的方法。一种方法是计算F1值F1 Score),其计算公式如下,选择使得F1值最高的阀值即可。

1649501282372