Stanford机器学习笔记-6. 学习模型的评估和选择

6. 学习模型的评估与选择

Contenthtml

  6. 学习模型的评估与选择算法

    6.1 如何调试学习算法网络

    6.2 评估假设函数(Evaluating a hypothesis)机器学习

    6.3 模型选择与训练/验证/测试集(Model selection and training/validation/test sets) 函数

    6.4 误差与方差工具

      6.4.1 Diagnosing bias vs. variance. 学习

      6.4.2 正则化与误差/方差(Regularization and bias/variance) 测试

    6.5 学习曲线(Learning Curves)优化

    6.6 调试学习算法lua

咱们已经学习了许多有用的学习模型(线性回归Logistic回归神经网络),可是当要解决一个实际问题时,如下问题是咱们要考虑的:

  • 如何知道咱们所设计的模型是有用的或者较好的?
  • 当模型应用的不理想时,咱们应该从哪些方面进行改进?
  • 如何针对具体问题选择学习模型?

下面将针对上述问题提出建议。

6.1 如何调试学习算法

如今假设咱们已经实现了以下的一个正则化的线性回归模型用于预测房价

根据已有的训练集,咱们已经将该模型训练完毕。可是,当咱们须要在新的数据集上进行房价的预测时,发现预测的结果和实际有很大的偏差。下面咱们应该作什么?咱们能够从下面的一些角度考虑:

  • 获取更多的数据量
    • 有时数据量大并无帮助
    • 一般数据量越大,学习模型训练得越好,可是即便这样,也应该作一些初步实验(见6.5节 学习曲线)来确保数据量越大,训练越好。(若是一开始就用大量的数据来训练模型,将会耗费大量的时间:收集数据,训练模型)
  • 减小特征量
    • 细心的从已有的特征量中选出一个子集
    • 能够手工选择,也能够用一些降维( dimensionality reduction)技术
  • 增长额外的特征量
    • 有时并不起做用
    • 仔细考虑数据集,是否遗漏了一些重要的特征量(可能花费较多的时间)
    • 添加的特征量可能只是训练集的特征,不适合全体数据集,可能会过拟合
  • 添加多项式的特征量
  • 减小正则化参数
  • 增长正则化参数

能够发现,咱们彷佛有不少种方法来改善学习模型,可是,有些方法可能要花费不少时间(或许还不起做用),有些方法多是矛盾的。因此,须要一种方式来给咱们指明方向:到底应该采用哪一种或哪些方式来优化模型。咱们将这种方式称为机器学习诊断(Machine Learning Diagnostics)。机器学习诊断是一种测试法,可以深刻了解某种算法究竟是否有用。这一般也可以告诉咱们,要想改进一种算法的效果,什么样的尝试才是有意义的,从而节省时间,减小没必要要的尝试。

6.2 评估假设函数(Evaluating a hypothesis)

当咱们肯定学习算法的参数的时候,咱们考虑的是选择使训练偏差最小化的参数。但咱们已经知道(见3.1 underfitting and overfitting ),仅仅是由于这个假设具备很小的训练偏差,并不能说明它就必定是一个好的假设函数,可能该假设函数会过拟合,泛化能力弱。

该如何判断一个假设函数是过拟合的呢?对于简单的例子,能够对假设函数 h(x) 进行画图 而后观察图形趋势。可是,特征量较多时(大于2),画图就很难实现。所以,咱们须要另外一种方法来评估咱们的假设函数。以下给出了一种评估假设函数的标准方法:

假设咱们有这样一组数据组(如图6-1),咱们要作的是将这些数据分红两部分: 训练集测试集。一种典型的分割方法是按照7:3的比例,将70%的数据做为训练集,30%的数据做为测试集。这里默认原有数据集是无序的(随机的),因此咱们选择前70%做为训练集,后30%做为测试集,但若是原数据集是有序的,咱们应该随机选择出7:3的数据集分别做为训练集和测试集。

