[Python 實作] 迴歸模型 Regression

迴歸模型是處理連續變數相當好用且直觀的模型。上個單元,我們已經認識了迴歸模型。本單元,我們將帶大家一起用Python實作迴歸模型。歡迎大家跟著影片一起練習,程式檔案亦提供在文末,歡迎有需要的朋友自行下載。

(一) 前置作業

在進入模型建構之前,如同以往,我們要先做兩件重要的事情。

1. 引入模組

首先,我們可以先引入一些常用的模組,這些模組中包含了前人的智慧,讓我們可以簡單的使用這些模組來達到我們想要的成果!

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

相信大家對於這些模組並不陌生,在本單元的迴歸模型中,linear_model主要用來建構線性模型。而在高維度的多項式迴歸模型中,就要依靠PolynimialFeatures以及make_pipeline來建構! 在資料集的部分,我們也可以採用sklearn裡面所提供的make_regression來下載合適線性迴歸的練習資料。其他模組在之前單元都有介紹過了,有興趣的朋友歡迎參考先前單元,在此不再贅述。

2. 區分訓練集與測試集

首先,我們先讀取我們要用來建模的資料。在這裡,我們用make_regression來下載sklearn裡面資料集的資料。 在這裡,我們抽取100個樣本,特徵數為一,並設定噪音為50。

X,y=make_regression(n_samples=100, n_features=1, noise=50)

緊接著,為了避免過度擬和,我們在建構模型時,應至少把資料區分為訓練集與測試集。在python中,我們可以利用train_test_split功能自動幫我們區分,我們也可以設定合適的資料集比例。以下例來說,我們設定測試集為30%,也就是訓練集為70%。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

random_state的部分是設定隨機種子,如果沒有設定的話每次區分時都會隨機區分。

(二) 簡單線性迴歸 Simple Linear Regression

在建構迴歸模型之前,我們可以先將資料用散佈圖畫出來看看,以推估合適的迴歸模型。

plt.scatter(X,y)

接下來,我們用 linear_model 裡面的LinearRegression對訓練集進行模型建構:

regr=linear_model.LinearRegression()
regr.fit(X_train, y_train)

短短兩行code,模型已經建構完成了! 接下來,我們來看看訓練集的成果。
plt.scatter(X_train, y_train, color='black')
plt.plot(X_train, regr.predict(X_train),color='blue',linewidth=1)
plt.show()

藍色的線就是我們建構出的線性迴歸,我們也可以看到這條線的截距與斜率:
w_0=regr.intercept_
w_1=regr.coef_

也就是說,方程式為

$$y=w_0+w_1x$$

score會透過$R^2$來判定我們模型的精準程度,因此我們可以透過score來看模型成效,以下我們先看訓練集的分數。
regr.score(X_train,y_train)

當然,我們更想知道的是,用訓練集建構好的模型,實際在測試集的表現又是如何呢?

plt.scatter(X_test, y_test, color='red')
plt.plot(X_test, regr.predict(X_test),color='blue',linewidth=1)
plt.show()

最後,我們一樣可以用score來看測試集的表現。
regr.score(X_test,y_test)

如果訓練集的分數很高,但測試集的分數卻很低,那就是…過度擬和啦!

(三)多項式迴歸 Polynomial Regression

接下來,我們看到高維度的多項式迴歸。在這邊,我們簡單建立個房子坪數大小與房價關係的資料,帶大家一起看多項式迴歸的實作。為了簡化分析,我們這邊就只顯示訓練集的部分,以了解多項式迴歸的使用為主。

首先看到我們的資料:
size=[5,10,12,14,18,30,33,55,65,80,100,150]
price=[300,400,450,800,1200,1400,2000,2500,2800,3000,3500,9000]
plt.scatter(size,price)
plt.show()

很明顯的,這並不像是一個線性函數。在簡單將資料整理成我們熟悉的X,y格式後,即可開始建模。

series_dict={'X':size,'y':price}
df=pd.DataFrame(series_dict)
X=df[['X']]
y=df[['y']]

在建構多項式迴歸時,在make_pipeline裡面,我們首先在PolynomialFeatures裡面放入需要的維度,比方說我們放入3,指的就是三次方的多項式。另外,我們可以在後面放入所需的迴歸模型,比方說線性迴歸。(這部分也可以放入我們後續會提到的Lasso Regression 及 Ridge Regression等等)

model=make_pipeline(PolynomialFeatures(3),linear_model.LinearRegression())
model.fit(X,y)

plt.scatter(X,y)
plt.plot(X,model.predict(X),color='red')

另外,我們也可以在多項式迴歸外加上個迴圈,這樣就可以很清楚的看到不同次方迴歸模型的表現。此外,我們也可以把每個迴歸模型的分數存起來,以供比較。(格式好像會跑掉,先以圖片代替,需要code的朋友可以從檔案直接下載)

從結果我們也可以看到,三次方(含)以上的多項式比較符合這組資料。

(四)多元迴歸 Multivariable Regression

接下來,我們看到多元迴歸的部分。多元迴歸指的是有多個特徵,在本例中,除了房屋坪數大小的特徵外,我們再加入距離市區遠近的特徵。

size=[5,10,12,14,18,30,33,55,65,80,100,150]
distance=[50,20,70,100,200,150,30,50,70,35,40,20]
price=[300,400,450,800,1200,1400,2000,2500,2800,3000,3500,9000]
series_dict={'X1':size,'X2':distance,'y':price}
df=pd.DataFrame(series_dict)
X=df[['X1','X2']]
y=df[['y']]

接下來,跟簡單線性迴歸一樣,我們可以用LinearRegression()來建構模型,只是在這邊的X已經包含了兩個特徵的資料。

regr=linear_model.LinearRegression()
regr.fit(X, y)

模型建好後,我們一樣可以用score(X,y)來查看模型的表現,用 “模型.intercept_” 來看截距項,用”模型.coef_”來看各項係數。值得注意的是,這邊的係數已經變成有兩個囉! 因為現在是多元回歸,我們有兩個特徵!

(五) 避免過度擬和

在迴歸模型簡介的單元中,我們簡單的介紹了兩種避免過度擬和的模型,分別為Lasso Regression與Ridge Regression。在實作的使用上也非常簡單,只要把我們先前的LinearRegression()改成Lasso()或Ridge()就可以了! 另外,在參數的部分,裡面還可以放入懲罰係數$\alpha$,自由調整參數大小。參數愈大,懲罰性愈強,愈不容易過度擬和,但同時也較無法貼近資料,因此係數的選擇也是很重要的,太大太小皆不宜。在沒有給定的情況下,預設為1。

1. Lasso Regression

clf_lasso=linear_model.Lasso(alpha=0.5)
clf_lasso.fit(X,y)

2. Ridge Regression

clf_ridge=linear_model.Ridge(alpha=0.5)
clf_ridge.fit(X,y)

3. 多項式迴歸

在多項式迴歸的部分,只要將make_pipeline裡面的模型,改成Lasso()或Ridge()就可以了! 其他用法都與先前所述相同。範例如下:

model=make_pipeline(PolynomialFeatures(4),linear_model.Ridge())
model.fit(X,y)

因為Linear Regression在機器學習裡面算是相對具象且容易理解的章節,因此我們也在此嘗試自己寫梯度下降法,再與這些套件結果比較。有興趣的讀者可以從影片或下面程式檔中取得這部分的內容,相信經過不斷的練習,未來我們都有機會成為coding高手,將不再受限於模組的限制,可以針對自己的需求做得更為彈性。

更多內容,歡迎參考影片。
程式檔案在此下載

本單元,我們已經學會了用Python來建構迴歸模型。下個單元,我們將一起認識專門處理分類問題的邏輯斯迴歸模型!

Share

4 thoughts on “[Python 實作] 迴歸模型 Regression

    1. 這裡指的應該是x跟y的資料長度不同,因為每個樣本都應該要對到一個label。
      建議可以用len(x)與len(y)檢查x與y的資料長度是否相等,再做調整。

    1. 1.先把模型提取出來:
      linear_regression_model = model.named_steps[‘linearregression’]

      2.接下來跟先前方法一樣,用.intercept_跟.coef_就可以分別取出截距及係數囉!
      intercept = linear_regression_model.intercept_
      coefficients = linear_regression_model.coef_
      print(“截距 (intercept):”, intercept)
      print(“係數 (coefficients):”, coefficients)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *