熱線電話:13121318867

登錄
首頁大數據時代原理+代碼|Python實戰多元線性回歸模型
原理+代碼|Python實戰多元線性回歸模型
2020-08-05
收藏

線性回歸就是利用數理統計中回歸分析,來確定兩種或兩種以上變量間相互依賴的定量關系的一種統計分析方法,運用十分廣泛。我們在機器學習過程中也經常會遇到構建線性回歸模型的場景,對于初學者來說還是比較困難的。今天小編就給大家分享一篇關于python實戰線性回歸模型的文章,希望對于大家python的學習和使用,以及線性回歸模型的構建有所幫助。

文章來源: 早起Python

作者:蘿卜

前言

「多元線性回歸模型」非常常見,是大多數人入門機器學習的第一個案例,盡管如此,里面還是有許多值得學習和注意的地方。其中多元共線性這個問題將貫穿所有的機器學習模型,所以本文會「將原理知識穿插于代碼段中」,爭取以不一樣的視角來敘述和講解「如何更好的構建和優化多元線性回歸模型」。主要將分為兩個部分:

  • 詳細原理
  • Python 實戰

Python 實戰

Python 多元線性回歸的模型的實戰案例有非常多,這里雖然選用的經典的房價預測,但貴在的流程簡潔完整,其中用到的精度優化方法效果拔群,能提供比較好的參考價值。

數據探索

本文的數據集是經過清洗的美國某地區的房價數據集

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv('house_prices.csv')
df.info();df.head()

參數說明:

  • neighborhood/area:所屬街區和面積
  • bedrooms/bathrooms:臥室和浴室
  • style:房屋樣式

多元線性回歸建模

現在我們直接構建多元線性回歸模型

from statsmodels.formula.api import ols
                      # 小寫的 ols 函數才會自帶截距項,OLS 則不會
         # 固定格式:因變量 ~ 自變量(+ 號連接)
lm = ols('price ~ area + bedrooms + bathrooms', data=df).fit()
lm.summary()

紅框為我們關注的結果值,其中截距項Intercept的 P 值沒有意義,可以不用管它

模型優化

從上圖可以看到,模型的精度較低,因為還有類別變量neighborhood和style沒有完全利用。這里我們先查看一下類別變量的類別分布情況:

# 類別變量,又稱為名義變量,nominal variables
nominal_vars = ['neighborhood', 'style']

for each in nominal_vars:
    print(each, ':')
    print(df[each].agg(['value_counts']).T)  # Pandas 騷操作
    # 直接 .value_counts().T 無法實現下面的效果
     ## 必須得 agg,而且里面的中括號 [] 也不能少
    print('='*35)

虛擬變量的設置

因為類別變量無法直接放入模型,這里需要轉換一下,而多元線性回歸模型中類別變量的轉換最常用的方法之一便是將其轉化成虛擬變量。原理其實非常簡單,將無法直接用于建模的名義變量轉換成可放入模型的虛擬變量的核心就短短八個字:「四散拆開,非此即彼」。下面用一個只有 4 行的微型數據集輔以說明。

從上表中,不難發現:

  • 該名義變量有 n 類,就能拆分出 n 個虛擬變量
  • 巧妙的使用 0 和 1 來達到「用虛擬變量列代替原名義變量所在類別」

接下來要做的就是將生成的虛擬變量們放入多元線性回歸模型,但要注意的是:「轉化后的虛擬變量們需要舍棄一個」,才能得到滿秩矩陣。具體原因和有關線性代數的解釋可以查看筆者打包好的論文,我們可以理解為,當該名義變量可劃分為 n 類時,只需要 n-1 個虛擬變量就已足夠獲知所有信息了。該丟棄哪個,可根據實際情況來決定。

因此為原數據集的某名義變量添加虛擬變量的步驟為:

  • 抽出希望轉換的名義變量(一個或多個)
  • pandas的get_dummies函數
  • 與原數據集橫向拼接

注意虛擬變量設置成功后,需要與原來的數據集拼接,這樣才能將其一起放進模型。

再次建模后,發現模型精度大大提升,但潛在的多元共線性問題也隨之顯現出來

在解釋模型中虛擬變量的系數之前,我們先消除模型中多元共線性的影響,因為在排除共線性后,模型中的各個自變量的系數又會改變,最終的多元線性回歸模型的等式又會不一樣。多重線性回歸模型的主要假設之一是我們的預測變量(自變量)彼此不相關。我們希望預測變量(自變量)與反應變量(因變量)相關,而不是彼此之間具有相關性。方差膨脹因子(Variance Inflation Factor,以下簡稱VIF),是「指解釋變量之間存在多重共線性時的方差與不存在多重共線性時的方差之比」

