---
# System prepended metadata

title: Learning from example
tags: [朱威達]

---

Learning from example
==
###### tags: `朱威達`

- learning base agent:他有**學習能力**，會在未來的觀察中提升自己的效能，
- 透過input-output的組合，可以用function預測新的unput之output
- 為何需要learning agent?
1. 無法窮舉所有情況
2. 無法隨時隨著時間演變改變機率
3. 有時候人類也找不到解答

# Supervised learning

最基礎的learning 法，給(input, output)，希望找到function $y=f(x)$，理論上可以找到完美function，實際上不可能找到。

找到一個function(hypothesis)，用training set找到一個假設function，然後再用tesing set 去檢驗這個function的正確性

**classification** -> 也叫做Boolean/binary classification，output會是true/false

**regression** -> output會是任意數值

![](https://i.imgur.com/yccb4W7.png)
這邊可以看到用不同次方的多項式去fit有不一樣的多項式

上面不管哪個次方的多項式都可以完美fit，如何決定要用哪個次方的多項式呢？

**Ockham's razor** -> 傾向選擇**次方較低**的多項式，希望越簡單效率越好的，越簡單的function，選到機率越高

看上面18(c)的圖7個點沒辦法用一個linear的線去fit他，所以他用6次多項式可以完美fit，但是這不會是一個好選項。選擇一個離他們都很近的linear直線其實是比較好的。(線性代數的的least square line)

總的來說，
高次多項式會fit比較好，但是高次方容易overfitting
低次多項式可以比較好的形容function的走勢，但是他沒辦法fit很好
當然希望兩這兼具但是很難，這邊的tradeoff 要自己調配平衡。

令最好的 hypothesis是$h^*$

$h^* = argmaxP(h|data)\equiv$在這些data中會選擇用h來描述的機率，然後是最高的機率。

用貝氏：
$h^*argmaxP(data|h)P(h)\equiv$(選到這個h而他可以描述這個data的機率)*(天生選到h的機率)
$P(h)$(天生選到h的機率)在低次項被選中的機率很高，像較於高次方
$P(h)$傾向選擇簡單的hypothesis(Ockham's)
<!-- $P(data|h)$傾向選擇複雜的hypothesis(會fit 比較好) -->

**tradeoff:(描述能力)-(一般化能力)**

# Learning Decicion Tree

if else.....就是Decicion Tree
![](https://i.imgur.com/CpejocX.png)
今天要決定是否要等這家餐廳？有10個要決定的東西(attributes)
可以建一個決策樹
![](https://i.imgur.com/h3QMB3Q.png)

或是換一個方法，自動產生這個tree
搜集過去12組客人的方式，學習出這個決策樹。
![](https://i.imgur.com/IO9dPJn.png)

該怎麼learn呢？
所以希望：
1. 描述上面那個表格(越詳細)
2. tree越小越好（越簡單/越一般化）

會發現要達成上面兩項(矛盾)這是一個**intractable problem** -> problems for which there exist no efficient algorithms to solve them，找不到適合的最佳解

有一個代替的方法是用**greedy divide-n-conquer**：**永遠考慮重要屬性先**
這樣可以盡量把tree 壓得小

像是用**餐廳type**無法很快決定是否要等(模糊)，就不會是優先考慮的attribute

**裡面有沒有人**就是可以優先選的attribute

<!-- ![](https://i.imgur.com/AwmdWzs.png)
 -->
所以尊崇用影響比較大的attribute優先，再重新畫一次決策樹
![](https://i.imgur.com/vxCExLs.png)
深度下降很多


## Entropy

要怎麼去量化attribute的重要性？
一個可以把data分類yes/no的就是一個好的attribute

用**entropy**量化
Entropy:用來衡量一個random variable的不確定性/資訊量

所以**我們要選的attribute是能使entropy降最多的**$\equiv$一開始資訊雜亂，在做某一個決定之後，可以降低最多資訊雜亂度的

![](https://i.imgur.com/1MfH66P.png)
所以可以得出
$log\frac{1}{P(v_k)}=-logP(v_k)$提出來

Entropy:$H(V) = -\sum P(v_k)logP(v_k)$

**在這邊可以換算，如果他是硬幣的話有兩種可能$\equiv2^1可能\equiv1bit$，若是4面骰$\equiv2^2可能\equiv2bits$**

就可以用上面的舉例理解：
一個公平硬幣，兩面個是0.5, 0.5，他不確定性很高
其entropy$H(Fair)$將會是1 bit

若是硬幣機率是0.99, 0.1，他不確定性很低(應該會是0.99那面)
其entropy$H(不公平)$將會是0.08 bit

**結論：**
不確定性很大 -> entropy高
不確定性很小 -> entropy低
會優先想選擇entropy高的attribute

### Boolean variable
令q為true的機率, (1-q)為fakse的機率
$B(q)=-qlogq - (1-q)log(1-q)\equiv$-(true的機率)*(true的資訊量)-(false的機率)*(false的資訊量)
![](https://i.imgur.com/6asyIdH.png)


## Remainder
所以繞回去，要找哪個attribute，就是要找哪個attribute使entropy越小

![](https://i.imgur.com/sxzbrAv.png)
1. 所以今天我們有attribute A(餐廳type), 有d種(餐廳type)，然後依照他的type分成不同的$E_d$ 
2. $每個集合E -> p_k為true的樣本數(要等的), n_k為false樣本數(不等的)$
3. entropy = $B(p_k/(p_k+n_k))\equiv B(p_k出現的機率)$
4. 一隨機選取的sample 他是來自集合k個value的的機率是$\frac{集合 k的所有樣本數}{所有樣本數}$

整體整理：
$Remainder(A) = \sum\frac{p_k+n_k}{p+n}B(\frac{p_k}{p_k+n_k})$

可以得經過餐廳類型的判別得到下一場的資訊總和。

我自己的理解：
對每一類型餐廳，依照他的樣本多寡比例，所總和的資訊量

## Infromation gain

![](https://i.imgur.com/QJSJ7NM.png)

$Entropy的減少\equiv Gain(A)的增加\equiv attribute的重要性$

![](https://i.imgur.com/UbtHbnU.png)
$Gain() = 原本的資訊量 - 剩下的資訊量 = Entropy的減少$

帶入就可以發現
$Gain(餐廳人數)=0.541的影響(好的參考選擇)(會被選為決策樹的root)$
$Gain(餐廳總類)=0沒有影響$

## Decision tree prunning

為了解決決策樹overfitting的問題

**把樹的leaf減少一點**

1. 找leaf的末端
2. 如果leaf的前面node判別為irrevalent
3. 因為他不重要就把該node剪掉，把兩個leaf node合併為一個代替他
4. repeat

該怎麼判斷該node為irrevalent?

所以當我在考慮一個attribute的時候，把他分成不同集合，但是他的positive跟negative跟原先差不多$\equiv$他的gain幾乎=0 -> 他是irrevlent

所以問題：Gain要多大才是有用，多大才是要split

### Significance Test

**背景值**
![](https://i.imgur.com/c3vyh1q.png)
這邊沒有看他數學@@

令$p_k為true 的樣本數$，$n_k為false的樣本數$
背景值為$\hat{p}_k, \hat{n}_k$

所以他的偏移值(deviation)=$\Delta$

然後可以用自己的需求$\Delta$去查表，去看他有沒有顯著性

所以知道當這個**node很重要**，他的偏移量$\Delta$會很大，若是這個**nod不重要**他的偏移量$\Delta$就很小

所以透過這個$\chi^2 pruning$可以生成pruned tree，他可以濾掉很多noise，可以簡化整個tree。


## Early stopping
Information gain是用來建這個tree，選擇哪些node是重要的
$\chi^2 pruning$是這個tree建完之後，把不重要的部分合併

$\chi^2 pruning$跟information gain的概念很像，我們直接融合兩個概念變成**early stopping**，所以他只長重要node，之後就不用花力氣去融合他的leaves

```clike=
if(information gain足夠大 && x2 punning足夠大){
    才會建出那個node
}
```

所以就不會像原本長完整棵樹，而是只長出重要的node -> early stopping


## Advanced議題
### Missing data
若是收集的資料有些dimension沒有數據，該怎麼辦？
### Multivalued
要是某attribute可能有超多分枝(餐廳有100個分支)，這樣在做information gain的時候下出線問題
### Continuous and interger-valued input attribute
某些可能是連續的值(身高、體重，是數值而不是0/1)，他就有無限多可能的value，要透過一些方法把整個連續值切斷(split)來得到最好的information gain
### Continuous-valued output attributes
如果要用decision tree 來output 一個value(decision tree只能output true/false)，這時候我們會需要regression tree


人類容易去理解決策樹，知道她過程判斷什麼。而Neural Network像是黑盒子，不知道他決策的過程，直接output答案



# Evaluating and choosing the Best Hypothesis

選一個hypothesis最可以解釋(預測)未來的資料，(未來資料不要跟過去的樣本有差)

隨便取一個random variable $E_j$
如果$E_j滿足\\
P(E_j|E_{j-1}, E_{j-2}...)=P(E_j)$不同的資料彼此沒有關係
每個資料符合$P(e_j)=P(E_{j-1})=...$模型看的參考的資料會是一樣的

則稱**independent and indentical distributed(iid)**
independent:不同data為獨立
indentical distributed：取自同一個distribution

error rate -> $h(x)\neq y$的出現比例
就算在training set 的error rate很低，也不代表他在tesing set 上error會很低

所以我們會隨機把data split開來成為training set跟testing set

## k-fold cross validation
原本只是隨機split一次，其實很吃運氣，因為不知道split出來的到底是很是壞，很看人品。
所以會有k-fold cross validation，他把資料分成k等分，這邊在李鴻毅的筆記那邊有介紹[李鴻毅筆記validation在最下面](https://hackmd.io/vjlb4Ay3S2u7WY5CO_6OVA?view)

這邊把推展到極致是**leave-one-out cross-validation(LOOCV)**
令現在100筆資料，分成100等份，我們train 99筆，test 1筆...一直下去
常用於**資料很少的時候**(醫學的圖...)

## Peeking
主要因素是"人"，因為人可以看到testing set的結果，進而修改模型的參數，來提升他的效能。
所以就算某種較差的模型，若是透過很狠的調整參數，他的結果反而回超過較好的模型。
這也代表一件事，就是透過"人"將testing set 的資料流入training set之中。

所以現在改變為
1. training set
2. validation set
3. testing set，

我們不能看tesing，只能對validation調參數


## Model selection
對於選擇多少order的多項式可以參考[李鴻毅筆記Bias與variance那邊](https://hackmd.io/vjlb4Ay3S2u7WY5CO_6OVA?view)

一般分為兩部分：
1. model selection(多少order)
2. optimization(調整參數)

一般的步驟：
從簡單的model去fit，逐漸往複雜的model去做修正

### Error Rate
一般會用loss function來判斷$L(y, \hat{y})$

又可以分為$L_1 loss, L_2 loss$

$L_1 loss為y, \hat{y}的絕對差值=|y-\hat{y}|$

$L_2 loss為y, \hat{y}的差值的平方=(y-\hat{y})^2$

![](https://i.imgur.com/nSDYK3m.png)

希望能將loss越來越小

在**實際問題中不是每個出現機率是相等的，所以還要考慮他出現的機率**，所以還要乘上他的probability$P(x,y)$
所以最後得到的expected generalization loss會是：
$GenLoss(h) = \sum L(y, h(x))P(x,y)$

所以可以得到最好的hypothesis就會是$h^* = argminGenLoss(h)$
又$P(x,y)$常常是不知道的，比如辨識照片是一隻貓的機率是多少，但是不知道出現貓照片的機率有多高。

所以直接假設機率是$\frac{1}{N}$重新整理會得到Empirical
$EmpLOss(h) = \frac{1}{N}\sum L(y, h(x))$

![](https://i.imgur.com/xyNNprK.png)

### Regularation
當model很複雜的時候
![](https://i.imgur.com/hQfpRir.png)

## Univriate linear regression
這個過程就是求$w_0,w_1$最fit $y = w_1x+w_0$的過程

希望求出$h_w(x) = w_1x+w_0$之最佳解，稱為linear regression
$\equiv$least square solution（線代）

用有別於線性代數的推倒方法來解釋：
![](https://i.imgur.com/Rvd2eK4.png)
為了minimize loss function
可以把loss function視為一個以$w$為變數的函數
只要分別對loss function做偏微分，可得closed-form solution，可以得到唯一解。
便可以得到最好的$w_0, w_1$

loss function ($L_2$是mean square error 一定滿足)是一個convex$\equiv$他不會有local min，只會有一個最低的凹洞$\equiv$有closed-form solution
![](https://i.imgur.com/hSE9UHC.png)

絕大多數的情況之下是**不會**有closed-form solution的。

### Gradient-decent

![](https://i.imgur.com/uUSQTFW.png)
在這邊設定learinig rate為$\alpha$，可以設定是常數，也可以設定隨時間改變
![](https://i.imgur.com/ueMOjeD.png)
就可以得到$w_0, w_1$的update函式

這邊可以參考[李鴻毅筆記](https://hackmd.io/vjlb4Ay3S2u7WY5CO_6OVA#Regression)有很多圖可以看

<!-- #### Batch gradient descent
有N個training sample，同時都要考慮N個sample
![](https://i.imgur.com/f6B28Tz.png)

這個方法叫做Batch gradient descent，一次看一對data -->

#### Stochastic Gradient Descent
現在大家用這方法，每次隨機挑一些data做訓練

#### Multivariate linear Regression
高維度多項式，模型比較複雜，但是fit比較好

用多變數形成一個曲線，可以整理成
![](https://i.imgur.com/rZ3N2pk.png)
多變量的linear regression，要找出$w^*$使loss最小

![](https://i.imgur.com/Ru6etmy.png)

如果是linear regression有**一般式**可以解，Multivariate linear Regression也可以

所以可以用**least square solution**最小平方法的方法可以解$w^*$
![](https://i.imgur.com/VS5S700.png)

多變量linear regression複雜，但是training效果好

![](https://i.imgur.com/RiU0sam.png)
也因為他很複雜，所以會用regularization把他用smooth一點

![](https://i.imgur.com/k46Bk9A.png)
令q=1對L做regularizationt稱為$L_1$

要用哪種regularization看自己的目的

$L_1 regularization$有個特別作用，要求模型在學習的時候，盡可能不要有weighting，最好有很多$w_i$=0(很稀疏)，稱為**sparse model**，模型比較簡單


## Classification

linear function也可以用來分類
現在目標是找到一個線，將資料分成兩個線

$input(x_1, x_2)$ -> hypothesis -> output(0,1)

![](https://i.imgur.com/ushxJW9.png)
這邊舉了範例，白色 -> 正常地震，黑色 -> 爆炸地震

可以看到(a)圖可以完美的用一條線分類，但是現實中不可能那麼好，要找一條線可以適應(b)的狀況最好

分兩類的linear線稱為，linear separator
如果可以用一linear function分出兩類，則稱**linear separable**。

![](https://i.imgur.com/RLds82F.png)
```
h(x){
    threshold(w內積x)>=0    return 1
    threshold(w內積x)<0    return 0
}
```
現在我們可以用很多種方式求多項式的係數w，我們將求得的w, x放進threshold()之中，判斷他是0還是1

![](https://i.imgur.com/Fpk6kXK.png)
這邊整理看一下數學的意義
根據
$w_i = w_i +\alpha(y-h_w(x))*x_i$
其中注意看$y-h_w(x)$

    1. y=h(x)，這是當h(x的預測值是對的時候)
    2. 當y=1而h(x)預測為0的時候，我們會希望w內積x大一點讓h(x)接近y
    3. 當y=0而h(x)預測為1的時候，我們會希望w內積x小一點讓h(x)接近y

![](https://i.imgur.com/qf2ptQY.png)
可以觀察這個圖（a)），隨著訓練增加，正確率有一直上升，但是好像都還不是很穩定的感覺。
（b）在雜訊比較多的狀況下，而且learning rate 是一常數的狀況下
（c）隨著update越多的情況下，learning rate會越來越小，整個performence會穩定很多。
 
### 原因一

因為他的boundary是一條linear的線，都是非黑即白的狀態，在很多情況下，如果有一個比較soft的boundary會是比較好的選擇，不要這麼武斷

所以可以透過軟化threshold function，用sigmoid function
有下面特質：
1. 連續、和緩的形質
2. 保有threshold的性質

![](https://i.imgur.com/EaH1hRJ.png)
(a)threshold function
(b)logistic function

所以可以得到
$h_w(x)=Logistic(w,x)=\frac{1}{1+e^{-w\cdot x}}$

Logistic Regession需要gradient descent去解決這問題。

![](https://i.imgur.com/S0mG9ne.png)
最後w的update式子可以化成上面的這個式子

可以看這兩個圖對同一筆data的比較：
![](https://i.imgur.com/qf2ptQY.png)
![](https://i.imgur.com/Q1vb3Cm.png)
上面是用**hard threshold**執行
下面是用**logistic regression**然後他soften boundary可以看出他效能因此提升很多。


