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)

结果表明,岭回归的参数的方差较小。

附加:工作原理

一般的线性回归问题主要是优化真实值与预测值之间的均方误差:

而岭回归的优化方式是使用一个平方项惩罚:

猜你喜欢

转载自blog.csdn.net/Day_and_Night_2017/article/details/89379539