從零開始學Python數據分析【25】--嶺回歸及LASSO回歸(實戰部分)

2021-03-02 Python愛好者社區

作者:劉順祥

個人微信公眾號:每天進步一點點2015

前文傳送門:

從零開始學Python數據分析【1】--數據類型及結構

從零開始學Python數據分析【2】-- 數值計算及正則表達式

從零開始學Python數據分析【3】-- 控制流與自定義函數

從零開始學Python數據分析【4】-- numpy

從零開始學Python數據分析【5】-- pandas(序列部分)

從零開始學Python數據分析【6】-- pandas(數據框部分01)

從零開始學Python數據分析【7】-- pandas(數據框部分02)

從零開始學Python數據分析【8】-- pandas(數據框部分03)

從零開始學Python數據分析【9】-- pandas(數據框部分04)

從零開始學Python數據分析【10】-- matplotlib(條形圖)

從零開始學Python數據分析【11】-- matplotlib(餅圖)

從零開始學Python數據分析【12】-- matplotlib(箱線圖)

從零開始學Python數據分析【13】-- matplotlib(直方圖)

從零開始學Python數據分析【14】-- matplotlib(折線圖)

從零開始學Python數據分析【15】-- matplotlib(散點圖)

從零開始學Python數據分析【16】-- matplotlib(雷達圖)

從零開始學Python數據分析【17】-- matplotlib(面積圖)

從零開始學Python數據分析【18】-- matplotlib(熱力圖)

從零開始學Python數據分析【19】-- matplotlib(樹地圖)

從零開始學Python數據分析【20】--線性回歸(理論部分)

從零開始學Python數據分析【21】--線性回歸(實戰部分)

從零開始學Python數據分析【22】--線性回歸診斷(第一部分)

從零開始學Python數據分析【23】--線性回歸診斷(第二部分)

從零開始學Python數據分析【24】--嶺回歸及LASSO回歸(理論部分)

前言

      在《從零開始學Python【24】--嶺回歸及LASSO回歸(理論部分)》一文中我們詳細介紹了關於嶺回歸和LASSO回歸的理論知識,其實質就是在線性回歸的基礎上添加了2範數和1範數的懲罰項。這兩個模型的關鍵點是找到一個合理的lambda係數,來平衡模型的方差和偏差,從而得到比較符合實際的回歸係數。本期是基於之前討論的理論部分,採用Python和R語言,完成對嶺回歸和LASSO回歸的實戰。文中所利用的數據集來自R語言ISLR包中的Hitters數據集,描述的是關於棒球運動員收入的相關信息,數據集和腳本可以之文末查看連結獲得。

嶺回歸

      原始數據集存在收入的缺失,我們不妨先把這樣的觀測刪除,同時,數據集中含有離散變量,需要將這些變量轉換為啞變量後方可建模,故第一步需要對原始數據集進行清洗

# ===== Python3 =====

# 導入第三方包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import Ridge,RidgeCV
from sklearn.linear_model import Lasso,LassoCV
from sklearn.metrics import mean_squared_error

# 讀取數據
df = pd.read_csv('Hitters.csv')
# 啞變量處理
dummies = pd.get_dummies(df[['League', 'Division', 'NewLeague']])
# 將原始數據集與啞變量數據合併起來
mydf = df.join(dummies)
# 缺失值刪除
mydf = mydf.dropna()
# 刪除不必要的變量(字符串變量和各啞變量中的一個變量)
mydf = mydf.drop([ 'League', 'Division', 'NewLeague', 'League_N', 'Division_W', 'NewLeague_N'], axis = 1)# 前5行展示mydf.head()

上面的數據集清洗完畢,展現的是乾淨數據的前5行信息,下面要基於這個數據集進行建模。建模之前還需要將數據集拆分為兩部分,一部分用於建模,另一部分用於模型的測試

# 將數據集拆分成訓練集和測試集
predictors = list(mydf.columns)predictors.remove('Salary') # Salay變量為因變量,故需要排除

