---
# System prepended metadata

title: 機器學習

---

# 機器學習
周信宏老師機器學習課程
https://www.youtube.com/watch?v=G0Z-zjIEX8k&list=PLQTu1ykb-JioS6Fa3ZRGEZojgurZmWb4D&index=2
## 機器學習種類
### 考慮學習過程人類是否有監督
* 監督式學習:
 用標記過的資料訓練
* 非監督式學習:
用沒有標記過的資料讓機器自己分類
![螢幕擷取畫面 2024-07-21 181546](https://hackmd.io/_uploads/HJnylPqO0.png)
* 半監督式學習
只有部分分類完的資料，其餘資料根據已分類的進行分群
* 強化式學習
 無法事先標記，只能在機器產生反應時告訴機器對或錯，給予獎勵或處罰，從錯誤中學習
 ![螢幕擷取畫面 2024-07-21 182205](https://hackmd.io/_uploads/HkUwWDcuA.png)
### 考慮能否從傳入的資料進行增量學習
* Batch learing(offline)
訓練時，所有訓練資料要是可用的，只有在訓練完成時model才能用
![螢幕擷取畫面 2024-07-21 182352](https://hackmd.io/_uploads/ByO0bvcd0.png)
* Online learing
資料輸入後，立即重新訓練更新model的權重
![螢幕擷取畫面 2024-07-21 182901](https://hackmd.io/_uploads/HJx-7vq_C.png)
## Neuron and Perceptron
### Neuron(神經元)
input乘以weight加總後輸入神經元，神經元運算後再輸出
![螢幕擷取畫面 2024-07-24 112015](https://hackmd.io/_uploads/H1DXmeC_C.png)
### Perceptron(感知器)
Perceptron是實現神經元的模型
![螢幕擷取畫面 2024-07-24 112603](https://hackmd.io/_uploads/B1fDNgR_R.png)
通過資料訓練調整權重
方法:
![螢幕擷取畫面 2024-07-24 112925](https://hackmd.io/_uploads/SkFXrgA_0.png)
delta w = learning rate * 輸入 * 正確答案跟計算出來的結果的偏差
### 神經網路
![螢幕擷取畫面 2024-07-24 113832](https://hackmd.io/_uploads/Hy7wve0_A.png)
## Multi Layer Perceptron(MLP)
![螢幕擷取畫面 2024-07-24 114303](https://hackmd.io/_uploads/BJoLux0uA.png)
同一層神經元彼此獨立
https://chih-sheng-huang821.medium.com/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-%E5%A4%9A%E5%B1%A4%E6%84%9F%E7%9F%A5%E6%A9%9F-multilayer-perceptron-mlp-%E9%81%8B%E4%BD%9C%E6%96%B9%E5%BC%8F-f0e108e8b9af
https://blog.csdn.net/liaomin416100569/article/details/130572559?spm=1001.2014.3001.5506
https://www.youtube.com/watch?v=aircAruvnKk&list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi&index=1
### 激活函數
(Activate function)
解決非線性問題
https://brickexperts.github.io/2019/09/03/%E6%BF%80%E6%B4%BB%E5%87%BD%E6%95%B0/
* Sigmoid
![螢幕擷取畫面 2024-07-24 114643](https://hackmd.io/_uploads/H1EVKe0_R.png)
    - 輸出介於0到1之間，適合用於輸出機率的模型
因為機率的值就是介於0到1
    - 不適合多層網路模型
* tanh
![螢幕擷取畫面 2024-07-24 115246](https://hackmd.io/_uploads/H1EocxA_C.png)
* Rectified Linear Unit(ReLU)
![螢幕擷取畫面 2024-07-24 115403](https://hackmd.io/_uploads/SypkieA_R.png)
    - 在神經的生理方面，要刺激超過某個強度，才會引發這個神經衝突
ReLU就捕捉了這種生物這個神經元的這個特性
* Softmax
![螢幕擷取畫面 2024-07-24 115840](https://hackmd.io/_uploads/SkN-ngCu0.png)
    - 輸出介於 0~1 ，加總為1，適合多分類的機率模型

### 損失函數 (Loss Function)
計算預測值跟實際值的偏差
https://chih-sheng-huang821.medium.com/%E6%A9%9F%E5%99%A8-%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E4%BB%8B%E7%B4%B9-%E6%90%8D%E5%A4%B1%E5%87%BD%E6%95%B8-loss-function-2dcac5ebb6cb
![螢幕擷取畫面 2024-07-24 120238](https://hackmd.io/_uploads/HkZgTlA_0.png)
* 如何選擇:
看計算出來的 error大小，太大用log縮小，太小用平方放大

![螢幕擷取畫面 2024-07-24 120408](https://hackmd.io/_uploads/S1JUaxC_C.png)
### One-hot Encoding
![螢幕擷取畫面 2024-07-13 150524](https://hackmd.io/_uploads/ryKdPok_0.png)
## 如何調整MLP權重
調整權重讓loss function的值最小
https://chih-sheng-huang821.medium.com/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-%E5%A4%9A%E5%B1%A4%E6%84%9F%E7%9F%A5%E6%A9%9F-multilayer-perceptron-mlp-%E5%90%AB%E8%A9%B3%E7%B4%B0%E6%8E%A8%E5%B0%8E-ee4f3d5d1b41

![螢幕擷取畫面 2024-07-24 121319](https://hackmd.io/_uploads/ByCFJ-Ru0.png)
![螢幕擷取畫面 2024-07-24 121826](https://hackmd.io/_uploads/SkFogWCOA.png)
![螢幕擷取畫面 2024-07-24 121955](https://hackmd.io/_uploads/HJEfZ-COR.png)
![螢幕擷取畫面 2024-07-24 122208](https://hackmd.io/_uploads/HJBKbWCuA.png)
**SGD**
![螢幕擷取畫面 2024-07-24 122514](https://hackmd.io/_uploads/BJ5EG-0dC.png)
一次一筆資料
![螢幕擷取畫面 2024-07-24 122642](https://hackmd.io/_uploads/By7qzWA_0.png)
一次多筆資料
![螢幕擷取畫面 2024-07-24 122751](https://hackmd.io/_uploads/BkvAMZA_A.png)

### Optimizer

使用數值方法在不斷訓練中，更新==權重==和==bias==讓loss function 的誤差能夠最小
https://chih-sheng-huang821.medium.com/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E6%95%B8%E5%AD%B8-%E4%B8%89-%E6%A2%AF%E5%BA%A6%E6%9C%80%E4%BD%B3%E8%A7%A3%E7%9B%B8%E9%97%9C%E7%AE%97%E6%B3%95-gradient-descent-optimization-algorithms-b61ed1478bd7
* SGD
* AdaGrad
自動調整learning rate
* RMSprop
解決AdaGrad  learning rate 急遽下降的問題
* Adam
![螢幕擷取畫面 2024-07-24 123716](https://hackmd.io/_uploads/rkBfrWRuC.png)
## 輸入輸出
### Multi-Input Model
多個輸入單個輸出
ex:商品價格預測
input:照片、品牌、用途...
output:價格
![螢幕擷取畫面 2024-07-24 143131](https://hackmd.io/_uploads/Sk-5l7C_R.png =50%x)
### Multi-Output Model
ex:物件偵測
input:圖片
output:人的性別、年齡...
![螢幕擷取畫面 2024-07-24 143823](https://hackmd.io/_uploads/By5O-mAOC.png =50%x)
### Multi-Input Model and Multi-Output Model
ex:天氣預測
input:衛星雲圖、當前天氣資訊...
output:降雨機率、溫度、濕度...
![螢幕擷取畫面 2024-07-24 144143](https://hackmd.io/_uploads/HyvNGXAdA.png =50%x)

## Model Evaluation Metrics
### Confusion Matrix
![螢幕擷取畫面 2024-07-25 144002](https://hackmd.io/_uploads/rygv7dyFR.png)
* Accuracy:
(TP+TN) / Total
TP數量很少、資料不平均Accracy就會造成誤導 ex:罕見疾病
* Pecision:
TP / (TP+FP) 預測yes的，裡面有多少是真的yes
Covid篩劑出現陽性，真正有中的機率
* Recall(sensitivity):
TP / (TP+FN)
真正是yes的，有多少被預測為yes
recall高:有病的都有找出來
* Specificity
TN / (FP+TN)
沒病的有多少預測真的沒病

* F-measure
F1 score 兼顧 precision 和 recall

![螢幕擷取畫面 2024-07-25 145654](https://hackmd.io/_uploads/SJqSvdyFR.png)

![螢幕擷取畫面 2024-07-25 150002](https://hackmd.io/_uploads/H1K-_OkYA.png)
![螢幕擷取畫面 2024-07-25 150202](https://hackmd.io/_uploads/By6uudJYC.png)
圍的區域越接近正方形越好
![螢幕擷取畫面 2024-07-25 150324](https://hackmd.io/_uploads/By5aO_kKA.png)
ROC圍的面積

### Confusion Matrix
``` python
import numpy as np

# 預測類別
predictions = model.predict(x_test)
predicted_classes = np.argmax(predictions, axis=1)
print(predicted_classes)

import pandas as pd
print(pd.crosstab(y_test.reshape(-1),predicted_classes,rownames=['label'],colnames=['predict']))
```
![螢幕擷取畫面 2024-07-25 150716](https://hackmd.io/_uploads/SyBhFu1FA.png)
## Image convolution
強化影像中的重要特徵，消除不需要的特徵
https://hackmd.io/@allen108108/rkn-oVGA4
Low Pass Filter:
消除高頻雜訊
High Pass Filter:
消除低頻雜訊
![螢幕擷取畫面 2024-07-25 151958](https://hackmd.io/_uploads/ByD-Td1FR.png)
Sobel Filter:
用於邊緣偵測
![螢幕擷取畫面 2024-07-25 152355 (1)](https://hackmd.io/_uploads/SyvVRO1tR.png)
Laplacian Filter:
![螢幕擷取畫面 2024-07-25 152520](https://hackmd.io/_uploads/rkqmROkFA.png)

## CNN
MLP缺點:
圖片太大，需要的權重會很多

CNN會萃取圖片重要的特徵
![螢幕擷取畫面 2024-07-25 153209](https://hackmd.io/_uploads/Skx91FyKA.png)

Zero-padding:
在圖片周圍補0
![螢幕擷取畫面 2024-07-25 153501](https://hackmd.io/_uploads/HJHNxFkK0.png)

Stride:
一次要滑幾格
![螢幕擷取畫面 2024-07-25 153713](https://hackmd.io/_uploads/By_nxFytA.png)

Depth:
用幾個filter
![螢幕擷取畫面 2024-07-25 153802](https://hackmd.io/_uploads/BJty-KJYA.png)

Pooling:
讓圖片變小
![螢幕擷取畫面 2024-07-25 154058](https://hackmd.io/_uploads/H1qcWKyYA.png)

### 超參數
* 圖片必須是2的倍數
* fliter 大小一般用3*3
* Pooling 一般不超過 3*3

## 經典CNN模型
### LeNet
![螢幕擷取畫面 2024-07-25 160038](https://hackmd.io/_uploads/r1DEUY1KR.png)

### AlexNet
* 使用Relu
* 3*3 pooling kernel
* Data augmentation, Dropout
* mini-batch SGD

### VGGNet
* 2*2 pooling kernel
![ufWrLtD](https://hackmd.io/_uploads/BkRwYK1KA.png)

### ResNet
* 首次優於人類的準確率
![螢幕擷取畫面 2024-07-25 161825](https://hackmd.io/_uploads/B1-vqF1K0.png)

## Data Augmentation
讓資料可以更多
不能讓重要特徵不見
### rotation
![螢幕擷取畫面 2024-07-25 163823](https://hackmd.io/_uploads/Hkmry9yYR.png)

### Shift
![螢幕擷取畫面 2024-07-25 164000](https://hackmd.io/_uploads/r1vuyqJF0.png)

### Zoom
![螢幕擷取畫面 2024-07-25 164131](https://hackmd.io/_uploads/SJxmx51K0.png)

### Brightness

![螢幕擷取畫面 2024-07-25 164215](https://hackmd.io/_uploads/HJxVecytC.png)

## OpenCV
跨平台的電腦視覺的函式庫
![螢幕擷取畫面 2024-08-01 130155](https://hackmd.io/_uploads/ryE0U9dF0.png)

![螢幕擷取畫面 2024-08-01 130408](https://hackmd.io/_uploads/r1uLDqdKR.png)
* 影像切割
![螢幕擷取畫面 2024-08-01 130821](https://hackmd.io/_uploads/S17Auc_tR.png)
* 色彩轉換
![螢幕擷取畫面 2024-08-01 130830](https://hackmd.io/_uploads/HkKgK5uFC.png)
* channel slicing
![螢幕擷取畫面 2024-08-01 131027](https://hackmd.io/_uploads/BJHvtcdF0.png)

## Classic Datasets for Data Analysis
### Iris Dataset
娟尾花的數值資料，不是圖片
![螢幕擷取畫面 2024-08-01 131601](https://hackmd.io/_uploads/HyMQ5q_YA.png)
### Boston Housing Dataset
波士頓裡面各個城鎮的資料
多用於房價預測
### Breast Cancer Wisconsin Dataset
乳癌數據
![螢幕擷取畫面 2024-08-01 132316](https://hackmd.io/_uploads/rkfCiq_KC.png)

## Data Preprocessing
### Feature selection
決定要使用那些資料，把不要的刪掉
``` python=
import pandas
df = pd.read_cvs('data.csv')
df.drop(['id','name'])
```
### Dealing with missing data
* delete
如果有feature資料缺失太多，直接捨棄
* fill the gaps
類別:補0
數值:平均、中位數、補0
``` python=
data['price']=data['price'].fillna(data['price'].mean())
```
### Convert data for non-numeric type
* 地址:轉換成經緯度
* 文字:給編號
文字要有可比較性
* 類別:沒有大小關係，用one hot encoding

刪除重複資料
``` python=
data=data.drop_duplicates(keep='first')
```
### Pick out the outliers
![螢幕擷取畫面 2024-08-01 160545](https://hackmd.io/_uploads/HJ-ezadKR.png)

* 處理不平均資料 ex:罕見疾病
1. duplicate the data
2. 刪除部分資料
3. 用 class_weight
![螢幕擷取畫面 2024-08-01 161133](https://hackmd.io/_uploads/BJBBmTOt0.png)

### Standardization
資料範圍有大有小、單位不同
z-score
![螢幕擷取畫面 2024-08-01 161344](https://hackmd.io/_uploads/Sy3J4TdF0.png =50%x)
![螢幕擷取畫面 2024-08-01 161554](https://hackmd.io/_uploads/rk3r4pOYC.png)

### Normalization
把資料壓縮在0到1之間

### Traning strategy
* Regression
直接預測值 ex:股價、房價
* Classification
分類

## Feature Selection
### RFE
每個round結束後把不重要的feature剔除後，再繼續學習
### Filter
根據feature發散的程度(變異數)和feature 和 target 間的相關性來對各個feature 進行評分
* 移除變異數低的feature
* 單變量特徵選擇
* 評分指標
分類問題:ANOVA F-value
regression : f_regression
![螢幕擷取畫面 2024-08-01 163740](https://hackmd.io/_uploads/HkXwK6dYA.png)

## Decision Tree and Random Forest
![螢幕擷取畫面 2024-08-01 163922](https://hackmd.io/_uploads/BJtaF6dtA.png)
![螢幕擷取畫面 2024-08-01 164305](https://hackmd.io/_uploads/HJvs96OtC.png)