图6-1 大小为10的数据集及其划分

所以,典型的训练和测试方案以下:

  1. 用70%划分获得的训练集来训练模型:即最小化J(θ)
  2. 计算训练后的模型在测试集上的偏差( test set error)。

其中Jtest(θ) 为测试集上的平均平方偏差(average square error),mtest为测试集的大小。

若是咱们使用线性回归,test set error 则为

另外一种定义Logistics回归的偏差是误分类率(misclassification error)或称0/1错分率(0/1 misclassification).

  1. 定义error function

  2. Test error is

6.3 模型选择与训练/验证/测试集(Model selection and training/validation/test sets)

如何选择正则化参数的大小和多项式的次数是经常面临的问题,称之为模型选择问题。咱们已经屡次接触到过拟合现象,在过拟合的状况中,参数很是拟合训练集,那么模型对于相同数据组预测集的预测偏差不可以用来推广到通常状况的,便是不能做为实际的泛化偏差。也就是不能说明你的假设对于新样本的效果。

下面咱们来考虑模型选择问题,假如要选择能最好地拟合数据的多项式次数,具体地,咱们在次数为1到10之间应该如何作出选择。

d表示应该选择的多项式次数。因此,彷佛除了要肯定的参数θ以外,咱们一样须要用数据集来肯定这个多项式的次数d。

  • d =1 (linear)
  • d=2 (quadratic)
  • ...
  • d=10

那么咱们能够这样作:

  • 选择第一个模型(d = 1),而后求训练偏差的最小值,获得一个参数向量θ 1
  • 选择第二个模型(d = 2), 二次函数模型, 进行一样的过程, 获得另外一个参数向量θ 2 

以此类推,最后获得θ10

接下来对全部这些模型,求出测试集偏差

  • Jtest1)
  • Jtest2)
  • ...
  • Jtest10)

接下来为了肯定选择哪个模型最好,即哪个对应的测试集偏差最小。对于这个例子,咱们假设最终选择了五次多项式模型。

肯定模型后,如今咱们想知道,这个模型能不能很好地推广到新样本。咱们能够观察这个五次多项式假设模型对测试集的拟合状况,但这里有一个问题是:这样作仍然不能公平地说明,个人假设推广到通常时的效果。其缘由在于,咱们刚才是使用的测试集和假设拟合来获得的多项式次数d 这个参数,这也就是说,咱们选择了一个可以最好地拟合测试集的参数d的值。所以,咱们的参数向量θ5在拟合测试集时的结果极可能致使一个比实际泛化偏差更完美的预测结果。换言之,咱们是找了一个最能拟合测试集的参数d,所以我再用测试集来评价咱们的模型就显得不公平了。

为了解决这一问题,在模型选择中,若是咱们想要评价某个假设,咱们一般采用如下的方法:给定某个数据集,和刚才将数据分为训练和测试集不一样的是,咱们要将其分为三段:

  • 训练集 Training set (60%) - m values
  • 交叉检验集 Cross validation (CV) set (20%)mcv
  • 测试集 Test set (20%) mtest 

咱们随之也能够定义训练偏差,交叉验证偏差和测试偏差以下:

所以,咱们按以下方式选择模型:

1. Minimize cost function for each of the models as before

2. Test these hypothesis on the cross validation set to generate the cross validation error

3. Pick the hypothesis with the lowest cross validation error. e.g. pick θ5

4. Finally,Estimate generalization error of model using the test set

值得注意的是,在现在的机器学习应用中, 也有不少人是用测试集来选择模型, 而后又一样的测试集来评价模型的表现报告测试偏差,看起来好像还能获得比较不错的泛化偏差。若是有不少不少测试集的话,这也许还能行得通,不然获得的测试偏差很大程度要比实际的泛化偏差好。所以最佳作法仍是把数据分红训练集、验证集、测试集。