X_train, X_test, y_train, y_test = train_test_split(mydf[predictors],mydf['Salary'], train_size = 0.8, random_state = 1234 )

# 通過不確定的alphas值,生成不同的嶺回歸模型
alphas = 10**np.linspace(-3,3,100)ridge_cofficients = []

for alpha in alphas:    ridge = Ridge(alpha = alpha, normalize=True)    ridge.fit(X_train, y_train)    ridge_cofficients.append(ridge.coef_)

# 繪製alpha的對數與回歸係數的關係
# 中文亂碼和坐標軸負號的處理
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']plt.rcParams['axes.unicode_minus'] = False
# 設置繪圖風格
plt.style.use('ggplot')
plt.plot(alphas, ridge_cofficients)plt.xscale('log')plt.axis('tight')plt.title('alpha係數與嶺回歸係數的關係')plt.xlabel('Log Alpha')plt.ylabel('Cofficients')plt.show()

從上面的圖形結果來看,alpha在10附近時,所有的自變量係數基本趨於穩定(但也不能完全確定是這個值)。接下來,我們採用交叉驗證(CV)方法確定最佳的lambda值。

基於CV選擇lambda值

# 為了找到最佳的lambda值,我們採用交叉驗證方法

# 嶺回歸模型的交叉驗證
ridge_cv = RidgeCV(alphas = alphas, normalize=True, scoring='mean_squared_error', cv = 10)ridge_cv.fit(X_train, y_train)
# 取出最佳的lambda值ridge_best_alpha = ridge_cv.alpha_ridge_best_alpha

      

不出所料,得到的lambda值確實在10附近,這裡最佳的lambda值為10。下面,我們要基於這個最佳的lambda值進入嶺回歸模型的創建和模型驗證的階段。

# 基於最佳的lambda值建模
ridge = Ridge(alpha = ridge_best_alpha, normalize=True)ridge.fit(X_train, y_train)
# 嶺回歸係數
ridge.coef_

# 預測
ridge_predict = ridge.predict(X_test)
# 預測效果驗證
RMSE = np.sqrt(mean_squared_error(y_test,ridge_predict))RMSE

經過模型的驗證,得到的RMSE為319.9。接下來,我們利用同樣的邏輯,對比一下LASSO回歸模型的效果。

LASSO回歸

# 通過不確定的alphas值,生成不同的LASSO回歸模型
alphas = 10**np.linspace(-3,3,100)lasso_cofficients = []

for alpha in alphas:    lasso = Lasso(alpha = alpha, normalize=True, max_iter=10000)    lasso.fit(X_train, y_train)    lasso_cofficients.append(lasso.coef_)

# 繪製alpha的對數與回歸係數的關係# 中文亂碼和坐標軸負號的處理
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']plt.rcParams['axes.unicode_minus'] = False
# 設置繪圖風格
plt.style.use('ggplot')
plt.plot(alphas, lasso_cofficients)plt.xscale('log')plt.axis('tight')plt.title('alpha係數與LASSO回歸係數的關係')plt.xlabel('Log Alpha')plt.ylabel('Cofficients')plt.show()

從圖形結果來看,lambda值應該在1附近,此時LASSO回歸的係數也基本趨於穩定(但也不能完全確定是這個值)。同樣,我們利用CV方法,來尋找最佳的lambda值。

基於CV選擇lambda值

# LASSO回歸模型的交叉驗證
lasso_cv = LassoCV(alphas = alphas, normalize=True, cv = 10, max_iter=10000)lasso_cv.fit(X_train, y_train)
# 取出最佳的lambda值
lasso_best_alpha = lasso_cv.alpha_lasso_best_alpha

      

通過CV方法得到的lambda結果是0.23,這與與我們看圖得到的1這個值還是有一點差異的。下面,我們就基於交叉驗證得到的最佳lambda值重新構造LASSO回歸模型。

# 基於最佳的lambda值建模
lasso = Lasso(alpha = lasso_best_alpha, normalize=True, max_iter=10000)lasso.fit(X_train, y_train)
# 嶺回歸係數lasso.coef_