上圖公式可以看出在方差膨脹因子的檢測中:

  • 每個自變量都會有一個膨脹因子值 ,最后根據值的大小來選擇是否刪減
  • 「既然  表示相關性,是誰跟誰的相關性呢?」 是自變量中的某一變量與除它外剩余的自變量進行多元線性回歸,取回歸結果,即模型精度來作為這個變量與剩余自變量的相關性。聽起來可能有點繞,這里舉一下實例(用 “面積、臥室數量和浴室數量” 作為自變量來預測房價,在進行自變量的方差膨脹因子的檢測時,面積、臥室數和浴室數輪流做單獨的因變量,剩下的兩個變量作為自變量,來看看這三個自變量中那個變量對其余兩個變量的解釋性高)
  •  越大,如已經到了 0.9,那分母就很小, 的值就等于 10,即表示這個自變量已經同時解釋了另外的某個或多個自變量,存在多元共線性,可以考慮刪除一些自變量。

 越大,顯示共線性越嚴重。經驗判斷方法表明:「當 ,不存在多重共線性;當 ,存在較強的多重共線性;當 ,存在嚴重多重共線性」。

方差膨脹因子的檢測

我們自己來寫一個方差膨脹因子的檢測函數

def vif(df, col_i):
    """
    df: 整份數據
    col_i:被檢測的列名
    """
    cols = list(df.columns)
    cols.remove(col_i)
    cols_noti = cols
    formula = col_i + '~' + '+'.join(cols_noti)
    r2 = ols(formula, df).fit().rsquared
    return 1. / (1. - r2)

現在進行檢測

test_data = results[['area', 'bedrooms', 'bathrooms', 'A', 'B']]
for i in test_data.columns:
    print(i, '\t', vif(df=test_data, col_i=i))

發現bedrooms和bathrooms存在強相關性,可能這兩個變量是解釋同一個問題,方差膨脹因子較大的自變量通常是成對出現的。

果然,bedrooms和bathrooms這兩個變量的方差膨脹因子較高,這里刪除自變量bedrooms再次進行建模

lm = ols(formula='price ~ area + bathrooms + A + B', data=results).fit()
lm.summary()

模型精度稍降,但消除了多元共線性后能夠使模型的泛化能力提升。再次進行多元共線性檢測

test_data = results[['area', 'bedrooms', 'A', 'B']]
for i in test_data.columns:
    print(i, '\t', vif(df=test_data, col_i=i))

那么多元共線性就「只有通過方差膨脹因子才能看的出來嗎?」 其實并不一定,通過結合散點圖或相關稀疏矩陣和模型中自變量的系數也能看出端倪。下圖是未處理多元共線性時的自變量系數。

可以很明顯的看出,bathrooms的參數很可能是有問題的,怎么可能bathrooms的數據量每增加一個,房屋總價還減少 1.373*10 的四次方美元呢?簡單的畫個散點圖和熱力圖也應該知道房屋總價與bathrooms 個數應該是成正比例關系的。

模型解釋

多元線性回歸模型的可解釋性比較強,將模型參數打印出來即可求出因變量與自變量的關系

所以最終的建模結果如下,且該模型的精度為0.916

另外在等式結果中,截距項Intercept和area,bedrooms等變量的系數都還好理解;A,B 這兩個虛擬變量可能相對困難些。其實根據原理部分的表格來看,如果房屋在 C 區,那等式中 A 和 B 這兩個字母的值便是 0,所以這便引出了非常重要的一點:使用了虛擬變量的多元線性回歸模型結果中,存在于模型內的虛擬變量都是跟被刪除掉的那個虛擬變量進行比較。所以這個結果便表示在其他情況完全一樣時(即除虛擬變量外的項)A 區的房屋比 C 區低 8707.18 美元,B 區則比 C 區貴 449896.73.7 美元。當然我們也可以畫個箱線圖來查看與檢驗,發現結果正如模型中 A 與 B 的系數那般顯示。

小結

本文以多元線性回歸為基礎和前提,在因變量房價與多個自變量的實際觀測值建立了多元線性回歸模型;分析并檢驗各個預測變量對因變量的綜合線性影響的顯著性,并盡可能的消除多重共線性的影響,篩選出因變量有顯著線性影響的自變量,對基準模型進行優化,并對各自變量相對重要性進行評定,進而提升了回歸模型的預測精度。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