接之前的线性回归文章,传送门如下。

上面这篇文章是利用方差膨胀因子,去诊断与减轻多重共线性对线性回归的影响。

需要人为介入(根据得到的方差膨胀值去判断),耗费过多的时间。

于是便有了正则化方法的出现,通过收缩方法(正则化方法)进行回归。

正则化方法主要包括岭回归与LASSO回归。

/ 01 / 岭回归

岭回归通过人为加入的惩罚项(约束项),对回归系数进行估计,为有偏估计。

有偏估计,允许估计有不大的偏度,以换取估计的误差显著减小,并在其残差平方和为最小的原则下估计回归系数。

通常岭回归方程中的R²会稍低于线性回归分析,但回归系数的显著性往往明显高于普通线性回归。

这里不对相应的理论知识进行细说,说实话小F也是晕乎乎...

所以选择先调包,看看效果是啥样的。

使用机器学习框架scikit-learn进行岭回归参数的选择(正则化系数)。

数据是书中的数据,已上传网盘,公众号回复「正则化」,即可获取。

scikit-learn当中的模型不会默认对数据标准化,必须手动执行。

标准化后的数据可以消除量纲,让每个变量的系数在一定意义下进行直接比较。

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from sklearn.linear_model import Ridge

from sklearn.linear_model import RidgeCV

from sklearn.preprocessing import StandardScaler

# 消除pandas输出省略号情况及换行情况

pd.set_option('display.max_columns', 500)

pd.set_option('display.width', 1000)

# 读取数据,skipinitialspace:忽略分隔符后的空白

df = pd.read_csv('creditcard_exp.csv', skipinitialspace=True)

# 获取信用卡有支出的行数据

exp = df[df['avg_exp'].notnull()].copy().iloc[:, 2:].drop('age2', axis=1)

# 获取信用卡无支出的行数据,NaN

exp_new = df[df['avg_exp'].isnull()].copy().iloc[:, 2:].drop('age2', axis=1)

# 选择4个连续变量,分别是年龄 收入 当地小区价格 当地人均收入

continuous_xcols = ['Age', 'Income', 'dist_home_val', 'dist_avg_income']

# 标准化

scaler = StandardScaler()

# 解释变量,二维数组

X = scaler.fit_transform(exp[continuous_xcols])

# 被解释变量,一维数组

y = exp['avg_exp_ln']

# 生成正则化系数

alphas = np.logspace(-2, 3, 100, base=10)

# 使用不同的正则化系数对模型进行交叉验证

rcv = RidgeCV(alphas=alphas, store_cv_values=True)

# 使用数据集训练(fit)

rcv.fit(X, y)

# 输出最优参数,正则化系数及相应模型R²

print('The best alpha is {}'.format(rcv.alpha_))

print('The r-square is {}'.format(rcv.score(X, y)))

# 训练好后使用transform进行数据转换

X_new = scaler.transform(exp_new[continuous_xcols])

# 使用模型对数据做预测

print(np.exp(rcv.predict(X_new)[:5]))

输出结果如下。

最优正则化系数为0.29,模型R²为0.475。

并使用最优正则化系数下的岭回归模型预测数据。

对不同正则化系数下模型的均方误差进行可视化。

# 正则化系数搜索空间当中每轮交叉验证的结果,模型的均方误差

cv_values = rcv.cv_values_

n_fold, n_alphas = cv_values.shape

# 模型均方误差上下波动值

cv_mean = cv_values.mean(axis=0)

cv_std = cv_values.std(axis=0)

ub = cv_mean + cv_std / np.sqrt(n_fold)

lb = cv_mean - cv_std / np.sqrt(n_fold)

# 绘制折线图,x轴是指数型形式

plt.semilogx(alphas, cv_mean, label='mean_score')

# y1(lb)和y2(ub)之间进行填充

plt.fill_between(alphas, lb, ub, alpha=0.2)

plt.xlabel('$\\alpha$')

plt.ylabel('mean squared errors')

plt.legend(loc='best')

plt.show()

输出结果如下。

发现正则化系数在40或50以下时,模型的均方误差相差不大。

当系数超过该阈值时,均方误差则快速上升。

所以正则化系数只要小于40或50,模型的拟合效果应该都不错。

正则化系数越小则模型拟合越好,但过拟合情况也越容易发生。

正则化系数越大,则越不容易过拟合,但模型的偏差越大。

RidgeCV通过交叉验证,可以快速返回“最优”的正则化系数。

当这只是基于数值计算的,可能最终结果并不符合业务逻辑。

比如本次模型的变量系数。