# 預測
lasso_predict = lasso.predict(X_test)
# 預測效果驗證
RMSE = np.sqrt(mean_squared_error(y_test,lasso_predict))RMSE

      

對LASSO回歸模型進行驗證發現得到的RMSE更小,說明LASSO回歸模型的擬合效果會更貼近於Hitters數據集的原貌。

      上面的內容是基於Python工具對嶺回歸模型和LASSO回歸模型的實戰,接下來,我們再利用R語言對上面的過程再作一次復現,希望對R語言感興趣的朋友能夠有幫助。

R語言對比

      由於上面的邏輯我們已經通過Python進行了一一說明,這裡就不再贅述,只給出R語言代碼僅供參考。

# 加載第三方包
library(caret)
library(glmnet)
library(ISLR)

# 啞變量處理
dummies <- dummyVars(~League+Division+NewLeague, data = Hitters)dummies <- predict(dummies, newdata = Hitters)
# 數據合併
Hitters_dummy <- cbind(Hitters, dummies)

# 刪除缺失值
Hitters_dummy <- na.omit(Hitters_dummy)
# 刪除不必要的變量
Hitters_dummy <- subset(Hitters_dummy,                       select = -c(League,Division,NewLeague,League.N,Division.W,NewLeague.N))head(Hitters_dummy)

# 構建訓練集和測試集set.seed(1)index <- sample(1:nrow(Hitters_dummy), size = 0.8*nrow(Hitters_dummy))train <- Hitters_dummy[index,]test <- Hitters_dummy[-index,] # 繪製lambda值與嶺回歸係數的關係
fit_ridge <-  glmnet(x = as.matrix(train[,-17]), y = train[,17], alpha = 0)plot(fit_ridge,xvar = 'lambda',label = T)

# 嶺回歸的交叉驗證,確定最佳的lambda值
fit_ridge_cv <- cv.glmnet(x = as.matrix(train[,-17]), y = train[,17], alpha = 0)best_lambda_ridge <- fit_ridge_cv$lambda.minbest_lambda_ridge

# 根據最佳lambda構建嶺回歸模型
fit_ridge <- glmnet(x = as.matrix(train[,-17]), y = train[,17], alpha = 0)coeff_ridge <- predict(fit_ridge, s = best_lambda_ridge, type = 'coefficients')coeff_ridge

# 模型評估
pred_ridge <- predict(fit_ridge, s = best_lambda_ridge, newx = as.matrix(test[,-17]))RMSE <- sqrt(mean((test$Salary-pred_ridge)**2))RMSE

# 繪製lambda值與LASSO回歸係數的關係
fit_lasso <-  glmnet(x = as.matrix(train[,-17]), y = train[,17], alpha = 1)plot(fit_lasso,xvar = 'lambda',label = T)

# 嶺回歸的交叉驗證,確定最佳的lambda值
fit_lasso_cv <- cv.glmnet(x = as.matrix(train[,-17]), y = train[,17], alpha = 1)best_lambda_lasso <- fit_lasso_cv$lambda.minbest_lambda_lasso

# 根據最佳lambda構建嶺回歸模型
fit_lasso <- glmnet(x = as.matrix(train[,-17]), y = train[,17], alpha = 1)coeff_lasso <- predict(fit_lasso, s = best_lambda_lasso, type = 'coefficients')coeff_lasso

# 模型評估
pred_lasso <- predict(fit_lasso, s = best_lambda_lasso, newx = as.matrix(test[,-17]))RMSE <- sqrt(mean((test$Salary-pred_lasso)**2))RMSE

結語

      OK,今天關於嶺回歸和LASSO回歸的實戰部分就介紹到這裡,希望對數據挖掘或機器學習的朋友有所幫助,同時,也希望讀者能夠靜下心來好好的復現一遍。如果你有任何問題,歡迎在公眾號的留言區域表達你的疑問。同時,也歡迎各位朋友繼續轉發與分享文中的內容,讓更多的朋友學習和進步