6.4 误差与方差

6.4.1 Diagnosing bias vs. variance

如图6-2,当运行一个学习算法时,若是这个算法的表现不理想,那么多半是出现两种状况,要么是误差比较大(欠拟合),要么是方差比较大(过拟合),能判断出现的状况是这两种状况中的哪种很是重要,由于它是一个颇有效的指示器,告诉咱们能够改进算法的最有效的方法和途径。

图6-2 不一样模型的拟合状况

如今咱们已经掌握了训练集,验证集和测试集的概念。咱们就能更好地理解误差和方差的问题。具体来讲,咱们沿用以前所使用的训练集偏差和验证集偏差的定义也就是平方偏差,画出图6-3.

图6-3 多项式次数与偏差的关系

d等于1是用线性函数来进行拟合,而在最右边的这个图表示更高次数的多项式的拟合状况。随着咱们增大多项式的次数,咱们将对训练集拟合得愈来愈好,因此若是d等于1时 对应着一个比较大的训练偏差,而若是咱们的多项式次数很高时 咱们的训练偏差就会很小 甚至可能等于0 由于可能很是拟合训练集。因此,当咱们增大多项式次数时,咱们不难发现训练偏差明显降低。

接下来咱们再看交叉验证偏差,若是d等于1,意味着用一个很简单的函数来拟合数据,此时咱们不能很好地拟合训练集(欠拟合),咱们会获得一个较大的交叉验证偏差,而若是咱们用一个中等大小的多项式次数来拟合时,如d等于2,那么咱们会获得一个更小的交叉验证偏差,由于咱们找了一个可以更好拟合数据的次数。可是,若是次数d太大,好比说d的值取为4 ,那么咱们又过拟合了,咱们又会获得一个较大的交叉验证偏差。

具体来讲 假设咱们得出了一个学习算法,而这个算法并无表现地如指望那么好,咱们应该判断此时的学习算法是正处于高误差的问题仍是高方差的问题。

  • 当训练偏差和交叉验证偏差相近且都比较大时,即对应图6-3曲线中的左端,对应的就是高误差的问题
  • 相反地,当训练偏差较小而交叉验证偏差远大于训练偏差时,即对应图6-3曲线右端,对应的是高方差的问题

6.4.2 正则化与误差/方差(Regularization and bias/variance )

咱们知道,算法正则化能够有效地防止过拟合。但正则化跟算法的误差和方差又有什么关系呢?对于以下正则化的线性回归模型

咱们分析如下三种情形:

  • 第一种情形是正则化参数λ取一个比较大的值,如等于10000,此时,全部这些参数θ将被大大惩罚,其结果是这些参数的值将近似等于0 而且假设模型 h(x) 的值将等于或者近似等于 。所以咱们最终获得的假设函数应该近似是一条平滑的直线(如图6-4-(1)),所以这个假设处于高误差,对数据集欠拟合(underfit)。
  • 与之对应的另外一种状况是λ值很小,好比λ=0,这种状况下,若是咱们要拟合一个高阶多项式,一般会处于高方差和过拟合(overfitting)的状况(如图6-4-(3))。由于λ的值等于0至关于没有正则化项 所以会对假设过拟合。
  • 如图6-4-(2),只有λ取不大不小的值时,才会获得一组对数据恰好拟合的参数值θ。

图6-4 不一样λ取值的拟合状况

如今咱们能够按照以下方式选择出一个最合适的正则化参数 λ:

  1. 肯定λ可能的取值向量,一般为[0,0.01,0.02,0.04,0.08,… ,10.24]
  2. 每个λ的可能取值对应一个模型,对每个模型进行训练,使代价函数最小,获得对应的参数θ。
  3. 对于每一个训练后的模型,计算出其在交叉检验集上的偏差
  4. 取使最小的模型做为咱们的模型,并将其应用于测试集,获得测试偏差,并以此估计泛化偏差。

其中:

