# 迴歸 Regression
###### tags: `Machine Learning`
本篇會提到以下迴歸演算法
* 簡單線性迴歸
* 多元線性迴歸
* 多項式線性迴歸
## 簡單線性迴歸 Simple Linear Regression
> 可以參考[Simple Linear Regression](https://medium.com/@gatorsquare/ml-simple-linear-regression-%E7%B0%A1%E5%96%AE%E7%B7%9A%E6%80%A7%E8%BF%B4%E6%AD%B8-59c627734668)還有[Linear Regression](https://medium.com/chung-yi/ml%E5%85%A5%E9%96%80-linear-regression-27cbb50f89e8)更詳細唷。
簡單線性迴歸探討兩個連續變數 independent variable(自變數)及 dependent variable(應變數)之間的關係,通常以 X 和 y 來表示。
* 自變數 X,有時又稱做 predictor variable 或是 explanatory variable。
* 應變數 y,有時又稱做 response variable 或是 outcome variable。其值會隨著 X 的改變而變化。
而這兩變數的關係,又可以分為下列兩種:
1. 定性關係/函數關係 Deterministic / Functional relationships
($X_i$, $y_i$) 數對的點完全落在同一直線上。
![](https://i.imgur.com/3mbYyov.png)
2. 統計關係 Statistical relationships
($X_i$, $y_i$) 數對的點乍看之下好像具有線性關係,卻又沒有全部在同一直線上。
![](https://i.imgur.com/mYSXtBL.png)
線性迴歸就是處理這種狀況。
### 最佳擬合線 Best Fitting Line
令 y 會隨著 X 而改變,並將其關係列成式子:
$y=w_1*X+w_2$
簡單線性迴歸的目標是**找出 $w_1$ 及 $w_2$**,方法是**利用<font color = "red">歐式距離</font>找到最小平方和**。
![](https://i.imgur.com/xTVQJYM.png)
換句話說,就是在找點跟線之間的距離,距離越小就代表這條線(Linear model)的位置越好,越能描述 ($X_i$, $y_i$) 之間的關係。
### 損失函數 Loss Function
用來衡量 Linear model 的好壞。
常用的誤差計算方式有:
1. 平均絕對誤差 Mean Absolute Error, MAE
$Error=\dfrac{1}{m}\sum_{i=1}^{m}|y-\hat{y}|$
2. 均方誤差 Mean Squared Error, MSE
$Error=\dfrac{1}{m}\sum_{i=1}^{m}(y-\hat{y})^2$
3. 均方根誤差 Root Mean Srqaued Error, RMSE
$Error=\sqrt{\dfrac{1}{m}\sum_{i=1}^{m}(y-\hat{y})^2}$
先說結論:<font color="red">RMSE 優於 MSE 優於 MAE</font>。
因為我們不可能隨機猜 $w_1$ 跟 $w_2$ 並一直計算 error 以此嘗試找出最佳解,太累了!經濟效益低!所以就會用到**微分**來計算。將 error 分別對 $w_1$ 跟 $w_2$ 做偏微分,當一階微分等於零時,便可以得到函數的極值;又因 error 永遠為正,所以做偏微分後的極值為其最小值。這就是<font color="red">梯度下降法</font>。
基於以上,若採用 MAE 的話,「等於 0」的狀況將無法用微分計算出來。
而 RMSE 優於 MSE 的原因,單純只是資料判讀上比較方便。
> 想要更深入嗎?建議你參考[這篇](https://ithelp.ithome.com.tw/articles/10218158)。
>
### 梯度下降 Gradient Descent
配合誤差,協助更快找出好的 Linear model。
做法:由於要找出最適當的 $w_1$ 跟 $w_2$ 的方法就是使誤差降到最小,也就是說要對 loss function 做偏微分(求**切線斜率**),就是求極值的概念;當找到 loss function 斜率為 0 的地方,參數 $w_1$ 跟 $w_2$ 就不再更新,此時的 $w_1$ 跟 $w_2$ 可能為最佳解,但也有可能只是局部最佳解。
偏微分前面有一個常數 $\alpha$ 稱為learning rate,如果值越大,代表每次更新的幅度越大;反之,如果值越小,代表每次更新的幅度越小。這個值可以依照需求動態調整,主要是為了得到適當的 step size,避免步伐過大一直來回跨過最佳解的點,或是步伐過小要花很長時間才能找到最佳解。
$w_i-\alpha\dfrac{\partial}{\partial w_i}Error$
> 可以參考[這篇文章](https://ithelp.ithome.com.tw/articles/10219458)進一步了解學習率(learning rate)。
## 多元線性迴歸 Multiple Linear Regression
> 看看[這裡](https://www.mdeditor.tw/pl/2HsT/zh-tw)有好東西。
自變量 X 多於一個、係數為 1,且全都跟應變量 y 呈現某種線性關係的狀況就是多元線性迴歸。
$y=w_0+w_1*X_1+w_2*X_2+...+w_n*X_n$
> (可視為兩個向量的內積)
多元線性迴歸的條件:
* 線性 Linearity
* 等方差性 Homoscedasticity
* 多元常態分佈 Multivariate normality
* 誤差獨立 Imdependence of errors
* 無多重共享性 Lack of multicollinearity
下面會介紹在多變數時很重要的「虛擬變量」,以及建立多元線性回歸的模型的各種辦法,最後會討論如何鑑定模型的好壞。
會討論到的建立模型辦法有:
1. All-in
2. 反向淘汰 Backward Elimination
3. 順向選擇 Forward Selection
4. 雙向淘汰 Bidirectional Elimination
5. 訊息量比較 Score Comparison
其中,2、3、4是較常使用的,同時稱為 Step regression,因其本質基本相同,只是應用上的順序有點不同。下面將一一介紹。
### 虛擬變量 Dummy Variables
在開始介紹多元線性回歸之前,先介紹一個很重要的詞彙「虛擬變量」。
因為「多元」,所以代表有複數個自變量,在這多個自變量中不一定全部都是純數字,可能會有州別、國別、性別等資料是文字,無法給電腦判讀,這時候就可以用 pandas 中的 `get_dummies` 來將文字資料轉換成二元數字資料。
舉例:
|州別|上班族|商家|退貨率|
|-|-|-|-|
|威斯康辛|100|A|30|
|密西根|150|B|10|
|密西根|150|C|3|
|威斯康辛|100|D|0|
|密西根|150|E|20|
|威斯康辛|100|F|15|
|威斯康辛|100|G|3|
|威斯康辛|100|H|0|
像這種類型的資料,就會將州別重新編碼成下面這樣:
|上班族|商家|退貨率|威斯康辛|密西根|
|-|-|-|-|-|-|
|100|A|30|1|0|
|150|B|10|0|1|
|150|C|3|0|1|
|100|D|0|1|0|
|150|E|20|0|1|
|100|F|15|1|0|
|100|G|3|1|0|
|100|H|0|1|0|
這裡的州別只有兩個,其實算是落入**虛擬變量陷阱**,但實際應用應為更多的州別,常見的陷阱通常是「性別」。
* 虛擬變量陷阱
使用虛擬變量時需要注意,變量之間必須相互獨立,不存在可推理的關係,否則雖可以幫助轉換文字資料為數字,但有可能會落入「虛擬變量陷阱」。
舉例:
|性別|收入|花費|
|-|-|-|
|男|10|2|
|女|10|3|
|女|12|2|
|男|15|3|
重新編碼後:
|收入|花費|男|女|
|-|-|-|-|
|10|2|1|0|
|10|3|0|1|
|12|2|0|1|
|15|3|1|0|
性別其實只需要一行就可以表示(如男=1,女=0或相反),並不需要兩行來表示,否則只會徒增困擾(因為是多餘的特徵,會成為累贅)--這就是落入虛擬變量陷阱中。
### All-in
將<font color="red">所有的自變數 X</font> 通通都丟進去訓練。
常見應用場景:
* 已知所有自變數都會對模型結果有影響
* 被指定必須全部使用
* 為反向淘汰做準備
很暴力,很簡單,但不推薦使用。通常不會全部的自變數都是必要的,而且這容易造成耗時過久。(多餘的特徵成為累贅)
### 反向淘汰 Bacjward Elimination
步驟:
1. Select a significance level to stay in the model.
> E.g. SL = 0.05
2. Fit the full model with all possible predictors.
3. Consider the predictor with the highest P-value.
> If P > SL, go to Step 4;
> Otherwise, go to <font color="red">FIN</font> (Your model is ready)
4. Remove the predictor.
5. Fit model without this variable.
6. Back to Step 3.
先用所有的自變數擬合出一個模型,然後利用 statsmodels.api 中的 OLS 列出關於這個模型的詳細資訊(如下),檢驗 P>|t| 的值,將大於 SL 的值當中最大的拿掉,重新擬合後觀察 Adj. R-squared 的分數是否有變得接近 R-squared(理論上應該會越來越接近)(R-squared 相關資訊後面會解釋)。
![](https://i.imgur.com/g2Hj1cL.png)
### 順向選擇 Forward Selection
步驟:
1. Select a significance level to stay in the model.
> E.g. SL = 0.05
2. Fit all simple regression models $y~X_n$.
> Select the one with the lowest P-value.
3. Keep this variable and fit all possible models with one extra predictor added to the one(s) you already have.
4. Consider the predictor with the lowest P-value.
> If P < SL, go to Step 3;
> Otherwise, go to <font color="red">FIN</font> (Your model is ready)
先個別對單一自變量進行簡單線性迴歸擬合,找出 P-value 為最小的自變量並留下,開始加入一個別的自變量進行多元線性迴歸擬合,找出更小的 P-value 並重複這個行為,直到剩下的 P-value 都大於 SL。
### 雙向淘汰 Bidirectional Elimination
步驟:
1. Select a significance level to enter and stay in the model.
> E.g. $SL_{enter}$ = 0.05, $SL_{stay}$ = 0.05
2. Perform the next step of Forward Selection.
> New variables must have: P < $SL_{enter}$ to enter.
3. Perform ALL steps of Backward Elimination.
> Ole variables must have P < $SL_{stay}$ to stay.
4. No new variables can enter, and no old variables can exit.
> <font color="red">FIN</font> (Your model is ready)
結合反向淘汰與順向選擇的演算法。
設定兩個 SL 分別是:
* 接受不在模型中的自變量進來的、順向選擇需要的--$SL_{enter}$
* 驅趕模型中已有的自變量的、反向淘汰需要的--$SL_{stay}$
利用 $SL_{enter}$ 檢驗是否要讓新的自變量進入模型;利用 $SL_{stay}$ 檢驗要是否要剔除某些自變量。當新的進不來、舊的出不去時,代表模型已擬合完成。
:::warning
**注意**:
SL 的值並非一定要 0.05,而是可以自己調整至最適當的數值。
怎麼樣才是最適當?不知道,只能慢慢嘗試。
但要小心,不要 over-fitting 喔!
:::
### 訊息量比較 Score Comparison
步驟:
1. Select a criterion of goodness of fit.
> Akaike criterion (AIC).
2. Construct All Possible Regression Models
> $2^N-1$ total combinations.
> E.g. 10 columns means 1023 models.
3. Select the one with the best criterion.
> <font color="red">FIN</font> (Your model is ready)
對於一個多元線性迴歸模型的一個評價方式。比如說給它進行打分,那麼就有很多種打分方式。
最常見的一種,叫做 Akaike criterion(AIC);對於所有可能的模型,我們對它們進行逐一的打分,在多元線性迴歸中,如果有 $N$ 個自變數,那麼就有 $2^N-1$ 個不同的模型,對這些模型打分後選擇分數最高的模型。但當 $N$ 很大的時候,模型的數量就會非常多,所以說這個方法雖然直覺上很好理解,但自變數數量很大時就不適合使用這種方法。
## 多項式線性迴歸 Polynomial Linear Regression
:::danger
老師沒細講,先pass
Q: 這真的是線性嗎??
:::
## 迴歸們比一比
![](https://i.imgur.com/OZdF0Sa.png)
## 評估迴歸模型的表現--決定係數 $R^2$
**應變量**的變異中,可由**自變量**解釋部分所佔的<font color="red">比例</font>。
$R^2=1-\dfrac{SS_{res}}{SS_{tot}}$
其中,$SS_{res}$ 是 Residual Sum of the Squares、$SS_{tot}$ 是 Total Sum of Squares。
![](https://i.imgur.com/OmCpRBH.png)
### 決定係數的陷阱
自變量不是越多越好,有的特徵並沒有那麼重要,加進去一起訓練只會浪費時間又增加不了多少效益,所以適當刪除自變量是很重要的。
但單純觀察 $R^2$ 的話是無法剔除無用自變量的。
![](https://i.imgur.com/vDobXLw.png)
這時候就需要 <font color="red">Adjust $R^2$</font> 來懲罰過多無用自變量。
### Adjust $R^2$
$R^2=1-\dfrac{SS_{res}}{SS_{tot}}$
$Adj.\ R^2=1-(1-R^2)\dfrac{n-1}{n-p-1}$
其中,$n$ 為樣本的數量、$p$ 為迴歸中所用到的自變數的數量。
當你利用 statsmodels.api 中的 OLS 列出關於這個模型的詳細資訊時,右上會顯示$R^2$跟$Adj.\ R^2$,然後配合上面五種建立模型的方法去調整自變量,得到最大的 $R^2$ 跟最接近 $R^2$ 的 $Adj.\ R^2$。
## 過度擬合 Over Fitting
> 可以參考[Overfitting 過度學習](https://medium.com/%E9%9B%9E%E9%9B%9E%E8%88%87%E5%85%94%E5%85%94%E7%9A%84%E5%B7%A5%E7%A8%8B%E4%B8%96%E7%95%8C/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-ml-note-overfitting-%E9%81%8E%E5%BA%A6%E5%AD%B8%E7%BF%92-6196902481bb)還有[L1 , L2 Regularization 到底正則化了什麼 ?](https://allen108108.github.io/blog/2019/10/22/L1%20,%20L2%20Regularization%20%E5%88%B0%E5%BA%95%E6%AD%A3%E5%89%87%E5%8C%96%E4%BA%86%E4%BB%80%E9%BA%BC%20_/)。
Over fitting 就是過度學習訓練資料,變得太專一,只能適用於訓練資料,無法順利去預測或分辨不是在訓練資料內的其他資料。
![](https://i.imgur.com/tkdL6rW.png)
可能成因:
* 資料太少
* 模型過度複雜
* 神經網路層數過多
解決方法:
* L1 regularization
* L2 regularization
* Dropout
* Data auguentation
### 正規化 Regularization
[這篇](https://ithelp.ithome.com.tw/articles/10219648)超詳細,看他!
1. L1 regularization (Lasso)
減少某些特徵,達到**篩選特徵**的功用。
$cost=prediction\ \ error + \alpha * \sum|weights|$
2. L2 regularization (Ridge)
降低某些特徵的權重。
$cost=prediction\ \ error + \alpha * \sum(weights)^2$
這兩種方式是在 loss function 中加入懲罰項,以降低某些特徵的重要性。
### Dropout
Dropout不是針對cost函式,而是改變神經網路本身的結構。
一般情況下,對於同一組訓練資料,利用不同的神經網路訓練之後,求其輸出的平均值可以減少 overfitting。Dropout 就是利用這個原理,每次丟掉一半的一隱藏層神經元,相當於在不同的神經網路上進行訓練,這樣就減少了神經元之間的依賴性。即每個神經元不能依賴於某幾個其他的神經元(指層與層之間相連線的神經元)使神經網路更加能學習到與其他神經元之間的更加健壯 robust 的特徵。
> 以上參考自[Dropout 解決擬合過度](https://www.wpgdadatong.com/tw/blog/detail?BID=B1320)。