原理+代碼|Python實戰多元線性回歸模型

2020-12-14 CDA數據分析師

文章來源: 早起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 的係數那般顯示。

小結

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

相關焦點

  • Python 實戰多元線性回歸模型,附帶原理+代碼
    來源 | 早起Python( ID:zaoqi-python )「多元線性回歸模型」非常常見,是大多數人入門機器學習的第一個案例,儘管如此,裡面還是有許多值得學習和注意的地方。其中多元共線性這個問題將貫穿所有的機器學習模型,所以本文會「將原理知識穿插於代碼段中」,爭取以不一樣的視角來敘述和講解「如何更好的構建和優化多元線性回歸模型」。主要將分為兩個部分:
  • 用 Python 進行多元線性回歸分析(附代碼)
    很多人在做數據分析時會經常用到一元線性回歸,這是描述兩個變量間統計關係的最簡單的回歸模型。但現實問題中,我們往往會碰到多個變量間的線性關係的問題,這時就要用到多元線性回歸,多元線性回歸是一元回歸的一種推廣,其在實際應用中非常廣泛,本文就用python代碼來展示一下如何用多元線性回歸來解決實際問題。圖1.
  • 模型之母:多元線性回歸
    0x00 前言 在線性回歸的前3篇中,我們介紹了簡單線性回歸這種樣本只有一個特徵值的特殊形式,並且了解了一類機器學習的建模推導思想,即:然後通過最優化損失函數或者效用函數,獲得機器學習的模型。然後我們推導並實現了最小二乘法,然後實現了簡單線性回歸。最後還以簡單線性回歸為例,學習了線性回歸的評價指標:均方誤差MSE、均方根誤差RMSE、平均絕對MAE以及R方。
  • Python 機器學習:多元線性回歸
    python機器學習:線性回歸往下講,這篇文章要講解的多元線性回歸。1、什麼是多元線性回歸模型?當y值的影響因素不唯一時,採用多元線性回歸模型。例如商品的銷售額可能不電視廣告投入,收音機廣告投入,報紙廣告投入有關係,可以有 sales =β0+β1*TV+β2* radio+β3*newspaper.
  • 機器學習之多元線性回歸模型梯度下降公式與代碼實現(篇二)
    上一篇我們介紹了線性回歸的概述和最小二乘的介紹,對簡單的一元線性方程模型手推了公式和python代碼的實現。機器學習之線性回歸模型詳細手推公式與代碼實現(篇一)今天這一篇來介紹多元線性回歸模型多元線性回歸模型介紹在回歸分析中,如果有兩個或兩個以上的自變量,就稱為多元回歸
  • python機器學習--線性回歸
    python機器學習--線性回歸線性回歸是最簡單的機器學習模型,其形式簡單,易於實現,同時也是很多機器學習模型的基礎。對於一個給定的訓練集數據,線性回歸的目的就是找到一個與這些數據最吻合的線性函數。針對線性回歸算法在之前的數模案例也有涉及喔,歡迎去看看上一篇博客數學建模預測模型實例--大學生體測數據模型在這裡插入圖片描述OLS線性回歸Ordinary Least Squares 最小二乘法一般情況下,線性回歸假設模型為下,其中w為模型參數
  • Python中線性回歸的完整指南
    因此假設線性關係,如果特徵X可以解釋(預測)目標,則比例高並且R 2值將接近1.如果相反,則R 2值接近0。 多元線性回歸理論在現實生活中,永遠不會有一個功能來預測目標。那麼一次對一個特徵進行線性回歸嗎?當然不是。只需執行多元線性回歸。
  • spss多元線性回歸模型 - CSDN
    多元線性回歸,主要是研究一個因變量與多個自變量之間的相關關係,跟一元回歸原理差不多,區別在於影響因素(自變量)更多些而已,例如:一元線性回歸方程 為:毫無疑問,多元線性回歸方程應該為:上圖中的 x1,  x2, xp分別代表「自變量」Xp截止,代表有P個自變量
  • python多重線性回歸分析
    python多重線性回歸分析多重線性回歸分析定義多重線性回歸模型:Mulitiple Linear Regression多元線性回歸模型:MultivariateLinear Regression數據準備#多重線性回歸#數據準備import pandas as pddf=pd.read_csv('e:/python/out/corr.csv',encoding='utf8')df根據預測目標,確定自變量和因變量#多重線性回歸
  • SPSS實戰案例之多元線性回歸
    」-->「), Zscore(原油消費量), Zscore(煤炭消費量), Zscore(焦炭產量).模型平方和df均方F1回歸25.66064.27745.397殘差2.07222.094總計27.73228(表
  • 機器學習:回歸分析——多元線性回歸分析
    我們把包括兩個或兩個以上自變量的回歸稱為多元線性回歸。生活中的現象常常是與多個因素相聯繫的,由多個自變量的最優組合共同來預測或估計因變量,比只用一個自變量進行預測或估計更有效,更符合實際。所以相比一元線性回歸,多元線性回歸的實際意義更大。
  • 使用單行代碼評估回歸模型的Python包
    對此的一個內聯嘗試是python包「 regressormetricgraphplot」的開發,該軟體包旨在幫助用戶使用單行代碼繪製評估指標圖,以針對不同的廣泛使用的回歸模型指標進行一目了然的比較。使用該實用程序包,還可以通過將其應用於日常的預測回歸問題,顯著降低從業人員以業餘方式評估不同機器學習算法的障礙。
  • 深度學習模型速成,三分鐘解決經典線性回歸模型(附完整代碼)
    每天給小編五分鐘,小編用自己的代碼,帶你輕鬆學習人工智慧!本文將會帶你做完一個深度學習進階項目,讓你熟練掌握線性回歸這一深度學習經典模型,然後在此基礎上,小編將在下篇文章帶你通過此模型實現對股票漲幅的預測。野蠻智能,小白也能看懂的人工智慧。線性回歸乾貨快遞點:線性回歸是什麼?
  • python線性回歸
    一.理論基礎1.回歸公式  對於單元的線性回歸,我們有:f(x) = kx + b 的方程(k代表權重,b代表截距)。
  • Logistic和Softmax回歸實戰(附代碼)
    Logistic回歸是一種常用的處理二分類問題的模型,Softmax回歸常用於處理多分類問題。本文主要實戰Logistic回歸和softmax回歸在iris數據集上的應用,通過該文章,希望我們能一起掌握該方面的知識。歡迎文末查看下載關鍵字,公眾號回復即可免費下載實戰代碼。
  • spss多元線性回歸模型專題及常見問題 - CSDN
    多元線性回歸,主要是研究一個因變量與多個自變量之間的相關關係,跟一元回歸原理差不多,區別在於影響因素(自變量)更多些而已,例如:一元線性回歸方程 為:    毫無疑問,多元線性回歸方程應該為:那麼,多元線性回歸方程矩陣形式為:
  • 多元線性回歸的模型解釋、假設檢驗、特徵選擇
    線性回歸是最流行和討論最多的模型之一,它無疑是深入機器學習(ML)的入門之路。這種簡單、直接的建模方法值得學習,這是進入ML的第一步。在繼續討論之前,讓我們回顧一下線性回歸可以大致分為兩類。簡單線性回歸:當只有一個輸入變量時,它是線性回歸最簡單的形式。
  • 用Python實現線性回歸,8種方法哪個最高效?
    即便往前推10年,SVM、boosting等算法也能在準確率上完爆線性回歸。那麼,為什麼我們還需要線性回歸呢?一方面,線性回歸所能夠模擬的關係其實遠不止線性關係。線性回歸中的「線性」指的是係數的線性,而通過對特徵的非線性變換,以及廣義線性模型的推廣,輸出和特徵之間的函數關係可以是高度非線性的。
  • 多元線性回歸、逐步回歸、邏輯回歸的總結
    需要的用到的知識儲備:下面分別從普通多元線性回歸、逐步回歸、邏輯回歸進行介紹。前面用Python實現的只是一元回歸,由於R語言實現線性回歸很方便,所以我會著重介紹原理。多元線性回歸不論是單變量還是多元線性回歸分析,他們都是直接或間接(有時候需要通過變量代換)程線性的關係。
  • 零基礎的同學如何用stata做多元線性回歸模型?
    上一期,我們分享了如何用stata做一元線性回歸模型,不知道同學們學的怎麼樣呢?有沒有自己動手操作一遍呢?這一期:我們將學習如何用stata做多元線性回歸模型!這些是小王(邀請者)最近學習計量時的一些心得和體會,希望能與大家一起分享。