# 展示相关系数的共线性对于模型的影响
# 本例子应用岭回归拟合数据,结果图画中,每个颜色代表一个不同特征的相关系数路径向量,特征相关系数是正则项系数的函数(岭回归的惩罚函数有正则化项)
# 本例子展示了岭回归对于病态条件矩阵数据的优点,病态条件指目标值一点微小的扰动会导致权重的巨大差距,这种情况下加一个正则化项限制权重大小非常有用
# 当正则化项系数alpha非常大,正则化项的影响盖过了平方误差损失函数,特征系数会趋向于零;而在特征系数路径末尾,alpha趋近于零,此时惩罚函数相当于最小平方函数,特征系数存在非常大的波动
# 在实际应用中,可以通过调节alpha值平衡最小平方项和正则化项
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
# X is the 10*10 Hilbert matrix
# np.arange,生成数列,左闭右开
# np.newaxis 添加新维度,用在哪一维,就在哪一位添加新维度
# (10,)+(10,1)=(10,10),做加法时会自动重复填充行列
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
y = np.ones(10)
# compute paths
n_alphas = 200
# np.logspace,生成等比数列
# 第一、第二个参数是底数的次方
# 参数base可以更改底数,默认底数是10
alphas = np.logspace(-10, -2, n_alphas)
coefs = []
for a in alphas:
# Ridge类,岭回归模型,linear_model模块下的类
# 与最小平方线性回归的差别在于岭回归多了一个L2正则化项,正则化项可以通过参数alpha控制
# 该模型内置支持多目标值回归,如果y是二维数组,那数据集形状为(n_samples,n_targets)
# 参数alpha,控制正则化项,当为多目标值回归时,alpha为数组,每个回归目标值都拥有一个alpha参数
# 参数fit_intercept,是否保留截距
# 参数solver,求解方式,如‘svd’奇异值分解等,默认自动选择求解方式,使用该参数时需要搭配fit_intercept参数及矩阵是否稀疏
# 属性coef_,权重矩阵,形状为(n_features,),多目标值回归时为(n_targets,n_features)
# 属性intercept_,截距值,不保留截距时本值设为0.0,形状为(n_targets,)
# 方法fit,匹配模型
# 方法predict,预测目标值
# 方法score,返回预测值的相关系数决定稀疏R^2
ridge = linear_model.Ridge(alpha=a, fit_intercept=False)
ridge.fit(X, y)
# 获取每一个alpha值下训练结果的相关系数
coefs.append(ridge.coef_)
# display results
# plt.gca(),根据给定参数获取当前Axes画图区域对象,如果没有匹配上的,则自动新建一个绘图区域对象
ax = plt.gca()
ax.plot(alphas, coefs)
# Axes.set_xscale(),设置x轴坐标的模式,支持:'linear', 'log','symlog','logit',......等
ax.set_xscale('log')
# reverse axis
# set_xlim()同plt.xlim,设置x轴的取值范围,get_xlim获取取值返回,返回一个二元数组,后面加上的[::-1]为将元组倒序
# 因为按照顺序alpha取值是从小到大,但画图时特征权重是随着x轴变小而增大,因此周坐标要反转一下
ax.set_xlim(ax.get_xlim()[::-1])
plt.xlabel('alpha')
plt.ylabel('weights')
plt.title('ridge coefficients as a function of the regularization')
plt.axis('tight')
plt.show()