# 输出模型的变量系数

print(rcv.coef_)

# 输出结果

[ 0.03321449 -0.30956185  0.05551208  0.59067449]

发现收入的系数为负值,这肯定是不合理的。

下面通过岭迹图进行进一步分析。

岭迹图是在不同正则化系数下变量系数的轨迹。

ridge = Ridge()

coefs = []

# 不同正则化系数下的变量系数

for alpha in alphas:

ridge.set_params(alpha=alpha)

ridge.fit(X, y)

coefs.append(ridge.coef_)

# 绘制变量系数随正则化系数变化的轨迹

ax = plt.gca()

ax.plot(alphas, coefs)

ax.set_xscale('log')

plt.xlabel('alpha')

plt.ylabel('weights')

plt.title('Ridge coefficients as a function of the regularization')

plt.axis('tight')

plt.show()

输出结果。

①有两个变量的系数在不同的正则化系数下都很接近于0,那么可以选择删除。

②正则化系数越大,对变量系数的惩罚越大,所有变量的系数都趋近于0。

③有一个变量的系数变化非常大(有正有负),说明该系数的方差大,存在共线性的情况。

综合模型均方误差和岭迹图的情况,选取正则化系数为40。

如果大于40,则模型均方误差增大,模型拟合效果变差。

如果小于40,则变量系数不稳定,共线性没有得到抑制。

那么就来看看,当正则化系数为40时,模型变量系数的情况。

ridge.set_params(alpha=40)

ridge.fit(X, y)

# 输出变量系数

print(ridge.coef_)

# 输出模型R²

print(ridge.score(X, y))

# 预测数据

print(np.exp(ridge.predict(X_new)[:5]))

# 输出结果

[0.03293109 0.09907747 0.04976305 0.12101456]

0.4255673043353688

[934.79025945 727.11042209 703.88143602 759.04342764 709.54172995]

发现变量系数都为正值,符合业务直觉。

收入和当地人均收入这两个变量可以保留,另外两个删除。

/ 02/ LASSO回归

LASSO回归,在令回归系数的绝对值之和小于一个常数的约束条件下,使残差平方和最小化。

从而能够产生某些严格等于0的回归系数,得到解释力较强的模型。

相比岭回归,LASSO回归还可以进行变量筛选。

使用LassoCV交叉验证确定最优的正则化系数。

# 生成正则化系数

lasso_alphas = np.logspace(-3, 0, 100, base=10)

# 使用不同的正则化系数对模型进行交叉验证

lcv = LassoCV(alphas=lasso_alphas, cv=10)

# 使用数据集训练(fit)

lcv.fit(X, y)

# 输出最优参数,正则化系数及相应模型R²

print('The best alpha is {}'.format(lcv.alpha_))

print('The r-square is {}'.format(lcv.score(X, y)))

# 输出结果

The best alpha is 0.04037017258596556

The r-square is 0.4426451069862233

发现最优的正则化系数为0.04,模型R²为0.443。

接下来获取不同正则化系数下的变量系数轨迹。

lasso = Lasso()

lasso_coefs = []

# 不同正则化系数下的变量系数

for alpha in lasso_alphas:

lasso.set_params(alpha=alpha)

lasso.fit(X, y)

lasso_coefs.append(lasso.coef_)

# 绘制变量系数随正则化系数变化的轨迹

ax = plt.gca()

ax.plot(lasso_alphas, lasso_coefs)

ax.set_xscale('log')

plt.xlabel('alpha')

plt.ylabel('weights')

plt.title('Lasso coefficients as a function of the regularization')

plt.axis('tight')

plt.show()

输出结果。

发现随着正则化系数的增大,所有变量的系数会在某一阈值突降为0。

其中缘由与LASSO回归方程有关,不细说。

输出LASSO回归的变量系数。

print(lcv.coef_)

# 输出结果

[0.         0.         0.02789489 0.26549855]

发现前两个变量被筛选掉了,即年龄和收入。

为啥和岭回归的结果不一样呢???

/ 03 / 总结

坑留的有点多,待小F慢慢填...

相关资料获取,请点击阅读原文。

···  END  ···

