---
# System prepended metadata

title: 'ML Lecture 1: Regression - case study'
tags: [李弘毅教授, 機器學習]

---

# ML Lecture 1: Regression - case study
###### tags: `機器學習` `李弘毅教授`
## 使用Regression的範例:
1.	預測道瓊指數，使用過去的道瓊指數，預測未來的道瓊指數。
2.	自駕車，透過感測器的一些參數來決定方向盤轉幾度。
3.	推薦系統，可能輸入是使用者A、商品B，算出使用者A買商品B的可能性。
4.	<font color="blue">這次的範例</font>：預測寶可夢在進化之後的CP值(這樣就可以評估要把這隻進化，或者是把它變成糖果)。
    - 輸入就是這隻寶可夢，輸出是他進化後的CP值。

## 寶可夢範例:
一隻寶可夢會有很多的屬性，這裡就取下圖中出現的當作輸入屬性。
![](https://i.imgur.com/jRcuroH.png)
- 這邊可以發現，輸入的特徵值有很多種，但其實現在還不知道哪些才是真正影響輸出的。
 
### 透過機器學習的三個步驟決範例問題:
#### **1. 找出function set**(<font color="red">找Model</font>)
- 找Function Set其實就是找出一個適合的「輸入輸出關係」，就是進化後的CP值跟進化前的各種特徵有甚麼關係呢?
- Function set是神經網路模型，之後會透過loss function找出形成最佳解的權重。
- 先隨便假設一個簡單的函數，例如我們覺得輸出可能只跟進化前的CP值有關：y=b+w*xcp。代表的就是「進化後的cp值」=一個「常數值b」加上「進化前的CP值」乘上「一個比重w」
- 這樣設方程式的方式叫做<font color="red">Linear model</font>，因為<font color="blue">輸出是特徵值的線性組合</font>。
    - **Feature**(特徵值)：輸入資料的某些屬性，像這裡就是某隻神奇寶貝的CP值- xcp
    - **Weight**：各個feature所佔的比重，w。
    - **Bias**：b。
#### **2. 蒐集訓練資料，之後找出最適合的方程式**
- 因為這個範例是<font color="blue">Supervised</font>，所以我們需要的是方程式的輸入、輸出，也就是進化前、進化後的CP值。
- 下圖中的x1代表的是第一筆訓練資料，ŷ1代表的是訓練資料的已知結果。圖中有十個點，代表他採樣了十隻神奇寶貝。
![](https://i.imgur.com/7mk4ufL.png)
##### Loss Function
有了訓練資料，再使用Loss Function就可以來評估Model的好壞。
![](https://i.imgur.com/AF8wNaw.png)
- Loss function的輸入是我們設定的model，這個例子中的model的權重有w、b。所以Loss Function就是以w,b作為輸入參數。
- Loss Function有很多種，只要合理都可以自己定義，這裡選擇一個最簡單的式子。
##### 透過繪圖直覺化:
不同的w,b讓Loss Function有不同數值，顏色越紅越大，最後得到橘色叉叉的點是最小值。
![](https://i.imgur.com/5OPewmT.png)
	 
#### **3. 找出讓Loss Function出現極小值的w、b**:
- 下圖式子是以數學是來表示Loss function的使用方法：
![](https://i.imgur.com/3Z8rVPS.png)
- 透過Gradient Descent找出最佳解。但使用這個方法在non-linear model中找到的解不一定是最佳解，可能只是相對好的解而已。
#### **4. 代回最佳解**
將計算出來的最佳解代回模型中，就可以將輸入對應到一個預測的輸出。
##### 計算後得到的模型結果
如下圖可以發現，透過這個模型找出的最佳權重是b = -188.4、w = 2.7。將這組權重代入一開始定義的模型，即可得到圖形中的紅線，也就是預測結果。
![](https://i.imgur.com/wWCTQIW.png)
##### 判斷模型的好壞
如果想要知道模型的好壞，最簡單的方式就是，把所有訓練資料到紅線的距離累加。如果這個值很小，就代表模型還不錯；反之代表模型效果不好。

不過這樣真的就可以判斷一個模型的好壞了嗎？
->不行，因為現在是拿訓練資料來計算，但我們希望模型是通用化的，因此不能直接拿訓練資料來評估。==應該要使用另外的資料來測試，通常將這組額外的資料稱為<font color="red">「**測試資料**」</font>==。

##### 使用測試資料評估得到的結果
下圖為測試資料跟紅線的比較。從圖中可以發現大方向都有抓出來，不過在原始CP值較極端的兩邊，得到的結果就沒那麼準了。
![](https://i.imgur.com/Dm8m28g.png)
## Gradient Descent:
- 使用Gradient Descent時，<font color="red">Loss Function需要是可微分</font>。因為在使用時會要求他的斜率。
- 直觀想法：往相對低的點去跑，也就是梯度較小的地方。
- 實際做法：隨便設定一個初始點，之後對這個點作微分(計算梯度)。假如算出來斜率是負的就知道右邊比較小，因此要往右邊跑，反之要往左邊跑。==能不能找到最佳解跟初始值的設定有關，不過至少可以找到區域極小值==。
- 下列式子就是使用Gradient Descent的式子(假設只有一個變數w)。w0是一開始隨便設定的初始值，使用時每次都會更新參數，讓新的權重(w1)=舊的權重(w0)減去後面那項。其中<font color="red">η為Learning rate</font>，如果Learning rate設的越大則每次移動的步伐越大。
![](https://i.imgur.com/B56IT61.png)
    > - 為甚麼使用減法呢?因為如果微分結果是負的應該往右，因此剛好差一個負號。
    > - 這邊提到的Gradient Descent是只有一個參數的情形，假如有多個參數怎麼辦呢？
    > -> 如果有多個參數，其實跟一個參數時是一樣的。在(b, w)這個點上，分別計算L對b、對w做偏微分的結果，之後針對各個參數去做更新。

## 如何得到較精準的結果呢？
在前面的小節我們求得了現行模型的結果，但效果沒有到很好。如果想要得到更好的結果，就要<font color="red">重新設計模型</font>，可能需要用到更複雜的模型。例如：可能會用到二次式，意思就是xcp這項可能會有平方。新的模型如下圖式子所示。
![](https://i.imgur.com/7hDYqcP.png)
下圖是訓練資料、測試資料跟輸出結果的對照。可以發現，效果已經比本來好上很多了。不過還有沒有可能做得更好呢？
![](https://i.imgur.com/Xva7aOp.png)

## 嘗試更複雜的模型(三次式)，看能不能得到更好的結果
這次再加入更高次方的參數。新的模型、最佳參數及誤差計算顯示如下圖：
![](https://i.imgur.com/2FfjGwi.png)
下圖是訓練資料、測試資料跟輸出結果的對照。可以發現，效果比前一小節再稍微好一點。
![](https://i.imgur.com/Iii0Exw.png)

## 再嘗試四次式
從下圖可以發現，雖然使用訓練資料計算出的誤差變小了，但是使用測試資料計算出來的誤差卻變大了。這就說明了，<font color="red">這個模型比較不具備通用性</font>。之後老師也嘗試了五次式，不過結果就跟現在一樣，訓練資料算出來的誤差變小；但使用測試資料計算出來的誤差卻變超大！
![](https://i.imgur.com/2N6AYzg.png)

## Overfitting(過度配適)
前面舉例子中，當模型使用到了四次式、五次式，再訓練資料可以到很好的效果；不過在測試資料上得到的效果卻非常糟糕。這種現象就稱為「過度配適」。==為了避免過度配適，選擇模型時應該選擇複雜度適中的。==

## 還有辦法得到更好的結果嗎？
前面的訓練資料只有考慮十筆資料，如果我們考慮多一點，這裡蒐集了60筆。把所有點都化在圖上可以得到下圖的結果：
![](https://i.imgur.com/UubSGW8.png)
- 透過上圖可以很清楚地發現，其實影響輸出結果的不只是進化前的CP值，神奇寶貝的物種也影響很大。因此應該要<font color="blue">嘗試為不同的物種，設計不同的方程式</font>。概念如下圖：
![](https://i.imgur.com/too08BG.png)
- 不過上一點中提到的方式，有辦法用數學式描述嗎？如果可以的話，要如何描述呢？出來的模型還會是線性模型嗎？
其實是==可以用數學式描述==的，<font color="red">要使用δ(x)</font>。假如xs = Pidgey，則δ(xs=Pidgey)會等於1；反之δ(xs=Pidgey)會等於0。因此透過這樣的方式，就可以針對不同物種，給予不同方程式。而且透過這樣方法，得到的模型也是==線性模型==。因為xi等於是變成了δ(xsi=Pidgey)*xi。

![](https://i.imgur.com/dKRyibu.png)
### 透過新的模型得到的結果
觀察可以發現，各個物種其實都還存在著一些誤差，有可能是因為其他的特徵值造成的，不過也有可能是因為一些隨機值。但這些都沒辦法確定。如果希望預測值可以到更精準，可以再嘗試加入不同的特徵值。但很明顯的可以發現，伊布那條線應該是沒救了，因為伊布進化成不同精靈都會有不同結果。
![](https://i.imgur.com/DXHAgyK.png)

## 透過考慮更多特徵值重新設計新模型
嘗試加入身高、體重、血量等特徵值。
![](https://i.imgur.com/5a1h12r.png)

經過計算可以得到：
- Training Error = 1.9
- Testing Error = 102.3

可以發現，這個模型整個爛掉了。如果想要讓他再變好的話，可以把一些可能不重要的特徵值刪掉。但這需要Domain Knowledge，事實上我們很難知道哪個特徵值不重要。因此其實可以使用<font color="red">Regularization</font>的方式。
## Regularization
重新定義「定義模型好壞的方式」，也就是<font color="red">重新設計Loss Function</font>，把一些額外的知識加進去。
加入右邊那象的原因是，==希望在達成Loss變小的同時，得到的權重值越小==。如果權重值越小，方程式就會比較平滑，其實就是輸出對輸入比較不敏感。那這樣做有甚麼好處呢？<font color="blue">這樣做模型比較不會受雜訊影響</font>。
![](https://i.imgur.com/UkNAcuP.png)
> 為甚麼做Regularization時，右邊那項不用考慮bias呢？
> 因為加上那項只是為了增加模型的平滑度，而影響平滑度的只有wi；bias只會讓輸出值上下變動而已。

### 如何決定新的Loss function中的λ？
從下圖可以觀察出：如果λ越大，Training error可能越大；Testing可能越小，不過到某個值以後，error又會再提升。
![](https://i.imgur.com/eD5Xm3O.png)
- 可以發現：
    - **Training error會持續增加**
        其實這個現象還滿合理的，因為當λ越大，在做梯度下降時，會更傾向考慮權種大小，而非error本身。 
    - **Testing error會先減少再增加**
        因為如果模型平滑到一個程度後，會變得甚麼都沒辦法做，沒辦法成功更新參數。因此Testing error會再增加。
- 綜合上述兩點考量，我們可以抓Testing error出現轉折點的λ來用。