成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python數據科學:正則化方法

大數據 數據可視化
本文主要介紹,Python數據科學:正則化方法。正則化方法的出現,通過收縮方法(正則化方法)進行回歸。正則化方法主要包括嶺回歸與LASSO回歸。

本文主要介紹,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以下時,模型的均方誤差相差不大。

當系數超過該閾值時,均方誤差則快速上升。

所以正則化系數只要小于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() 

輸出結果。

Python數據科學:正則化方法

發現隨著正則化系數的增大,所有變量的系數會在某一閾值突降為0。

其中緣由與LASSO回歸方程有關,不細說。

輸出LASSO回歸的變量系數。

  1. print(lcv.coef_) 
  2. # 輸出結果 
  3. [0.         0.         0.02789489 0.26549855] 

發現前兩個變量被篩選掉了,即年齡和收入。

為啥和嶺回歸的結果不一樣呢???

三、總結

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

責任編輯:未麗燕 來源: 法納斯特
相關推薦

2021-08-30 11:40:06

PythonSeaborn可視化

2019-09-30 09:10:11

Python編程語言數據科學

2018-04-21 07:11:53

正則表達式Python函數

2021-10-08 13:45:23

大數據數據科學家貨幣

2018-11-06 20:30:23

Python開源工具機器學習

2019-05-07 19:12:28

機器學習神經網絡Python

2018-12-18 13:32:37

方差分析數據分析教育

2020-11-18 14:40:46

數據科學自動化Uber

2023-09-22 11:32:31

數字化轉型數字經濟

2017-07-12 16:07:49

大數據數據可視化

2019-10-23 19:33:24

數據科學保護數據匿名化

2022-11-02 14:45:24

Python數據分析工具

2018-04-16 11:11:56

2015-01-06 12:21:34

阿里云

2012-04-10 15:31:06

HTML 5

2022-09-08 14:52:29

圖數據庫Neo4j

2020-05-27 11:16:49

數據科學機器學習Python

2018-06-27 10:45:12

數據Python程序

2019-03-20 14:17:21

數據科學PythonSQL

2019-03-19 09:00:14

Python 開發編程語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男人的天堂久久 | 欧日韩不卡在线视频 | 亚洲天堂av在线 | 欧美一级黄色免费 | 国产欧美日韩精品一区二区三区 | 99精彩视频| 一区二区高清 | 日韩一区欧美一区 | 日韩亚洲欧美综合 | 丝袜天堂 | 亚洲精品日韩综合观看成人91 | 久久久久久免费精品一区二区三区 | 九九九久久国产免费 | 91玖玖| 一区二区免费 | 福利一区二区 | 日韩国产精品一区二区三区 | 国产精品一区二区三区免费观看 | 综合色久 | 97人人干 | 亚洲高清在线观看 | 久久久久久久一区 | 成人综合一区二区 | av国产在线观看 | 日日碰狠狠躁久久躁婷婷 | 91免费高清视频 | 欧美激情久久久久久 | 欧美视频1区 | 亚洲精品乱码久久久久久蜜桃91 | 天天影视网天天综合色在线播放 | 亚洲天堂成人在线视频 | 精品亚洲永久免费精品 | 一级a性色生活片久久毛片波多野 | 美日韩精品| 欧美日韩精品中文字幕 | 久久手机在线视频 | 久久草在线视频 | 国产真实乱全部视频 | 亚洲精品电影网在线观看 | 日本在线免费看最新的电影 | 黄视频免费在线 |