3.5.6 线性模型: 从回归到简约

糖尿病数据集 糖尿病数据集包含442个病人测量的10个生理学变量 (年龄、性别、体重、血压),以及一个一年后病情发展的标记:

In [8]:

  1. diabetes = datasets.load_diabetes()
  2. diabetes_X_train = diabetes.data[:-20]
  3. diabetes_X_test = diabetes.data[-20:]
  4. diabetes_y_train = diabetes.target[:-20]
  5. diabetes_y_test = diabetes.target[-20:]

目前的任务是从生理学变量中预测疾病发生。

3.5.6.1 简约模型

要改善问题的条件 (信息量小的变量、减少高纬度的诅咒、作为一个特征预处理等等), 仅选择信息量大的特征,并且将没有信息量的特征设置为0将非常有趣。这种惩罚手段,称为Lasso, 可以将一些系数设置为0。这个方法称为简约方法,简约性可以看做是Occam剃刀的一个应用: 相比于复杂的模型更偏好简单的模型。

In [9]:

  1. from sklearn import linear_model
  2. regr = linear_model.Lasso(alpha=.3)
  3. regr.fit(diabetes_X_train, diabetes_y_train)

Out[9]:

  1. Lasso(alpha=0.3, copy_X=True, fit_intercept=True, max_iter=1000,
  2. normalize=False, positive=False, precompute=False, random_state=None,
  3. selection='cyclic', tol=0.0001, warm_start=False)

In [10]:

  1. regr.coef_ # 非常简约的系数

Out[10]:

  1. array([ 0\. , -0\. , 497.34075682, 199.17441034,
  2. -0\. , -0\. , -118.89291545, 0\. ,
  3. 430.9379595 , 0\. ])

In [11]:

  1. regr.score(diabetes_X_test, diabetes_y_test)

Out[11]:

  1. 0.55108354530029779

分数与线性回归 (最小二乘) 很相似:

In [12]:

  1. lin = linear_model.LinearRegression()
  2. lin.fit(diabetes_X_train, diabetes_y_train)

Out[12]:

  1. LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

In [13]:

  1. lin.score(diabetes_X_test, diabetes_y_test)

Out[13]:

  1. 0.58507530226905713

相同问题的不同算法 不同的算法可以用于解决相同的数学问题。例如,sklearn中的Lasso对象用坐标下降法来解lasso回归,这种方法在大数据集上有效。但是,sklearn也提供了LassoLARS对象,使用LARS,一种在权重向量估计非常稀疏的问题上非常高效的方法,即有很少观察值的问题。