数据 正则化 python_Python数据科学:正则化方法相关推荐

  1. python数据正则化_Python数据科学:正则化方法

    本文主要介绍,Python数据科学:正则化方法.正则化方法的出现,通过收缩方法(正则化方法)进行回归. 正则化方法主要包括岭回归与LASSO回归. 一.岭回归 岭回归通过人为加入的惩罚项(约束项),对 ...

  2. 5.8 正则化和数据标准化

    5.8 正则化和数据标准化 方程 Ax=bA\mathbf{x}=\mathbf{b}Ax=b 矩阵 AAA 列满秩时才有最小二乘解.矩阵 AAA 列满秩,即矩阵列向量组是无关组,根据无关组性质,即不 ...

  3. 数据预处理之归一化/标准化/正则化/零均值化

    数据预处理之归一化/标准化/正则化/零均值化 一.标准化(Standardization) 二.归一化(Normalization) 三,中心化/零均值化 (Zero-centered) 四.正则化 ...

  4. 一文解决机器学习中的过拟合与欠拟合问题(正则化,数据增强,Dropout)

    一文解决机器学习中的过拟合与欠拟合问题(正则化,数据增强,Dropout,提前终止) 生活中的过拟合与欠拟合现象 过拟合与欠拟合的概念 解决过拟合与欠拟合问题的四大金刚 正则化 数据增强 Dropou ...

  5. python 归一化_Python 数据归一化、标准化、正则化 (机器学习)

    数据归一化.标准化.正则化 1.归一化 是将数据放缩到0~1区间,利用公式(x-min)/(max-min) 2.标准化 将数据转化为标准的正态分布,均值为0,方差为1 3.正则化 正则化的主要作用是 ...

  6. 用最科学的方法展示最形象的图表——前段数据可视化选型实践

    前言 也许很多人都会觉得奇怪,在这样一个更多以后台数据分析为主的公司,为什么需要一个专注于前端的团队?今天这篇文章就来讲述那些年我们错过的前端数据可视化,以此来解答这个问题. 需求 那么,在我们的项目 ...

  7. 在计算机系统中 一个以科学的方法组织,(10)在计算机系统中,一个以科学的方法组织、存储数据,并可高效地获取、维护数据的软件系统称为【10】...

    (10)在计算机系统中,一个以科学的方法组织.存储数据,并可高效地获取.维护数据的软件系统称为[10] 更多相关问题 [单选] 保险展业的发展趋势是() [多选] 取保候审中,保证人应当履行的义务是( ...

  8. 查看数值类型python_Python数据科学实践 | 数据类型

    原标题:Python数据科学实践 | 数据类型 大家好,基于Python的数据科学实践课程又到来了,大家尽情学习吧.本期内容主要由程茜与政委联合推出. 在前面我们读取了火锅的团购数据之后,最先做的不是 ...

  9. 用最科学的方法展示最形象的图表——前端数据可视化实践

    前言 也许很多人都会觉得奇怪,在这样一个更多以后台数据分析为主的公司,为什么需要一个专注于前端的团队?今天这篇文章就来讲述那些年我们错过的前端数据可视化,以此来解答这个问题. 需求 那么,在我们的项目 ...

最新文章

  1. MySQL-查询结果缓存
  2. spring boot 整合 (全)
  3. CVPR 2021 目标检测、跟踪和姿态估计最新进展分享
  4. yii2 刷新缓存(刷新模型缓存)
  5. freecplus框架-日期、时间和计时器
  6. C++编程基础一 27-二维数组
  7. 面向对象(Python):学习笔记之异常
  8. [转]数据库连接方式读取不到Excel数据值的解决方法
  9. Ubuntu 16.04重启Nautilus
  10. 【转】虚拟机检测技术
  11. 用友NC CLOUD 工具
  12. 龙芯电脑usb和硬盘两种方式安装系统
  13. 【老九学堂】【C语言】常用算法
  14. ffmpeg设置h264编码IDR间隔
  15. 毕业设计-校园招聘系统
  16. 使用交换机服务器没有响应,登陆难交换机故障现象综合说明
  17. c basic library framework - simplec 2.0.0
  18. 服务器磁盘爆满的问题定位流程与命令汇总
  19. RazaviChap8
  20. bat批处理循环执行adb命令,非科班面试之旅

热门文章

  1. 【Flink】大数据分析常用去重算法分析『HyperLogLog 篇』
  2. Docker : Docker 查看容器 IP 地址以及相关信息
  3. Flink:Container is running beyond virtual memory limits
  4. 95-134-116-源码-维表-kafka维表关联:广播方式
  5. Druid : 慢SQL统计与监控
  6. mac电脑LC_CTYPE: cannot change locale (UTF-8): No such file or directory
  7. linux过滤文件的关键字,linux tail 过滤日志文件中的关键字
  8. 先出报表还是先计提所得税_合并报表投资时点的评估增值和内部交易到底该如何理解????...
  9. percona-distribution-mysql-pxc
  10. Java NIO编程基础