Sci-learn使用岭回归避免传统线性模型的一些问题
岭回归
使用惩罚项压缩参数。不同于传统的线性模型,特别是出现了多个字段具有共线性(比如文字描述长、中、短 与 实际长度20cm,15cm,10cm就存在共线性)。
1. 我们使用make_regression方法创建简单的数据集
他们的有效秩是2,有效秩是2意味着虽然他们都是满秩矩阵,矩阵的列与列之间存在很强的线性相关性。
#导入make_regression方法
from sklearn.datasets import make_regression
#生成数据
reg_data, reg_target = make_regression(n_samples = 2000, n_features = 3, effective_rank = 2, noise = 10)
2. 使用常规的线性回归方法
#导入模块
import numpy as np
n_bootstraps = 1000
#数据集的长度
len_data = len(reg_data)
#使用数据集的75%
subsample_size = np.int(0.75*len_data)
#随机抽取
subsample = lambda: np.random.choice(np.arrange(0, len_data), size = subsample_size)
coefs = np.ones((n_bootstraps, 3))
for i in range(n_bootstraps):
subsample_idx = subsample()
subsamlple_X = reg_data[subsample_idx]
subsamlple_y = reg_data[subsample_idx]
lr.fit(subsample_X, subsample_y)
coefs[i][0] = lr.coef_[0]
coefs[i][1] = lr.coef_[1]
coefs[i][2] = le.coef_[2]
3.使用岭回归
r = Ridge()
n_bootstraps = 1000
len_data = len(reg_data)
subsample_size = np.int(0.75*len_data)
subsample = lambda: np.random.choice(np.arrange(0, len_data), size = subsample_size)
coefs_r = np.ones((n_bootstraps, 3))
for i in range(n_bootstraps):
subsample_idx = subsample()
subsamlple_X = reg_data[subsample_idx]
subsample_y = reg_data[subsample_idx]
r.fit(subsample_X, subsample_y)
coefs_r[i][0] = r.coefs_[0]
coefs_r[i][1] = r.coefs_[1]
coefs_r[i][2] = r.coefs_[2]
4.岭回归的优点
np.var(coefs_, axis = 0)
np.var(coefs_r, axis = 0)
结果表明,岭回归的参数的方差较小。
附加:工作原理
一般的线性回归问题主要是优化真实值与预测值之间的均方误差:
而岭回归的优化方式是使用一个平方项惩罚: