# 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出現轉折點的λ來用。