2.4 使用scikit-learn

我们仍然使用sklearn的diabetes数据集,比起第1章简单粗暴的处理,我们会应用特征选择的办法对这个数据集作进一步了解。首先,我们来使用皮尔逊相关系数和互信息来处理整体数据,得到每个特征对目标值的贡献,以找出无关特征。

从图2.2可以看出,‘sex’和‘age’分别被相关系数和互信息给出了最低的值,代表着这两个特征可能是无关特征。值得注意的是,左边的皮尔逊相关系数的图中,特征与目标值的相关系数并不是在[-1,1],这是因为我们使用的sklearn中的‘f_regression’方法对相关系数做Fisher变换,来进行假设检验,我们最后返回的结果是变换后分布的均值。我们可以在样本空间中找出这两个特征与目标值的散点图,对无关特征进行直观的解读,在上述的基础上添加以下代码:

图2.2 (a)为相关系数的结果,(b)为互信息的结果

从图2.3可以看出,对于不同的目标值,性别‘sex’有两种取值,年龄‘age’与目标值的散点几乎均匀地分布在平面图上,都可能是无关的特征(严格来说,年龄是无关特征的可能性要高于性别,因为从图像看来,对于同一个目标值,年龄有着更多的取值)。

接着,我们考虑目标值只对数据的特征进行相关性分析,以找出多余的特征。虽然可以沿用皮尔逊和互信息的办法来得到相关性矩阵,但是为了能让大家掌握相关性分析的更多方法,我们在这里使用斯皮尔曼相关系数(Spearman Correlation Coefficient),与皮尔逊相关系数相比,它的作用更多。皮尔逊系数只有在严格线性关系时才会为1,而斯皮尔曼考察的是两组变量是否单调变化,所以它允许了一定的非线性。在上述的基础上添加以下代码:

图2.3 (a)为sex与目标值的平面图,(b)为age与目标值的平面图

观察图2.4,我们首先会注意矩阵的对角元全部为1,这是最正常不过的结果,因为变量与其自身是严格的简单线性关系,并且它是一个对称矩阵,因为斯皮尔曼相关系数本身就可以交换变量。

要找出多余的特征,我们需要额外注意那些数值较大的区域,比如序号为4和5的特征的相关系数高达0.88,很有可能是多余特征,序号6和7的特征相关系数较大,为0.97,我们在数据集上找到对应的特征名称(它们分别代表着人体不同血清),并且将它们的关系展示在样本空间上,对多余特征进行直观的理解。在上述基础上添加代码:

图2.4 相关系数矩阵维度就是特征维度(10×10),每一个矩阵元表示两组特征的斯皮尔曼相关系数

从图2.5中可以看出,S1血清和S2血清呈现很好的线性关系,而S3血清和S4血清在不同的取值处表现出阶梯状的线性关系,在S3的均匀取值的情形下,S4只能取到一些特定的值。面对这两对可能线性相关的变量,我们只需要分别保留其中一个即可。

然后,我们采用包裹法来进行特征挑选。在上述的数据集中可以很方便地使用sklearn中的特征递归消除方法,并结合交叉验证来评价特征子集,如果减去的特征无法使得性能提升,那么我们就会停止剔除过程。采用岭回归作为我们的学习器,岭回归带来的权重缩减,使得交叉验证的泛化性能尽可能地稳定,有利于我们的性能评估,在上述代码的基础上添加以下代码:

图2.5 (a)是S1和S2血清的散点图,(b)是S3和S4血清的散点图

在图2.6中,可以看到递归消除法得到的最佳特征数为5,此时保留的特征打印出来分别为‘sex’、‘bmi’、‘bp’、‘s3’、‘s5’,发现前面所得出的无关特征‘age’已经被剔除掉,‘sex’被保留下来,而得出的多余特征‘s4’也被剔除,这符合我们的认知。同时,可能会让读者疑惑的是,强线性相关的‘s1’和‘s2’全部被剔除,为什么学习器不保留其中的一个呢,这可能是因为我们采用了岭回归作为学习器,它本身就可以消除一定的多重共线性。

作为嵌入式方法的代表,最后让我们来尝试一下弹性网模型具备的稀疏能力,弹性网涉及两个超参数,所以可以根据这两个参数的相对大小,来观察是要缩减权重到小的值还是将有些权重直接缩减为零,我们在1.6节已经使用过网格搜索的技巧,在这里,我们会采用sklearn中的GridSearchCV方法来快速完成两个超参数的网格搜索。它的方法就是穷尽每一对可能的参数组合,依次进行交叉验证,我们选用10折交叉验证,这两个超参数都有5种可能的取值,那么就会进行250次训练。在上述代码的基础上添加以下代码:

图2.6 学习器交叉验证的泛化误差随特征数的变化

最后我们会得到最佳的参数组合,为{‘alpha’:1e-06,‘l1_ratio’:0},超参数为零意味着这个超参数可以在此模型中安全的去掉。从图2.7中可以看出,在固定另一个超参数的情况下,L1正则化系数几乎不会对测试误差造成什么影响,测试误差的差异几乎由总的正则化项系数所提供。如果我们深入探讨超参数选择的整个过程,会发现某些超参数的不同取值会得到相同结果,这是我们在超参数调节中经常会遇到的情况,这也是随机搜索(Randomized Search)在很多时候都比网格搜索高效且优越的原因。

图2.7 两组超参数的不同组合下的测试误差,横轴为正则化项系数的取值,纵轴为L1正则化项在整个正则化中占比的取值