统计学习必学的十个问题:理论与实践
上QQ阅读APP看书,第一时间看更新

1.6 使用scikit-learn

我们使用的数据是sklearn库自带的diabetes数据,此数据描述了患者一年以后糖尿病的恶化程度,总共有442个样本,每个样本10个属性,分别是年龄、性别、身高体重比(BMI)、血压以及体内的6种血清水平,也就是说样本矩阵X是442行、10列的矩阵,y是一个442维的向量。出于可视化的需要,我们使用BMI作为唯一的特征(其余特征的使用见第2章展示),并用线性回归算法和多项式回归算法(阶为20)对其作简单的拟合,并在整个数据集上计算它们的训练误差,利用如下的代码可以获得它们在样本空间的行为:

上述代码中seaborn的引入似乎是不必要的,但是它在某些时候比matplotlib作图更容易也更漂亮,它会在后面被频繁使用。得到图1.7后,可以发现数据点的分布有着一定的倾向性,似乎服从一种正比关系,线性回归算法给出了一条直线,多项式回归算法给出的是曲线。通过训练误的对比,可以看出,多项式算法比起线性算法对于数据拟合的优势并不十分明显。

图1.7 (a)为不同算法样本空间的行为,黑色点为我们使用的数据,红线为线性回归算法的结果,绿线为多项式回归的结果;(b)为算法在数据集上的训练误差,蓝色直方为线性回归算法的结果,橙色直方为多项式回归的结果

为了进一步讨论模型容量对训练误差和测试误差的影响,我们需要增大多项式算法的阶数,同时采用sklearn的cross_validate函数来快速实现交叉验证,在上述代码的基础上继续添加下列代码:

从图1.8中可以看到随着模型容量的增加,测试误差在阶数大于9之后极速上升,而训练误差仍然在缓慢地下降,是之前过拟合表现的一个例证。

图1.8 误差随多项式阶数的变化,红线为测试误差,蓝线为训练误差

接着我们来验证L1正则化和L2正则化所带来的权重衰减效果,通过调节正则化系数,使得最后寻找到的函数形式权重较小甚至为零。使用Ridge算法和Lasso算法进行多项式拟合,每次拟合可以获得权重系数随正则化系数变化的曲线,将以下代码添加到上述代码中:

从图1.9中可以看出,L2正则化和L1正则化都有权重系数衰减的作用。但是不同在于,L2正则化衰减的过程要比L1正则化更为平滑,这是因为向量2范数的平方是连续可导的,而向量1范数虽然连续,但却存在左右极限不相等导致导数无法定义的点,我们不能使用普通梯度下降去优化它,权重系数的曲线也就不光滑。在sklearn的Lasso的优化中使用了最小角回归和坐标下降的办法,这两种算法的本质都是在固定其他方向的情况下,利用次梯度(Subgradient)的方法来靠近极小值。

图1.9 多项式模型的权重随正则项系数的变化,(a)为Ridge的结果,(b)为Lasso的结果

最后我们来讨论寻找超参数的办法,因为Ridge和Lasso都只包含一个超参数,我们可以事先指定一个小的集合,使用每一个可能的取值来训练模型,然后挑选那个测试误差最小的超参数,这样的方法叫作网格搜索(grid search)。超参数数量较少的时候,我们才会考虑此种办法,因为它的计算开销会随着超参数的个数指数增加,当超参数的个数为N,假设每个超参数只有3种可能的取值,意味着我们需要训练3N次。我们用此种办法搜索Lasso的最佳超参数,将以下代码添加到上面代码中:

图1.10 多项式模型的权重随正则项系数的变化,左图为Ridge的结果,右图为Lasso的结果

从图1.10可以看到,正则化系数特别小在10-9量级上,由于Lasso可以将某些权重系数缩减到零,所以我们用阶数为10的多项式算法,结果在正则化的作用下,真正保留下来的只有其中的6项。这样的一种特征选择机制比起单纯的权重衰减具有更好的性质,因为正如我们看到的那样,线性回归算法在每一个特征前面分配一个系数,函数的参数个数依赖于数据的特征维度,那么减小模型容量的一个直接方法就是,将数据的特征减少。


(1) 有的地方会把这两者的差叫作泛化误差,本书不采用这种定义。