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

Python数据科学:正则化方法

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

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

  • 正则化系数越小则模型拟合越好,但过拟合情况也越容易发生。
  • 正则化系数越大,则越不容易过拟合,但模型的偏差越大。

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

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

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

  1. # 输出模型的变量系数 
  2. print(rcv.coef_) 
  3. # 输出结果 
  4. [ 0.03321449 -0.30956185  0.05551208  0.59067449] 

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

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

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

  1. ridge = Ridge() 
  2. coefs = [] 
  3. # 不同正则化系数下的变量系数 
  4. for alpha in alphas: 
  5.     ridge.set_params(alpha=alpha) 
  6.     ridge.fit(X, y) 
  7.     coefs.append(ridge.coef_) 
  8.  
  9. # 绘制变量系数随正则化系数变化的轨迹 
  10. ax = plt.gca() 
  11. ax.plot(alphas, coefs) 
  12. ax.set_xscale('log') 
  13. plt.xlabel('alpha') 
  14. plt.ylabel('weights') 
  15. plt.title('Ridge coefficients as a function of the regularization') 
  16. plt.axis('tight') 
  17. plt.show() 

输出结果。

Python数据科学:正则化方法

  • ①有两个变量的系数在不同的正则化系数下都很接近于0,那么可以选择删除。
  • ②正则化系数越大,对变量系数的惩罚越大,所有变量的系数都趋近于0。
  • ③有一个变量的系数变化非常大(有正有负),说明该系数的方差大,存在共线性的情况。

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

  • 如果大于40,则模型均方误差增大,模型拟合效果变差。
  • 如果小于40,则变量系数不稳定,共线性没有得到抑制。

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

  1. ridge.set_params(alpha=40) 
  2. ridge.fit(X, y) 
  3. # 输出变量系数 
  4. print(ridge.coef_) 
  5. # 输出模型R² 
  6. print(ridge.score(X, y)) 
  7. # 预测数据 
  8. print(np.exp(ridge.predict(X_new)[:5])) 
  9. # 输出结果 
  10. [0.03293109 0.09907747 0.04976305 0.12101456] 
  11. 0.4255673043353688 
  12. [934.79025945 727.11042209 703.88143602 759.04342764 709.54172995] 

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

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

二、LASSO回归

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

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

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

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

  1. # 生成正则化系数 
  2. lasso_alphas = np.logspace(-3, 0, 100, base=10) 
  3. # 使用不同的正则化系数对模型进行交叉验证 
  4. lcv = LassoCV(alphas=lasso_alphas, cv=10) 
  5. # 使用数据集训练(fit) 
  6. lcv.fit(X, y) 
  7. # 输出最优参数,正则化系数及相应模型R² 
  8. print('The best alpha is {}'.format(lcv.alpha_)) 
  9. print('The r-square is {}'.format(lcv.score(X, y))) 
  10.  
  11. # 输出结果 
  12. The best alpha is 0.04037017258596556 
  13. The r-square is 0.4426451069862233 

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

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

  1. lasso = Lasso() 
  2. lasso_coefs = [] 
  3. # 不同正则化系数下的变量系数 
  4. for alpha in lasso_alphas: 
  5.     lasso.set_params(alpha=alpha) 
  6.     lasso.fit(X, y) 
  7.     lasso_coefs.append(lasso.coef_) 
  8.  
  9. # 绘制变量系数随正则化系数变化的轨迹 
  10. ax = plt.gca() 
  11. ax.plot(lasso_alphas, lasso_coefs) 
  12. ax.set_xscale('log') 
  13. plt.xlabel('alpha') 
  14. plt.ylabel('weights') 
  15. plt.title('Lasso coefficients as a function of the regularization') 
  16. plt.axis('tight') 
  17. plt.show() 

(编辑:牡丹江站长网)

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

热点阅读