岭回归
岭回归通过在系数的大小上加入一个惩罚函数来解决最小二乘法的一些问题。岭系数最小化了一个惩罚的剩余平方和。
复杂度参数控制收缩量:如果越大,收缩量就会越大,因此系数对共线性鲁棒性更强。和其他线性模型一样,岭回归线性模型拟合数组X,y,并且将线性模型的系数储存在coef_成员中。
from sklearn import linear_model
reg = linear_model.Ridge(alpha=.5)
reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,
normalize=False, random_state=None, solver='auto', tol=0.001)
reg.coef_
array([0.34545455, 0.34545455])
reg.intercept_
0.1363636363636364
实例1:将岭函数作为正则化函数绘制出来
显示了共线性对一个函数系数的影响。岭回归是本例中使用的估计量,每种颜色代表系数向量的不同特征,并显示为正则化参数的函数。这个例子还显示了将岭回归用于高度病态矩阵的有用性。对于这样的矩阵,目标函数变量的微小变化将会导致计算出的权重发生巨大的变化。在这样的情况下,设置一个特定的正则化来减少这种变化(噪声)是很有用的。
当非常大时,正则化效应支配平方损失函数,系数趋近于0。在趋近于0的过程中,随着趋近于0,解趋近于普通最小二乘法得出的解,因此系数表现出较大的震荡。在实践中,有必要调整的值,使两者之间保持平衡。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
y = np.ones(10)
n_alphas = 200
alphas = np.logspace(-10, -2, n_alphas)
coefs = [ ]
for a in alphas:
ridge = linear_model.Ridge(alpha=a, fit_intercept=False)
ridge.fit(X, y)
coefs.append( ridge.coef_)
ax = plt.gca()
ax.plot(alphas, coefs)
ax.set_xscale('log')
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()
output_2.png
接下来我们逐行分析代码。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
从各种包中导入需要的函数
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
y = np.ones(10)
n_alphas = 200
alphas = np.logspace(-10, -2, n_alphas)
print(np.arange(1, 11))
print(np.arange(0, 10)[ :, np.newaxis])
print(np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
print(np.ones(10))
[ 1 2 3 4 5 6 7 8 9 10]
[[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]]
[[ 1 2 3 4 5 6 7 8 9 10]
[ 2 3 4 5 6 7 8 9 10 11]
[ 3 4 5 6 7 8 9 10 11 12]
[ 4 5 6 7 8 9 10 11 12 13]
[ 5 6 7 8 9 10 11 12 13 14]
[ 6 7 8 9 10 11 12 13 14 15]
[ 7 8 9 10 11 12 13 14 15 16]
[ 8 9 10 11 12 13 14 15 16 17]
[ 9 10 11 12 13 14 15 16 17 18]
[10 11 12 13 14 15 16 17 18 19]]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
我们使用print函数输出以上的结果,我们可以更好地理解的值。
n_alphas = 200
alphas = np.logspace(-10, -2, n_alphas)
创建一个有200个alpha的列表,列表的开始值是,结束值是,步长是8/200
coefs = [ ]
for a in alphas:
ridge = linear_model.Ridge(alpha=a, fit_intercept=False)
ridge.fit(X, y)
coefs.append( ridge.coef_)
创建模型,没有截距;训练模型;将权重值添加到列表中。
ax = plt.gca()
ax.plot(alphas, coefs)
ax.set_xscale('log')
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()
output_2.png
获取坐标,根据alpha和权重的值绘图,设置x轴的显示比例并翻转坐标轴。设置坐标轴的各种参数和图形名称。
网友评论