1. 程式人生 > >多項式迴歸:向線性模型新增非線性

多項式迴歸:向線性模型新增非線性

作者:chen_h
微訊號 & QQ:862251340
微信公眾號:coderpai

介紹

在這篇文章中,我們將學習如何解決線性模型的關鍵問題,即線性假設。我們將看一下線性迴歸,這是一種基礎統計學習技術,瞭解模型引擎下發生的事情,然後更多的瞭解模型的一些弱點。然後,我們將引入多項式迴歸的思想作為線性模型關鍵弱點的解決方案,即本文中提出的一種線性迴歸。

讓我們回顧一下線性迴歸

線性迴歸是一種機器學習技術,它允許我們將一個或者多個解釋變數與自變數或者響應變數進行關聯。線上性迴歸中,我們希望預測實際的數值。

與所有機器學習模型一樣,我們試圖近似 f(x) ,或者準確描述我們的獨立變數和因變數之間關係的函式。指標與交易之間因果關係的建立是所有基於機器學習的交易模型共同的關鍵特徵。在引數模型中,我們通過對函式結構 f(x) 做出一些假設來節省一些時間。線上性迴歸中,我們假設 f(x) 是線性的。

你可以從代數中回想一下,一條線的方程是 y = mx+b,其中 y 是我的響應,m 是斜率或者是微積分中的導數,b 是我的截距或者是當 x 等於零時 y 的值。

簡單線性迴歸方程如下:

y=B0+Bixi+Eiy = B_{0} + B_{i}x_{i} + E_{i}

這裡直線的係數只是採用不同的形式,我嗯新增一個誤差項 EiE_{i} 。誤差項解釋了我們無法建模的噪音或者隨機性。

雖然現在很多的程式包幫助我抽象掉了大量的計算使得我們的生活變得更容易,但是當我們構建基於機器學習的線性迴歸模型時,會發生很多事情。我們的目標是近似我們的係數,B0B_{0} 是我們的截距,B

1B_{1} 是我們的斜率。

一旦我們得到了係數的值,我們就可以將它們插入到我們的線性方程中,這樣我們就可以預測給定 X 值的響應值。但是我們如何找到這些係數呢?

我們的斜率等式如下:

B1=i=1N(yiY)(xiX)i=1N(xiX)2B_{1} = \frac{\sum_{i=1}^{N}(y_{i} - Y)(x_{i} - X)}{\sum_{i=1}^{N}(x_{i} - X)^{2}}

其中 Y 是 y 的平均值,X 是 x 的平均值。

截距 B0B_{0} 的等式如下:

B0=YB

1XB_{0} = Y-B_{1}X

其中 Y 是 y 的平均值,B1B_{1} 是我們預測的斜率,而 X 是我們解釋變數 x 的平均值。

這些計算在 R 和 Python 中使用庫和包時,這些計算都是為我們完成的。像往常一樣,我們在開發模型時遇到的一個關鍵問題是我們的測試結果是否與整個樣本的結果一致。換句話說,這個樣本能代替整個樣本的分佈,還是隻是我們觀察到的純粹的隨機。這是我們的統計假設驗證技巧的用武之地。簡單線性迴歸的檢驗統計量如下:

t=B10SE(B1)t = \frac{B_{1} - 0}{SE(B_{1})}

迴歸假設我們的 x 和 y 變數之間存在某種關係。因此,我們的假設檢驗或我們的 H0H_{0} 的零假設是 B1=0B_{1} = 0 ,我們的替代假設或者 HA 是 H10H_{1} \neq 0 。本質上,零表示我們的斜率為 0,或者我們的變數之間沒有關係。

為了測試這一點,我們計算了 B1B_{1} 與 0 的偏差。在上面的等式中,B1B_{1} 是我們預測的斜率,SE( B1B_{1} ) 是我們斜率的標準誤差。標準誤差是衡量斜率偏差的一種方法。

B1B_{1} 標準誤差的等式如下:

SE(B1)=σ2i=1N(xiX)2SE(B_{1}) = \frac{\sigma^{2}}{\sum_{i=1}^{N}(x_{i} - X)^{2}}

其中,σ2=Var(E)\sigma ^{2} = Var(E) 或者是我們的誤差項的方差。我們使用我們的資料通過下面的等式計算我們的 RSE 或者殘差平方和來估計這個變數:

σ2=RSE=RSS(n2)\sigma^{2} = RSE = \sqrt \frac{RSS}{(n-2)}

其中,n 是觀測數量,RSS 是我們的剩餘平方和。我們的 RSS 可以通過以下等式找到:

RSS=i=1N(Yiyi)2RSS = \sum_{i=1}^{N}(Y_{i} - y_{i})^{2}

其中 YiY_{i} 是響應的實際值,yiy_{i} 是我們對第 i 次資料的預測值。

我們在簡單線性迴歸的檢驗統計量對應於高斯分佈。因此,一旦我們計算了 t-stat,並指定了顯著性水平,我們就可以用來拒絕零假設。請注意,我沒有說我會拒絕或接受 null,這是因為未能拒絕 null 並不一定意味著我們接受 null。我們只是無法在某個顯著性水平或者某個置信區間內拒絕它。

然後我們得到我們的 p 值。我們的 p 值告訴我們,假設零假設為真,我們有多大可能觀察到我們的檢驗統計值大於或者等於我們觀察到的值。換句話說,我們的 p 值告訴我們,假設我們觀察到的 t 統計量,我們的零假設的概率是正確的。它也是最低顯著性水平,我們可以拒絕零假設 H0H_{0}

在某些情況下,我們不會有單個預測變數,都是有多個變數。這些解釋變數可以是定量,變數,也可能是兩者的混合。多元線性迴歸的等式如下:

y=B0+B1x1+B2x2+...+Bnxny=B_{0} + B_{1}x_{1} + B_{2}x_{2} + ……... + B_{n}x_{n}

多元線性迴歸的上述方程類似於我們的初始簡單線性迴歸方程,不同之處在於我們現在每個 x 項都有一個斜率 B1B_{1} 變數。這只是表達了特定 x 和我們的響應 y 之間的關係。

我們的檢驗統計量和分佈也從 t 統計量和高斯分佈變成了 f 統計量和 f 分佈。

讓我們建立一個模型

現在我們已經回顧了線性胡桂,我們可以構建一個模型來進行預測。我們將使用 PNB 資料,我們的目標是預測下一個收盤價。

接下來我們匯入一些需要的庫:

#data analysis and manipulation
import numpy as np
import pandas as pd

#data collection
import pandas_datareader as pdr

#data visualization
import matplotlib.pyplot as plt
import seaborn as sns

之後我們匯入我們的資料:

#setting our testing period
start='2016-01-01'
end='2018-01-01'
pnb=pdr.get_data_yahoo('PNB.NS',start, end)

讓我們看看我們的資料長什麼樣?

pnb.head()
High Low Open Close Volume Adj Close
Date
2016-01-01 117.900002 115.500000 116.000000 117.599998 4070369 117.599998
2016-01-04 117.000000 112.500000 117.000000 112.800003 6341172 112.800003
2016-01-05 113.349998 110.199997 113.000000 110.599998 7271156 110.599998
2016-01-06 111.800003 109.300003 110.949997 109.599998 5910731 109.599998
2016-01-07 108.449997 104.500000 108.099998 105.050003 7497260 105.050003

讓我們看看 PNB 在我們的樣本期間如何表現。

plt.figure(figsize=(10,6))
plt.plot(pnb['Close'])
plt.title('PNB 2016-2018 Performance')
plt.show()

在這裡插入圖片描述

我們現在可以建立解釋變數,用於預測 PNB 的收盤價。我們將使用定量和定性變數的混合。

讓我們將預測變數新增到資料框中。但首先,我們將複製原始資料幀。如果我們將來需要返回並重新初始化我們的資料,這是一個很好的做法。

#making a copy of our data frame
PNB=pnb.copy()
#creating our predictor variables

#Lag 1 Predictor
PNB['Lag 1']=PNB['Close'].shift(1)

#Lag 2 Predictor
PNB['Lag 2']=PNB['Close'].shift(2)

#Higher High Predictor
PNB['Higher High']=np.where(PNB['High'] > PNB['High'].shift(1),1,-1)

#Lower Low Predictor
PNB['Lower Low']=np.where(PNB['Low'] < PNB['Low'].shift(1),1,-1)

現在讓我回顧一下我們的 PNB 資料幀。

PNB.head()
High Low Open Close Volume Adj Close Lag 1 Lag 2 Higher High Lower Low
Date
2016-01-01 117.900002 115.500000 116.000000 117.599998 4070369 117.599998 NaN NaN -1 -1
2016-01-04 117.000000 112.500000 117.000000 112.800003 6341172 112.800003 117.599998 NaN -1 1
2016-01-05 113.349998 110.199997 113.000000 110.599998 7271156 110.599998 112.800003 117.599998 -1 1
2016-01-06 111.800003 109.300003 110.949997 109.599998 5910731 109.599998 110.599998 112.800003 -1 1
2016-01-07 108.449997 104.500000 108.099998 105.050003 7497260 105.050003 109.599998 110.599998 -1 1

現在讓我們從 scikit-learn 匯入我們的線性迴歸模型。

from sklearn.linear_model import LinearRegression

現在我們有了模型,讓我們從 sklearn 匯入我們的 train_test_split 物件。

from sklearn.model_selection import train_test_split

現在我們已經準備好為我們的資料建立訓練和測試集。但首先,讓我們初始化我們的 X 和 y 變數。記住 X 表示我們的預測變數,y 表示我們的響應或者我們實際想要預測的內容。

#creating our predictor variables
X=PNB.drop(['Open','High','Low','Close','Volume','Adj Close'],axis=1)

#initializing our response variable
y=PNB['Close']

現在我們將準備將我們的資料分成訓練集合測試集。

X_train, X_test, y_train, y_test= train_test_split(X,y,test_size=.20, random_state=101)

我們現在有我們的訓練集和測試集。注意,使用上面的 random_state ,這樣當你重新建立此模型時,你將獲得與此處相同的輸出。

我們現在準備適合我們的模型並作出預測。我們將首先初始化我們的模型。

lm=LinearRegression()

現在我們可以將訓練街傳遞給我們的模型。我們必須先在 X_train 集中填充 NaN 值。

#fitting our model to our training data
lm.fit(X_train.fillna(0),y_train)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

現在我們已經將模型與我們的資料相匹配,讓我們使用它來進行預測。我們將 X_test 資料集傳遞給 predict 方法。X_test 是我們的模型沒有看到的資料。

#making predictions
predictions=lm.predict(X_test.fillna(0))

現在我們已經有了預測,我們可以檢查一下我們的模型表現如何。我們希望通過各種不同的方式來評估模型的效能。我們的模型的 R2,R-Squared 告訴我們,我們的響應中的百分比方差,可以用我們的預測器來解釋。我們還想看看我們模型的錯誤。我們的錯誤告訴我們模型偏離實際響應值的程度。我們的目標是建立一個是吸納最低誤差的模型。

我們還可以檢查模型的係數。這些是 xi 值每個特徵的斜率。

#checking our model's coefficients
lm.coef_
array([ 0.93884112,  0.01779704,  0.32920755, -1.89167465])

讓我們得到我們模型的 R2 值。我們將從 sklearn 匯入指標。

from sklearn import metrics
#getting our R-Squared value
print('R-Squared:',metrics.explained_variance_score(y_test,predictions))

R-Squared: 0.987638195799

現在讓我們檢查一下我們的錯誤。我們將檢視我們的MSE,或者均方誤差,MAE 或平均絕對誤差,RMSE 或者均方根誤差。

#printing our errors
print('MSE:',metrics.mean_squared_error(y_test,predictions))
print('MAE:',metrics.mean_absolute_error(y_test,predictions))
print('RMSE:',np.sqrt(metrics.mean_squared_error(y_test,predictions)))
MSE: 11.09225302230123
MAE: 2.485737884039122
RMSE: 3.3305034187493683

現在讓我們繪製我們的實際響應和預測的響應。我們還可以計算殘差或者誤差。

sns.jointplot(predictions,y_test,kind='regplot')
plt.xlabel('Predictions')
plt
            
           

相關推薦

多項式迴歸線性模型新增非線性

作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai 介紹 在這篇文章中,我們將學習如何解決線性模型的關鍵問題,即線性假設。我們將看一下線性迴歸,這是一種基礎統計學習技術,瞭解模型引擎下發生的事情,然後更多的瞭解模型的

sklearn-1.1.16.多項式迴歸基函式拓展線性迴歸模型

1.1.16.多項式迴歸:基函式拓展線性迴歸模型機器學習中一種常見模式是使用線性模型去訓練非線性模型。這種方式保持了常見線性方法的快速性,同時適用於更廣泛的資料。例如,一個簡單的線性迴歸可以通過係數拓展到多項式。在標準線性迴歸情況下,你看你有一個類似二維資料的模型:如果我們要

各種迴歸全解傳統迴歸、邏輯迴歸、加權迴歸/核迴歸、嶺迴歸、廣義線性模型/指數族

2、從‘廣義線性模型(GLM:generalized linear models)’和‘指數族’說起: (1)指數族(the exponential family) 伯努利分佈: 高斯分佈: (2)GLM 3、為什麼sigma函式可以代表概率? 設y只取0,1 4、邏輯迴歸

R迴歸診斷廣義線性模型非線性模型

迴歸診斷 樣本是否符合正態分佈假設? 是否存在離群值導致模型產生較大誤差? 線性模型是否合理? 誤差是否滿足獨立性、等方差、正態分佈等假設條件?是否存在多重共線性? 正態分佈檢驗 正態性檢驗:函式shapiro.test()P>0.05,正態性分佈 0.05的p值通

R語言學習筆記(十一)廣義線性模型

學習筆記 Education 5.0 1.3 style only 可能性 div erro #Logistic 回歸 install.packages("AER") data(Affairs,package="AER") summary(Affairs) a

線性迴歸_邏輯迴歸_廣義線性模型_斯坦福CS229_學習筆記

前言 之前學習過視訊版本的吳恩達老師CS229的機器學習課程,但是覺得並不能理解很好。現在結合講義,對於之前的內容再次進行梳理,仍然記錄下自己的思考。圖片來源於網路或者講義。話不多說,進入正題吧。 Part I Regression and Linear Regression

論文筆記線性模型 《Bilinear CNN Models for Fine-Grained Visual Recognition》

雙線性模型是2015年提出的一種細粒度影象分類模型。該模型使用的是兩個並列的CNN模型,這種CNN模型使用的是AlexNet或VGGNet去掉最後的全連線層和softmax層,這個作為特徵提取器,然後使用SVM作為最後的線性分類器。當然,作者還在實驗中嘗試了多種方法,比如最後使用softmax但

Asp.Net MVC4入門指南(8)給資料模型新增校驗器

在本節中將會給Movie模型新增驗證邏輯。並且確保這些驗證規則在使用者建立或編輯電影時被執行。 保持事情 DRY ASP.NET MVC 的核心設計信條之一是DRY: "不要重複自己(Don’t Repeat Yourself)"。ASP.NET MVC鼓勵您指定功能或者行為,只做一次,然後將它應用到應用

機器學習筆記五廣義線性模型(GLM)

一.指數分佈族 在前面的筆記四里面,線性迴歸的模型中,我們有,而在logistic迴歸的模型裡面,有。事實上,這兩個分佈都是指數分佈族中的兩個特殊的模型。所以,接下來會仔細討論一下指數分佈族的一些特點,會證明上面兩個分佈為什麼是指數分佈族的特性情況以及怎麼用到

jacob學習一word中新增一個字串

