本文以 Python 語言建立多元回歸(Multiple Regression)模型。

1. 由一元到多元

上一篇我們介紹了簡單線性回歸
y= b1*x1 + b0
是一個獨立變數(independent variable)影響了一個相依變數(dependent variable)

但現實的世界裡一個結果往往是多個原因造成的。比如說:鑽石的價格是由重量、形狀、顏色、淨度這四個因素造成;颱風的生行由溫度、溼度、大氣壓力等原因造成。那多元回歸模型就可以使用了!

假設以下條件成立:
.線性
.homoscedasticity 同方差性
. 多元常態 正規性 multivariate normality 常態
.錯誤獨立性
.多行線性:multicollinearity

2. 轉換為多元回歸模型
以下圖來看
 

1_RearrangedTable.png

以 獲利當作預測目標(相依變數),多元回歸模型可寫成
y= b0 + b1*x1 + b2*x2 + b3*x3

但到了第四項洲地區就不大對:這是一種分類式資料(categorial data)

對分類式資料的處理用以下的方法:
1. 先統計出全部有多少種類:以這張圖來說,總共有3種分類:New York, California, Florida
2. 在將洲地區轉換成 以New York, California, Florida 這三個新的行(column)。有相對應的地區,就用1,其他欄位用0。如果有印象,這就是在資料預先處理時所用的編碼:one-hot encoding。

1_2_onehotEncoding.png

3.建立多元回歸模型的 5 方式

3.1 全部選擇
3.2 向後消去
3.3 向前選擇
3.4 雙向消去
3.5 分數比較

看到這裡可能會覺得很恐怖!幸好,Python 語言都幫我們作到了。我們只要簡單地呼叫函數就可以完成了!

4. 建立程式
 
4.1 觀察資料集合
進入大數據和人工智慧的第一步,是先觀察資料集合
 
2_0_CSV_content.png


這是一群2維的資料:特徵值在前面4個維度,最後一行是預測值
 

4.2 讀進資料
 利用 pandas 就可以讀進 CSV 檔案格式資料
 
import pandas as pd

dataset = pd.read_csv('50_Startups.csv')

4.3 取得特徵資料和預測值
特徵資料包含 0到3 行(column),最後一行是預測值

因此特徵資料 X 是 所有列,最後一行之前
X= dataset.iloc[:,:-1].values

預測值 Y 是 所有列,最後一行
y= dataset.iloc[:,-1].values

4.4 類型資料(categorial data)轉成 one hot encoding
  看一下 State 這一行(column),屬於類型資料(categorial data)。因此需要 one hot encoding

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

這裡的資料是第3行
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(),[3])], remainder='passthrough')
X=np.array(ct.fit_transform(X))


轉換後的結果
2_2_onehotencoding.png

轉換後可以看到第一行成為三個行

One Hot 編碼的結果放在資料的最前方

這裡是否需要特徵值轉換(feature scaling) ?
在多元回歸不需要,因為每一個變數都有參數

4.5 切割資料成訓練資料和測試資料
from sklearn.model_selection import train_test_split

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

4.6 訓練模型

很幸運地,在多元回歸模型的使用上和一元/簡單回歸模型是一樣的,只有特徵資料的維度由一元到多元而已:

from sklearn.linear_model import LinearRegression
reg=LinearRegression()
reg.fit(X_train, y_train)

4.7 預測測試資料
模型訓練好,就可以驗證測試資料了!
預測也和一元/簡單回歸模型是一樣的
y_pred=reg.predict(X_test)

但要視覺化就有問題了!因為這裡是多元,無法在二維平面上顯示多筆資料。
只能用觀察的方式:
np.set_printoptions(precision=2)
先設定小數後止有2位數字

print(np.concatenate((y_pred.reshape(len(y_pred),1),y_test.reshape(len(y_test),1)),1))
np.concatenate() 第3個參數
0 是垂直軸,1 是水平軸
由於是預測結果和真實結果比較,真實結果放在後面,是水平軸,就用1
以下是比較後的結果:

3_pred_result.png

創作者介紹
創作者 小木屋 的頭像
小木屋

小木屋

小木屋 發表在 痞客邦 留言(0) 人氣( 7406 )