线性回归又名普通二成最小法(ordinary least squares, OLS), 是回归问题最简单也是最经典的线性方法. 线性回归寻找参数 w 和 b, 使得对训练集的预测值与真实的回归目标值 y 之间的均方误差最小. 线性回归没有参数, 这是一个优点, 但也因此无法控制模型的复杂度.
线性回归的用法与近邻算法相似, 如下:
- import numpy as np
- import pandas as pd
- import mglearn
- import matplotlib.pyplot as plt
- from sklearn.model_selection import train_test_split
- # 线性回归在 sklearn 的 linear_model 模块的 LinearRegression 类中实现
- from sklearn.linear_model import LinearRegression
- # 生成数据
- X, y = mglearn.datasets.make_wave(n_samples=60)
- # 拆分数据集
- X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
- # 实例化 LinearRegression 对象并用 fit 函数训练集数据进行模型拟合
- lr = LinearRegression().fit(X_train, y_train)
- # 调用 LinearRegression 对象的 predict 函数对测试集进行预测
- print("Test set predictions:\n{}".format(lr.predict(X_test)))
- # 调用 LinearRegression 对象的 score 函数对模型性能进行评估
- print("Test set acurracy:{:.2f}".format(lr.score(X_test, y_test)))
- print("Train set acurracy:{:.2f}".format(lr.score(X_train, y_train)))
- Test set predictions:
- [-0.3283204 -0.84483835 -0.49358667 0.35230624 -0.71167167 0.19957573
- 1.02910669 0.07859229 0.75390167 -0.75032857 -0.47681266 1.07802761
- -0.8104986 0.2013684 1.00692209]
- Test set acurracy:0.66
- Train set acurracy:0.67
训练集和测试集上的分数非常相近, 且不是太好, 说明可能存在欠拟合.
斜率参数 w 也叫权重或系数被保存在 LinearRegression 对象的 coef_属性中, 偏移或截距 (b) 被保存在 intercept_属性中:
- print("lr.coef_:{}".format(lr.coef_))
- print("lr.intercept_:{}".format(lr.intercept_))
- lr.coef_:[0.39390555]
- lr.intercept_:-0.031804343026759746
注意使用的 wave 数据是一维数据集, 模型的性能不是很好, 对于更高维的数据集, 线性模型将变动更加强大.
下面使用更复杂的数据集 boston 房价, 数据集有 506 个样本和 105 特征, 验证线性回归在高维数据集上的表现:
- # 加载数据集
- X, y = mglearn.datasets.load_extended_boston()
- # 拆分数据集
- X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
- # 实例化 LinearRegression 对象并用 fit 函数训练集数据进行模型拟合
- lr = LinearRegression().fit(X_train, y_train)
- # 调用 LinearRegression 对象的 score 函数对模型性能进行评估
- print("Train set acurracy:{:.2f}".format(lr.score(X_train, y_train)))
- print("Test set acurracy:{:.2f}".format(lr.score(X_test, y_test)))
- Train set acurracy:0.95
- Test set acurracy:0.61
线性回归在高维数据集上的表象明显好于一维数据集, 但在训练集和测试集上的得分差异较大, 是过拟合的明显标志.
2. 岭回归
岭回归也是一种用于回归的线性模型. 在岭回归模型中, 对系数 (w) 的选择不仅要在训练集上得到较好的效果, 而且还要拟合附加约束, 使得 w 尽量小, 及 w 的所有元素都要接近于 0. 这种约束即是正则化. 正则化是指对模型进行显示约束, 以避免过拟合. 岭回归用到的这种被称为 L2 正则化.
岭回归在 sklearn 的 linear_model 的 Ridge 类中实现. 下面是岭回归在 boston 房价数据集上的效果.
- import numpy as np
- import pandas as pd
- import mglearn
- import matplotlib.pyplot as plt
- from sklearn.model_selection import train_test_split
- # 线性回归在 sklearn 的 linear_model 模块的 Ridge 类中实现
- from sklearn.linear_model import Ridge
- # 加载数据
- X, y = mglearn.datasets.load_extended_boston()
- # 拆分数据集
- X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
- # 实例化 Ridge 对象并用 fit 函数训练集数据进行模型拟合
- rg = Ridge().fit(X_train, y_train)
- # 调用 Ridge 对象的 score 函数对模型性能进行评估
- print("Train set acurracy:{:.2f}".format(rg.score(X_train, y_train)))
- print("Test set acurracy:{:.2f}".format(rg .score(X_test, y_test)))
- Training set scroe:0.89
- Test set score:0.75
Ridge 在训练集上的得分低于 LinearRegression, 但在测试集上的得分要高.
Ridge 模型在模型的简单性 (w 接近 0) 与训练集性能之间做权衡. 模型的简单性和训练集性能的权衡可通过设置参数 alpha 来指定. alpha 的最佳值取决于具体的数据集. 增大 alpha 的值会使得 w 更加趋向 0, 即模型更简单, 从而降低训练集性能, 但可能提高泛化性能.**
- rg10 = Ridge(alpha=10).fit(X_train, y_train)
- print("Training set scroe:{:.2f}".format(rg10.score(X_train, y_train)))
- print("Test set score:{:.2f}".format(rg10.score(X_test, y_test)))
- Training set scroe:0.79
- Test set score:0.64
减小 alpha 可以让 w 收到的限制更小, 对于非常小的 alpha,w 几乎没有收到限制, 会得到一个与 LinearRegression 类似的模型.
- rg01 = Ridge(alpha=0.1).fit(X_train, y_train)
- print("Training set scroe:{:.2f}".format(rg01.score(X_train, y_train)))
- print("Test set score:{:.2f}".format(rg01.score(X_test, y_test)))
- Training set scroe:0.93
- Test set score:0.77
下面查看不同 alpha 取值对模型 coef_属性的影响, 观察 alpha 参数是如何影响模型.
- plt.plot(rg.coef_, 's', label="Ridge alpha=1")
- plt.plot(rg10.coef_, '^', label="Ridge alpha=10")
- plt.plot(rg01.coef_, 'v', label="Ridge alpha=0.1")
- plt.plot(lr.coef_, 'o', label="LinearRegression")
- plt.xlabel("Cofficient index")
- plt.ylabel("Cofficient magnitude")
- plt.hlines(0, 0, len(lr.coef_))
- plt.ylim(-25, 25)
- plt.legend()
alpha 对 w 的影响
从上图中可以看出 alpha 越大, w 的范围越集中且趋于 0.
另外一种理解正则化的影响, 就是固定 alpha 的值, 但是改变训练数据量.
mglearn.plots.plot_ridge_n_samples()
学习曲线
无论是岭回归还是线性回归, 训练分数都要高于测试分数. 由于岭回归是正则化的, 因此它的训练分数低于线性回归, 但是测试分数要高于线性回归. 尤其是较小的数据集时, 从上图可看出数据点少于 400 时, 线性回归学习不到任何内容. 随着模型可用数据的增多, 两个模型的性能都在提升, 最终线性回归的性能会追上岭回归. 即在有足够的的训练数据的情况下, 正则化变得不那么重要.
来源: http://www.jianshu.com/p/54eb23e9aae9