加入收藏 | 设为首页 | 会员中心 | 我要投稿 牡丹江站长网 (https://www.0453zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

Python数据科学:正则化方法

发布时间:2019-02-01 06:35:57 所属栏目:教程 来源:小F
导读:本文主要介绍,Python数据科学:正则化方法。正则化方法的出现,通过收缩方法(正则化方法)进行回归。 正则化方法主要包括岭回归与LASSO回归。 一、岭回归 岭回归通过人为加入的惩罚项(约束项),对回归系数进行估计,为有偏估计。 有偏估计,允许估计有不大
副标题[/!--empirenews.page--]

本文主要介绍,Python数据科学:正则化方法。正则化方法的出现,通过收缩方法(正则化方法)进行回归。

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

一、岭回归

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

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

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

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

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

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

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

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

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

  1. import numpy as np 
  2. import pandas as pd 
  3. import matplotlib.pyplot as plt 
  4. from sklearn.linear_model import Ridge 
  5. from sklearn.linear_model import RidgeCV 
  6. from sklearn.preprocessing import StandardScaler 
  7.  
  8. # 消除pandas输出省略号情况及换行情况 
  9. pd.set_option('display.max_columns', 500) 
  10. pd.set_option('display.width', 1000) 
  11. # 读取数据,skipinitialspace:忽略分隔符后的空白 
  12. df = pd.read_csv('creditcard_exp.csv', skipinitialspace=True) 
  13. # 获取信用卡有支出的行数据 
  14. exp = df[df['avg_exp'].notnull()].copy().iloc[:, 2:].drop('age2', axis=1) 
  15. # 获取信用卡无支出的行数据,NaN 
  16. exp_new = df[df['avg_exp'].isnull()].copy().iloc[:, 2:].drop('age2', axis=1) 
  17.  
  18. # 选择4个连续变量,分别是年龄 收入 当地小区价格 当地人均收入 
  19. continuous_xcols = ['Age', 'Income', 'dist_home_val', 'dist_avg_income'] 
  20. # 标准化 
  21. scaler = StandardScaler() 
  22. # 解释变量,二维数组 
  23. X = scaler.fit_transform(exp[continuous_xcols]) 
  24. # 被解释变量,一维数组 
  25. y = exp['avg_exp_ln'] 
  26.  
  27. # 生成正则化系数 
  28. alphas = np.logspace(-2, 3, 100, base=10) 
  29. # 使用不同的正则化系数对模型进行交叉验证 
  30. rcv = RidgeCV(alphas=alphas, store_cv_values=True) 
  31. # 使用数据集训练(fit) 
  32. rcv.fit(X, y) 
  33. # 输出最优参数,正则化系数及相应模型R² 
  34. print('The best alpha is {}'.format(rcv.alpha_)) 
  35. print('The r-square is {}'.format(rcv.score(X, y))) 
  36.  
  37. # 训练好后使用transform进行数据转换 
  38. X_new = scaler.transform(exp_new[continuous_xcols]) 
  39. # 使用模型对数据做预测 
  40. print(np.exp(rcv.predict(X_new)[:5])) 

输出结果如下。

Python数据科学:正则化方法

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

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

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

  1. # 正则化系数搜索空间当中每轮交叉验证的结果,模型的均方误差 
  2. cv_values = rcv.cv_values_ 
  3. n_fold, n_alphas = cv_values.shape 
  4. # 模型均方误差上下波动值 
  5. cv_mean = cv_values.mean(axis=0) 
  6. cv_std = cv_values.std(axis=0) 
  7. ub = cv_mean + cv_std / np.sqrt(n_fold) 
  8. lb = cv_mean - cv_std / np.sqrt(n_fold) 
  9. # 绘制折线图,x轴是指数型形式 
  10. plt.semilogx(alphas, cv_mean, label='mean_score') 
  11. # y1(lb)和y2(ub)之间进行填充 
  12. plt.fill_between(alphas, lb, ub, alpha=0.2) 
  13. plt.xlabel('$alpha$') 
  14. plt.ylabel('mean squared errors') 
  15. plt.legend(loc='best') 
  16. plt.show() 

输出结果如下。

Python数据科学:正则化方法

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

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

(编辑:牡丹江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读