Ridge回归*

线性回归稍微总结一下:
常见有普通线性回归(没有正则项,目标是最小化均方误差)、LASSO(均方误差项+l-1正则项)、Ridge回归(均方误差+l-2正则项)
加上正则项可以降低过拟合风险。
Ridge回归会使得回归系数非零变量特别多,模型可解释性差。LASSO有特征选择的作用,解出的回归系数有稀疏性。

普通线性回归求解方法: 1.最小二乘(目标求导=0,得到线性方程,直接解出回归稀疏,但是求解过程涉及求样本矩阵的逆)。2.梯度下降。

**Ridge回归求解方法:**与一般线性回归大同小异。
最小二乘结果: w = ( X X T + α I ) − 1 X T Y ) w=(XX^T + \alpha I)^{-1}X^T Y) w=(XXT+αI)1XTY)
梯度下降迭代格式: w = w − β ( X T ( X θ − Y ) + α θ ) w=w-\beta (X^T (X\theta -Y)+\alpha \theta) w=wβ(XT(Y)+αθ)

LASSO回归求解方法: 1.坐标轴下降法 2.最小角回归法(Least Angle Regression, LARS)

Ridge回归sklearn

有:

  1. 普通Ridge回归,Ridge类,需要自己指定一个正则参数alpha。
  2. 交叉验证RidgeCV,给多个正则参数,会返回性能最好的那一个。

普通Ridge回归:

## 读取数据
CCPP_data = pd.read_csv(r"CCPP\Folds5x2_pp.csv")
print(CCPP_data.head())
# 划分特征与标签
X_data = CCPP_data[['AT', 'V', 'AP', 'RH']]
y_data = CCPP_data[['PE']]
# 随机划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, random_state=1)
print(X_train.shape)
print(X_test.shape)
## 普通Ridge回归,需要指定正则参数
ridge_reg = Ridge(alpha=1)
ridge_reg.fit(X_train, y_train)  # 拟合
print(ridge_reg.coef_, ridge_reg.intercept_)

交叉验证RidgeCV:

## 使用交叉验证选择Rige回归的正则参数alpha
# 首先要自己提供几个alpha的备选项,RidgeCV返回性能最好的那一个
ridge_cv = RidgeCV(alphas=[0.01, 0.1, 0.5, 1, 3, 5, 7, 100])
ridge_cv.fit(X_train, y_train)  # 拟合,应该就是把以上参数的ridge都做了一遍
print(ridge_cv.alpha_)  # 输出最优的alpha
print(ridge_cv.score(X_train, y_train))  # 模型评分,注意是关于alpha最优的那个学习器的评分

注意:ridge_cv.score()是关于alpha最优的那个学习器的评分

用scikit-learn研究超参数α和回归系数θ的关系

  • 不知道为啥要fit_intercept=False,我用True的话,系数全都是0。
    自己准备200个α,等比数列
    对每个α做一次训练,得weights
    画图
# 研究回归系数和超参数alpha的关系
# 就是自己准备多个alpha,对每个alpha对应的Ridge模型训练一遍,然后保存每个alpha对应的回归系数,画图
# 准备数据
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
print(X.shape)
y = np.ones(X.shape[0])
# 准备alpha参数
n_alphas = 200
alphas = np.logspace(-10, -2, n_alphas)
# 对每个alpha进行一次训练,得到对应的回归系数
r_reg = Ridge(fit_intercept=False)  # 只需要创建一个岭回归训练器对象
coefs = []  # 存放
for alp in alphas:
    r_reg.set_params(alpha=alp)
    r_reg.fit(X, y)
    coefs.append(r_reg.coef_)
# 画图
ax = plt.gca()
ax.plot(alphas, coefs)
print(alphas.shape)
# 反转横坐标方向
ax.set_xscale('log')
ax.set_xlim(ax.get_xlim()[::-1])
plt.xlabel('alpha')
plt.ylabel('weigts')
plt.title('Ridge coefficients as a function of the regularization')
plt.show()

Ridge回归*_第1张图片

你可能感兴趣的:(回归,机器学习,python)