页面树结构

2017-11-09 ApacheCN 开源组织,第二期邀请成员活动,一起走的更远 : http://www.apachecn.org/member/209.html


MachineLearning 优酷地址 : http://i.youku.com/apachecn

转至元数据结尾
转至元数据起始

每个估计都有其优缺点。其泛化误差可以在偏差,方差和噪声方面进行分解。估计器的偏差是其不同训练集的平均误差。 估计器的方差表明对不同训练集的敏感程度。噪声是数据的属性。

在下面的图中,我们看到一个函数 和一些嘈杂的样本。我们使用三种不同的估计器来拟合函数:线性回归与1,4和15级的多项式特征。我们看到,第一个估计器最多只能提供样本和真实函数的不良拟合,因为它太简单(高偏差),第二个估计器几乎完全近似,最后一个估计器完全逼近训练数据,但不能很好地适应真实的功能,即对变化的训练数据(高方差)非常敏感。

偏差和方差是估计量的固有属性,我们通常必须选择学习算法和超参数,以使偏差和方差尽可能低(参见偏差方差困境)。减少模型差异的另一种方法是使用更多的训练数据。但是,如果真正的函数太复杂,只能用较小的差异的估计器进行近似,则应该只收集更多的训练数据。

在我们在示例中看到的简单的一维问题中,很容易看出估计是否有偏差或差异。然而,在高维空间中,模型可能变得非常难以可视化。因此,使用下面描述的工具通常是有帮助的。

验证曲线

为了验证模型,我们需要一个评分函数(参见模型评估:量化预测的质量),例如分类器的准确性。选择估计器的多个超参数的正确方法当然是网格搜索或类似方法(参见调整估计器的超参数),其选择具有验证集或多个验证集上的最大分数的超参数。请注意,如果我们基于验证分数优化了超参数,则验证分数有偏差,并且不再是泛化的良好估计。为了得到广义化的正确估计,我们必须在另一个测试集上计算得分。

然而,有时有助于绘制单个超参数对训练分数和验证分数的影响,以确定估计器是否过度拟合或适合某些超参数值。

validation_curve在这种情况下,该功能可以帮助:

>>> import numpy as np
>>> from sklearn.model_selection import validation_curve
>>> from sklearn.datasets import load_iris
>>> from sklearn.linear_model import Ridge

>>> np.random.seed(0)
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> indices = np.arange(y.shape[0])
>>> np.random.shuffle(indices)
>>> X, y = X[indices], y[indices]

>>> train_scores, valid_scores = validation_curve(Ridge(), X, y, "alpha",
...                                               np.logspace(-7, 3, 3))
>>> train_scores           
array([[ 0.94...,  0.92...,  0.92...],
       [ 0.94...,  0.92...,  0.92...],
       [ 0.47...,  0.45...,  0.42...]])
>>> valid_scores           
array([[ 0.90...,  0.92...,  0.94...],
       [ 0.90...,  0.92...,  0.94...],
       [ 0.44...,  0.39...,  0.45...]])

 

如果训练得分和验证分数都很低,估计量将不足。如果训练得分高,验证分数低,则估计量过高,否则运行得很好。通常不可能有较低的训练得分和较高的验证分数。所有这三种情况可以在下面的图中找到,我们在数字数据集上改变SVM 的参数。

学习曲线

学习曲线显示了不同数量的训练样本的估计量的验证和训练得分。这是一个工具,通过添加更多的训练数据以及估计器是否从方差误差或偏差误差中受益更多,从而获益良多。如果验证分数和训练分数都收敛到随训练集的大小增加而过低的值,那么我们不会从更多的训练数据中受益匪浅。在下面的情节中,您可以看到一个例子:天真的贝叶斯大致收敛到一个低分。

我们可能必须使用估计器或当前估计器的参数化,可以学习更复杂的概念(即具有较低的偏差)。如果训练得分远高于训练样本最大数量的验证分数,则添加更多的训练样本将很有可能增加泛化。在下面的情节中,您可以看到SVM可以从更多的培训示例中受益。

我们可以使用该函数learning_curve生成绘制这样一个学习曲线所需的值(已使用的样本数,训练集上的平均分数和验证集上的平均分数):

>>> from sklearn.model_selection import learning_curve
>>> from sklearn.svm import SVC

>>> train_sizes, train_scores, valid_scores = learning_curve(
...     SVC(kernel='linear'), X, y, train_sizes=[50, 80, 110], cv=5)
>>> train_sizes            
array([ 50, 80, 110])
>>> train_scores           
array([[ 0.98...,  0.98 ,  0.98...,  0.98...,  0.98...],
       [ 0.98...,  1.   ,  0.98...,  0.98...,  0.98...],
       [ 0.98...,  1.   ,  0.98...,  0.98...,  0.99...]])
>>> valid_scores           
array([[ 1. ,  0.93...,  1. ,  1. ,  0.96...],
       [ 1. ,  0.96...,  1. ,  1. ,  0.96...],
       [ 1. ,  0.96...,  1. ,  1. ,  0.96...]])
  • 无标签