广义线性回归--1.2岭回归(Ridge)

1.2.1.岭回归 (Ridge)的表达式

固定α求出最佳的w (使结构风险最小化 = 损失函数(平方损失) + 正则化(L2范数))

1.2.2示例

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.13636..

岭回归:是带有罚值的残差平方和
应用:具有L2正则化的线性最小二乘法,岭回归是一种专用于共线性数据分析有偏估计的回归方法,
  实质是一种改良的最小二乘法估计法,通过放弃最小二乘的无偏性,以损失部分信息,降低精度为代价
  获得的回归系数更符合实际,更靠谱的回归方法,对病态数据的拟合要强于最小二乘法,当数据集中存在共线性的时候
  岭回归就很有用

参数 copy_x 是否对x值进行复制保存
  fit_intercept是否显示截距 即b的值
  n_jobs 运算时电脑几核运行
  normalize 在进行最小二乘法运算时x是否先标准化,当_fit_intercep_t为False时该参数默认取消
  加入了鲁棒性a参数正则化系数在0~1之间
  solver 进行计算时选择的解决器,auto 表示自动 svd表示奇异值分解法,sag表示随机梯度下降法,在大数据下表现良好
  tol表示精度
  random_state sag时伪随机种子默认为none

1.2.3.官方文档案例分析

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3 from sklearn import linear_model
 4 
 5 # X is the 10x10 Hilbert matrix
 6 X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
 7 y = np.ones(10)
 8 
 9 
10 # #############################################################################
11 # Compute paths
12 
13 n_alphas = 200
14 #np.logspace 对数等比例列 
15 alphas = np.logspace(-10, -2, n_alphas)
16 
17 coefs = []
18 for a in alphas:
19     ridge = linear_model.Ridge(alpha=a, fit_intercept=False)
20     ridge.fit(X, y)
21     coefs.append(ridge.coef_)
22 #当alphas越小系数的震动幅度越大
23 # #############################################################################
24 # Display results
25 
26 ax = plt.gca()
27 
28 ax.plot(alphas, coefs)
29 ax.set_xscale('log')
30 ax.set_xlim(ax.get_xlim()[::-1])  # reverse axis
31 plt.xlabel('alpha')
32 plt.ylabel('weights')
33 plt.title('Ridge coefficients as a function of the regularization')
34 plt.axis('tight')
35 plt.show()

1.2.4.案例分析
 1 import pandas as pd 
 2 import numpy as np
 3 import sklearn.datasets as datasets
 4 from sklearn.model_selection import train_test_split
 5 from sklearn.linear_model import LinearRegression,SGDRegressor,Ridge
 6 from sklearn.preprocessing import StandardScaler
 7 from sklearn.metrics import mean_squared_error
 8 
 9 
10 def linearmodel():
11 
12     #线性回归对波士顿数据集处理
13     #:return: None
14  
15 
16     # 1、加载数据集
17 
18     ld = datasets.load_boston()
19 
20     x_train,x_test,y_train,y_test = train_test_split(ld.data,ld.target,test_size=0.25)
21 
22     # 2、标准化处理
23 
24     # 特征值处理
25     std_x = StandardScaler()
26     x_train = std_x.fit_transform(x_train)
27     x_test = std_x.transform(x_test)
28 
29     #新版的sklearn中,所有的数据都应该是二维矩阵,哪怕它只是单独一行或一列增加一个维度
30     y_train = y_train[:, np.newaxis]
31     y_test = y_test[:, np.newaxis]
32     # 目标值进行处理
33    
34     std_y  = StandardScaler()
35     y_train = std_y.fit_transform(y_train)
36     y_test = std_y.transform(y_test)
37 
38     # 3、估计器流程
39 
40     # LinearRegression 最小二乘法
41     lr = LinearRegression()
42 
43     lr.fit(x_train,y_train)
44     #print("相关系数:",lr.coef_)
45 
46     y_lr_predict = lr.predict(x_test)
47     #还原真实值
48     y_lr_predict = std_y.inverse_transform(y_lr_predict)
49 
50     #print("Lr预测值:",y_lr_predict)
51 
52 
53     # SGDRegressor 梯度下降法
54     sgd = SGDRegressor()
55 
56     sgd.fit(x_train,y_train)
57 
58     # print(sgd.coef_)
59 
60     y_sgd_predict = sgd.predict(x_test)
61     #还原真实值
62     y_sgd_predict = std_y.inverse_transform(y_sgd_predict)
63 
64     #print("SGD预测值:",y_sgd_predict)
65 
66     # 带有正则化的岭回归
67 
68     rd = Ridge(alpha=0.01)
69 
70     rd.fit(x_train,y_train)
71 
72     y_rd_predict = rd.predict(x_test)
73     #还原真实值
74     y_rd_predict = std_y.inverse_transform(y_rd_predict)
75 
76     #print(rd.coef_)
77 
78     # 两种模型评估结果
79 
80     print("lr的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))
81 
82     print("SGD的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_sgd_predict))
83 
84     print("Ridge的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_rd_predict))
85 
86     return None
87 linearmodel()

1.2.5.岭回归--广义交叉验证(RidgeCV)L2

通过内置的关于的 alpha 参数的交叉验证来实现岭回归。 该对象与 GridSearchCV 的使用方法相同,只是它默认为 Generalized Cross-Validation(广义交叉验证 GCV),

  这是一种有效的留一验证方法(LOO-CV)

1 from sklearn import linear_model
2 reg = linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0]) #多个a得到多个对应最佳的w相关系数获得最佳的a及对应的w
3 reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])       
4 linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0], cv=None, fit_intercept=True, scoring=None,normalize=False)
5 reg.alpha_                                      
6 0.1

猜你喜欢

转载自www.cnblogs.com/zhengyinboke/p/12745467.html