3.5.6 线性模型: 从回归到简约
糖尿病数据集 糖尿病数据集包含442个病人测量的10个生理学变量 (年龄、性别、体重、血压),以及一个一年后病情发展的标记:
In [8]:
diabetes = datasets.load_diabetes()
diabetes_X_train = diabetes.data[:-20]
diabetes_X_test = diabetes.data[-20:]
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]
目前的任务是从生理学变量中预测疾病发生。
3.5.6.1 简约模型
要改善问题的条件 (信息量小的变量、减少高纬度的诅咒、作为一个特征预处理等等), 仅选择信息量大的特征,并且将没有信息量的特征设置为0将非常有趣。这种惩罚手段,称为Lasso, 可以将一些系数设置为0。这个方法称为简约方法,简约性可以看做是Occam剃刀的一个应用: 相比于复杂的模型更偏好简单的模型。
In [9]:
from sklearn import linear_model
regr = linear_model.Lasso(alpha=.3)
regr.fit(diabetes_X_train, diabetes_y_train)
Out[9]:
Lasso(alpha=0.3, copy_X=True, fit_intercept=True, max_iter=1000,
normalize=False, positive=False, precompute=False, random_state=None,
selection='cyclic', tol=0.0001, warm_start=False)
In [10]:
regr.coef_ # 非常简约的系数
Out[10]:
array([ 0\. , -0\. , 497.34075682, 199.17441034,
-0\. , -0\. , -118.89291545, 0\. ,
430.9379595 , 0\. ])
In [11]:
regr.score(diabetes_X_test, diabetes_y_test)
Out[11]:
0.55108354530029779
分数与线性回归 (最小二乘) 很相似:
In [12]:
lin = linear_model.LinearRegression()
lin.fit(diabetes_X_train, diabetes_y_train)
Out[12]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
In [13]:
lin.score(diabetes_X_test, diabetes_y_test)
Out[13]:
0.58507530226905713
相同问题的不同算法 不同的算法可以用于解决相同的数学问题。例如,sklearn中的Lasso对象用坐标下降法来解lasso回归,这种方法在大数据集上有效。但是,sklearn也提供了LassoLARS对象,使用LARS,一种在权重向量估计非常稀疏的问题上非常高效的方法,即有很少观察值的问题。