Bayesian Linear Regression in Python (貝葉斯線性迴歸)(下集)

yuwei
Jacky’s blog
Published in
Feb 18, 2019
source

那讓我們繼續我們Bayesian 線性迴歸應用的內容,在上一篇中,我們提到Bayesian theorem和Bayesian Linear Regression的原理,還有MCMC(Markov Chain Monte Carlo),而這下集,就會說到如何使用pymc3來對Lebron的數據集進行分析

pymc3是目前最棒的機率programming和bayesian推論統計的套件,接下來,因為是bayesian linear regression,所以會採用GLM(Genrated Linear Models)方法來建構我們的線性公式

Model建立如下:

(1)建立一個formula將features和target連結在一起和決定先驗分配

(2)使用MCMC重複取樣

Formula

我們要建立等下Bayesian要用的線性迴歸公式,而公式的表達必須要用R的語法,在y和x之間,用’~’來連結

formula=columns[-1]+' ~ '+(' + '.join([col for col in columns[:-1]])

Model

建立模型要用with這個語法來完成,並首先要對prior,也就是先驗機率來指定分配,再用上面說到的formula來計算出liklihood(似然函數),方法是這樣,最後的sample會隨機抽取指定的迭代次數(draws),抽樣的次數(chains),用來調整的sample(tune),並拋棄tuned的sample,找出每個參數的可能區間,即變量的可能範圍

首先先看每個參數的統計資料

pm.summary(normal_trace)

根據後驗機率sample出來的paramter會被構成一個置信區間,和我們所學過的信賴區間其實很相似,都是在95%信心下數字出現的機率

我們用圖片來檢驗sample出來的參數長什麼樣

HPD是highest posterior density,是指最高後驗機率密度,如同在頻率學派下的confidence level,而這區間又稱為參數的credible interval,在credible interval下,通常都認定後驗分布為一個高斯分布

我們可以先驗分配的每個參數圖表和其統計資料作出以下可能讓你想也想不到的統計推論:

  1. 籃板和犯規對得分有正的權重
  2. 助攻對得分有負的權重

summary表內的sd和hpd 限制都給了我們該對features參數有多大的信心,舉例來說,火鍋從-0.183到0.996代表我們不是非常確定火鍋對模型是positive還是negative,而在row上的sd是來自target不穩定的程度, 這個標準差我們就高達了7.762,一部分也是來自於樣本過小,無法給予模型足夠的訓練

trace可以解釋成痕跡,遺跡的意思,將當時候sample出來parameter value儲存於normal_trace變數裡,這個trace對這個bayesian model極為重要,因為它包含了一切我們拿來做統計推論的資訊

traceplot給了我們在抽樣時發生的情況,左邊是指model參數的事後分配,而左邊的圖則是指sample的過程參數的value的狀況,有兩個顏色是因為抽樣的次數是兩次

如同之前說過的頻率學派的linear regression一樣,我們用bayesian時是得出了參數的後驗分配,我們得到的是一個range的值而不是像之前那樣求得一個單一固定的參數值,那我們要怎麼bayesian求得那個合理的參數值呢?就是求那串range的平均數,用參數的平均數搭配上實際的資料就可以得出最終的target值

for variable in normal_trace.varnames:
print(f'Variable:{variable:15} mean weight:{np.mean(normal_trace[variable]):.4f}')

有了參數之後,我們就用它來合併成一個線性方程式吧

model_formula = 'PTS ='
for i in normal_trace.varnames:
model_formula += '%.2f * %s + ' % (np.mean(normal_trace[i]), i)
print(model_formula)

那有了公式之後,我們就可以把這個bayesian linear regression的公式放入眾多模型之中一起討論了,我也再多寫一個function,如果你有興趣,請務必來我的github參訪一下,上面會有詳盡的code給你做使用,在這邊我就單純的把比較之後圖片放上來就好

雖然整體的表現沒有比Gradient Boost來得好,但是如果這個bayesian演算法能夠幫助你看出每個特徵對targets的正負影響,也能預測出具備不錯效力的target,你在真正執行的時候,是可以考慮用一下這個演算法的

如果我們想要預測target的可能range,首先要找到一個資料中的一個row,並用row搭配求得的參數產生一個normal distribution,藉由將平均參數*(data point)來求出並把其當作normal distribution的平均和使用剛剛pm.summary有出現的sd當作normal distribution的standard deviation

好現在就讓我們來隨機選定一個row,看看模型的表現如何

test_model(normal_trace,x_test.iloc[59])

可以看出,其實預測值和真實值差距並不大,但是前後5%的數值卻差距很大,表示在比賽中,Lebron的數據表現並沒有這麼集中,從剛剛方程式的參數可以看出來,大部分預測的數值都是落在intercept上,因為特徵對target來說,不確定太大,我們無法有效推測出正確的數值,透過bayesian求出target的區間是最好的選擇,讓我們再看一個例子

看吧,這個就落差有點大,但我們可以合理推測出這個區間對企業來講幫助非常巨大

Interpret Variable Effects

每個特徵對target的效果都是不一樣的,透過改變單一特徵,和保持其他特徵不變的情況下,看出該特徵對target是有正面或負面的影響,還是無法判斷對target的影響,隨機sample出100個parameter,並將各個組成linear regression,並指定特徵,評估特徵的變化帶給target的影響

for column in df.drop(columns='PTS').columns:
model_effect(column, normal_trace, x_train.drop(columns='PTS'))

這就是分別調整各特徵的value值下,得分變動的方向,跟我們一開始根據pm.summary所做的推論類似,隨著籃板或犯規的增加,會使得得分也跟著增加,而助攻的增加,竟然會使得得分減少,確實出乎人意料之外,但你仔細想想,當你的助攻增加,表示你分球的情形也必須增加,出手的次數相對也會帶來減少,這個情況適用於Lebron,但對於其他人不一定有同等的效果。

結論

Bayesian給了我們可以更加解釋模型的意義,給參數一個範圍,讓我們能夠考慮到這個可能,對的,數據也不一定能保持常態分配,有可能是會變成其他的分配,關於這個部分,我之後會再寫其他文章來探討這個問題。

一樣,非常歡迎你們給我的回饋,我也會繼續努力的,有問題的話,請寄信到我的email: jacky308082@gmail.com來詢問,謝謝!

--

--

yuwei
Jacky’s blog

Curious Data scientist. Strong Lebron James’s fan. #StriveForGreatness #JustAKidFromTaiwan https://www.linkedin.com/in/yu-wei-chung/