最近發現許多操作都是需要呼叫windows的COM元件,雖然java有JNI,但是似乎並不好用,後來發現有個jacob,底層雖然也是使用JNI,但是直接使用jacob,好了很多,,下面是一個簡單的demo; 主要實現開啟一個臨時word,填寫一個字串。 /*********

初學ML筆記N0.1——線性迴歸,分類與邏輯斯蒂迴歸,通用線性模型

1.線性迴歸 線性迴歸,即假設使用一個線性的模型方程,來擬合特徵與結果,如下 向量形式: x1,x2為輸入特徵。在上式中,theta則為每個特徵所對應的權重值,上式隱含了一個條件,即我們假設還有x0這個特徵,其值全部為1。 定義cost

HTML5網頁中新增視訊和音訊

向網頁中新增視訊:video標籤的使用 video標籤有很多屬性用於控制視訊的播放: src 用於指定視訊檔案的路徑。 poster 用於指定一個影象,在當前視訊播放之前或視訊資料無效時顯示(預覽圖)。視訊資料無效可能是視訊正在載入,可能是視訊地址

線性迴歸模型非線性迴歸模型的區別是

線性就是每個變數的指數都是1,而非線性就是至少有一個變數的指數不是1。 通過指數來進行判斷即可。 線性迴歸模型,是利用數理統計中迴歸分析,來確定兩種或兩種以上變數間相互依賴的定量關係的一種統計分析方法,運用十分廣泛。其表達形式為y = w'x+e,e為誤差服從均值為0的正態分佈。線性迴歸模型是

ML之迴歸預測之BE利用BE演算法解決迴歸(實數值評分預測)問題—線性方法解決非線性問題

ML之迴歸預測之BE:利用BE演算法解決迴歸(實數值評分預測)問題—線性方法解決非線性問題   輸出結果     設計思路     程式碼實現 for row in xList: newRo

統計學習六1.對數線性模型之邏輯回歸

最優化 clas distrib 技術分享 mat 計算 隨機 res 類模型 全文引用自《統計學習方法》(李航) 本節介紹的對數線性模型,主要包括邏輯斯諦回歸(logistic regression)模型以及最大熵模型(maximum entropy model)。邏

Python金融系列第五篇多元線性迴歸和殘差分析

作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai 第一篇:計算股票回報率,均值和方差 第二篇:簡單線性迴歸 第三篇:隨機變數和分佈 第四篇:置信區間和假設檢驗 第五篇:多元線性迴歸和殘差分析 第六篇:現代投資組合

『PHP學習筆記』系列八MySQL資料庫中新增資料

資料表結構: 資料表原有資料: 向MySQL資料庫寫入資料:  INSERT INTO 語句通常用於向 MySQL 表新增新的記錄: INSERT INTO table_name (column1, column2, column3,...) VALUES

【python學習筆記】46隨機漫步,埃拉托色尼篩法,蒙特卡洛演算法,多項式迴歸

學習《Python與機器學習實戰》和《scikit-learn機器學習》時的一些實踐。 隨機漫步 import matplotlib.pyplot as plt import numpy as np ''' 一維隨機漫步 ''' # 博弈組數 n_person = 20

線性模型線性迴歸,對數機率迴歸(Logistic regression)的理解與推導(深度學習前戲( ╯□╰ ))

對數機率迴歸(logistic regression),有時候會譯為邏輯迴歸(音譯),其實是我們把迴歸模型應用到分類問題時,線性迴歸的一種變形,主要是針對二分類提出的。既然是線性迴歸的一種變形,那麼在理解對數機率迴歸時,我們先來了解一下什麼是線性迴歸。 1.線性迴歸 1. 1線性方程

線性模型-區域性加權線性迴歸 機器學習實戰

區域性加權線性迴歸 線性迴歸的一個問題是有可能出現欠擬合,因為它求的是具有最小均方誤差的無偏估計,顯然模型欠擬合將無法做出很好的迴歸預測,所以有些方法允許在估計中引入一些偏差,從而降低預測的均方誤差。區域性線性加權的思想是對待預測點附近的每個點賦予一個權重,然後在帶權的樣本上基於最小均方誤差來