与多项式次数与偏差相似,咱们能够画出λ与偏差的函数关系,如图6-5所示

图6-5 λ与偏差的关系

6.5 学习曲线(Learning Curves)

有时咱们须要检查学习算法运行是否一切正常,或者但愿改进算法的表现或效果,那么学习曲线(Learning Curves)就是一种很好的工具。而且,咱们可使用学习曲线来判断某一个学习算法是否处于误差,方差问题或是两者皆有。下面咱们就来介绍学习曲线。

学习曲线和图6-5相似,它们的区别在于学习曲线是以训练集的大小m为横坐标。纵坐标仍然是训练集偏差Jtrain和交叉检验偏差Jcv

通常状况下的学习曲线如图6-7所示:

  • 对于训练集偏差而言,m越小,越容易拟合,偏差越小,换言之,J train随m的增大而增大。
  • 对于交叉检验偏差而言,m越小,模型的泛化能力越弱,故偏差越大,换言之,J cv随m的增大而减少。
  • 当m大到必定程度时,训练集偏差和交叉检验偏差较接近且都比较小。

图6-7 通常状况下的学习曲线

当学习算法是高误差时,如图6-8所示,此时:

  • 对于训练集偏差而言,当m很小时,偏差很小,但因为它不能很好的拟合训练集,随后就会增加较快,达到一个较稳定的值。
  • 对于交叉检验偏差而言,当m很小时,算法的泛化能力很是弱,偏差很大,随着m的增长,泛化能力稍有提高,偏差会有所减少,但因为学习算法自己对训练集偏差较大,故交叉检验偏差不会降低太多,最后稳定在一个较高的值。
  • 在m不太大时,训练集偏差就和交叉检验偏差接近,但都比较大。

因此,在高误差的状况下,增大训练集每每不起做用

图6-8 高误差时的学习曲线

当学习算法是高方差时,如图6-9所示,此时:

  • 对于训练集偏差而言,当m很小时,偏差很小,而且因为算法能很好的拟合训练集(过拟合),随着m的增长,偏差只有少许增长(增长很慢)。
  • 对于交叉检验偏差而言,当m很小时,算法的泛化能力很是弱,偏差很大,随着m的增长,泛化能力稍有提高,偏差会有所减少,但因为学习算法过拟合,泛化能力有限,故交叉检验偏差不会降低太多,最后稳定在一个较高的值。
  • 在m较大时,训练集偏差和交叉检验偏差也有必定的差距,此时训练集偏差较小,而交叉检验集偏差较大。

因此,在高方差的状况下,增大训练集一般是有效的(减小过拟合)。

图6-9 高方差时的学习曲线

6.6 调试学习算法

通过了上面的分析,如今咱们对调试学习算法的策略进行总结

  • Get more training examples --> helps to fix high variance
    • Not good if you have high bias
  • Smaller set of features --> fixes high variance (overfitting)
    • Not good if you have high bias
  • Try adding additional features --> fixes high bias (because hypothesis is too simple, make hypothesis more specific)
  • Add polynomial terms --> fixes high bias problem
  • Decreasing λ --> fixes high bias
  • Increases λ --> fixes high variance

对于神经网络而言,咱们须要针对不一样的问题设计不一样的网络结构,一般从下面两种角度考虑:

  • 选择一个较小的网络
    • 较少的隐藏层(如1层)和较少的隐藏单元,适用于变量(特征量)较少的状况
    • 可能欠拟合,但计算代价较小
  • 选择一个较大的网络
    • 更多的隐藏层-须要咱们决定具体是多少层较好
    • 适用于变量较多的状况,
    • 可能会过拟合,须要使用正则化来削弱过拟合
    • 计算代价更大

一般而言,选择一层隐藏层或许是比较好的选择。固然,在应用神经网路时也应将已有数据集划分为训练集,交叉检验集和测试集。

相关文章
相关标签/搜索