連結: https://pan.baidu.com/s/1qYOGuc8 密碼: xb3r

Python愛好者社區歷史文章大合集

Python愛好者社區歷史文章列表(每周append更新一次)

福利:文末掃碼立刻關注公眾號,「Python愛好者社區」,開始學習Python課程:

關注後在公眾號內回復課程即可獲取:

0.小編的Python入門視頻課程!!!

1.崔老師爬蟲實戰案例免費學習視頻。

2.丘老師數據科學入門指導免費學習視頻。

3.陳老師數據分析報告製作免費學習視頻。

4.玩轉大數據分析!Spark2.X+Python 精華實戰課程免費學習視頻。

5.丘老師Python網絡爬蟲實戰免費學習視頻。

相關焦點

  • 從零開始學Python【25】--嶺回歸及LASSO回歸(實戰部分)
    往期回顧從零開始學Python【24】--嶺回歸及LASSO回歸(理論部分)
  • 從零開始學Python數據分析【27】--Logistic回歸(實戰部分)
    作者:劉順祥個人微信公眾號:每天進步一點點2015前文傳送門:從零開始學Python數據分析
  • 線性回歸的正則化 ——嶺回歸與LASSO回歸
    = load_boston()x_train, x_test, y_train, y_test = train_test_split( boston_sample.data, boston_sample.target, test_size=0.25,random_state=123)ridge = Ridge()ridge.fit(x_train, y_train)print('嶺回歸係數:'
  • 從零開始學Python數據分析【21】--線性回歸(實戰部分)
    從零開始學Python數據分析【1】--數據類型及結構從零開始學Python數據分析【2】-- 數值計算及正則表達式從零開始學Python數據分析【3】-- 控制流與自定義函數從零開始學Python數據分析【4】-- numpy從零開始學Python數據分析【5】-- pandas(序列部分)從零開始學Python數據分析
  • 從零開始學Python【27】--Logistic回歸(實戰部分)
    往期精彩回顧從零開始學Python【26】--Logistic回歸(理論部分)從零開始學Python【25】--嶺回歸及
  • Python 機器學習算法實踐:嶺回歸和LASSO
    如果數據的特徵中存在兩個相關的變量,即使並不是完全線性相關,但是也會造成矩陣求逆的時候造成求解不穩定。當數據特徵比數據量還要多的時候, 即m<n, 這時候矩陣XX是一個矮胖型的矩陣,非滿秩。對於上面的兩種情況,我們需要對最初的標準線性回歸做一定的變化使原先無法求逆的矩陣變得非奇異,使得問題可以穩定求解。我們可以通過縮減的方式來處理這些問題例如嶺回歸和LASSO.
  • 從零開始學Python數據分析【22】--線性回歸診斷(第一部分)
    從零開始學Python數據分析【1】--數據類型及結構從零開始學Python數據分析【2】-- 數值計算及正則表達式從零開始學Python數據分析【3】-- 控制流與自定義函數從零開始學Python數據分析【4】-- numpy從零開始學Python數據分析【5】-- pandas(序列部分)從零開始學Python數據分析
  • 線性回歸進階——嶺回歸和lasso回歸
    詳細可以看之前的一篇推送:    而我們今天要分享大家的是:lasso 回歸和嶺回歸(ridge regression),這兩種回歸方式其實就是在標準線性回歸的基礎上分別加入不同的正則化矯正而已(regularization)。    對於普通線性模型:    它的損失函數是:
  • Stata: 拉索回歸和嶺回歸 (Ridge, Lasso) 簡介
    「不顯著」是很多跑回歸的人的痛處,但有時不顯著並非是故事本身的原因,而是多重共線性導致的。多元分析中,當兩個或更多的變量出現相關的時候,就有可能出現多重共線性問題。一般的多重共線性並不影響估計,但高度的共線性會使估計的方差膨脹,t 值縮水,導致統計推斷失效。本文介紹了兩種經典的篩選變量、應對多重共線性的參數方法,「Ridge 回歸」和「Lasso 回歸」。
  • 前沿: Lasso, 嶺回歸, 彈性網估計在軟體中的實現流程和示例解讀
    文章的後半部分比較了「嶺回歸」(ridge regression)、「lasso」和「彈性網」(the elastic net)的預測情況,附錄部分提供了K折交叉驗證(k-fold cross-validation)的步驟。
  • 機器學習算法之嶺回歸、Lasso回歸和ElasticNet回歸
    正則化嶺回歸與Lasso回歸的出現是為了解決線性回歸出現的過擬合以及在通過正規方程方法求解過大),在目標函數上圖中左邊為Lasso回歸,右邊為嶺回歸。的模做約束,使得它的數值會比較小,很大程度上減輕了overfitting的問題。這裡的
  • 拉索回歸:拉索開心讀懂-Lasso入門
    簡單來講,先採用 Lasso 回歸篩選模型自變量,再採用無懲罰項的模型進行回歸,這種方法的結果會作為各種模型結果對比的參照,且此方法也可簡單用於變量的篩選。2.2 從 Lasso 到彈性網回歸Lasso 回歸與嶺回歸回歸相比雖然達到了變量選擇的目的,但是也有一定的局限性。
  • Ridge 回歸和 Lasso 回歸的完整教程
    為便於分析,我們將所有結果保存在 pandas 數據框中,並繪製 6 個模型以了解趨勢。隨著模型複雜度的增加,模型傾向於在訓練數據集中適應甚至更小的偏差。雖然這會導致過度擬合,但我們暫時擱置這個問題並達到我們的主要目標,即對係數大小的影響。這可以通過查看上面創建的數據框來分析。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    本課程為python教程大合集,包含python所有就業方向,每套課程均來自市面上主流培訓機構的原版教程,價值都在數百元以上 每套課程均包含:視頻課程+課件+原始碼 重要:建議根據自己工作方向和需求,重點選擇2到3套課程學精,吃透,然後在工作 重要:零基礎小白建議先選擇零基礎全能篇的一套課程學精
  • 從零開始學Python數據分析【15】-- matplotlib(散點圖)
    作者:劉順祥個人微信公眾號:每天進步一點點2015前文傳送門:從零開始學Python數據分析
  • 從零開始學Python【30】--DBSCAN聚類(理論部分)
    往期經典回顧從零開始學Python【29】--K均值聚類(實戰部分)從零開始學
  • 手把手帶你畫高大上的lasso回歸模型圖
    各位芝士好友,今天我們來聊一聊lasso回歸算法。與預後有關的文章,傳統的做法一般會選擇多變量cox回歸,高級做法自然就是我們今天的lasso分析。
  • 從零開始學Python【22】--線性回歸診斷(第一部分)
    往期回顧從零開始學Python【21】--線性回歸(實戰部分)從零開始學Python【20】--線性回歸(理論部分
  • SPSS方法|嶺回歸分析
    :嶺回歸分析是在構建多重線性回歸模型時, 對基於「最小二乘原理」推導出的估計回歸係數的計算公式作一下校正,使回歸係數更穩定。(2)去掉嶺回歸係數不穩定但隨著 k 值的增加迅速趨於零的自變量。(3)去掉一個或若干個具有不穩定嶺回歸係數的自變量。如果不穩定的嶺回歸係數很多,究竟去掉幾個, 去掉哪幾個, 並無一般原則可遵循。這要結合已找出的復共線性關係以及去掉後重新進行嶺回歸分析的效果來決定。
  • 線性回歸-如何對數據進行回歸分析
    在經過了1078 份數據的分析之後,最終他得出結論:人類的身高維持在相對穩定的狀態,他稱之為回歸效應,並給出了歷史上第一個回歸公式:公式中的 Y 代表子代身高,X 代表父代身高,單位為英寸。n_jobs:用於計算的作業數,只對多重回歸且比較複雜的數據進行加速。接下來,使用 LinearRegression 類對上面表格數據進行擬合。