---
# System prepended metadata

title: 機器學習

---

# 機器學習

### Types of machine learning
#### learn under human supervision ?
:::spoiler Supervised learning 監督式學習
- 利用訓練**資料集**(已標記)建立一個模型，依照此模型推測新單體的答案
- 可以使用監督式學習技術來解決已知結果以及已標記資料的問題。
:::
:::spoiler Unsupervised learning 非監督式學習
- 自動對**沒有事先標記過**的資料集進行分類(classify)或分群(cluster)
- 對於未標記資料且目標是發現模式、將類似執行個體分組或偵測異常的場景，可以使用非監督式學習。
:::
:::spoiler Semi-supervised learning 半監督式學習
- 提供只有部分事先標記(labeled)的資料
- 利用沒有標記的資料改善類別(classes)間的界線(boundaries) 
:::
:::spoiler Reinforcement learning 強化式學習
  - 資料無法事先標記
  - 只能在機器做出反應時給予處罰或獎勵來教機器，從嘗試錯誤中學習
:::

#### perform incremental learning from incoming data steams ? 能否從傳入的資料流進行增量學習

:::spoiler  Batch learning 批次學習(離線學習)
  - 所有訓練資料在模型訓練期間必須是可用的(available)
  - 訓練完成後，模型才可以被使用
:::
:::spoiler Online learning 線上學習 
  - 即incremental learning (增量學習)
  - 當一筆資料輸入，重新訓練並立即更新模型的權重(weights)
:::

### Neuron and Perceptron 神經元跟感知器
* perceptron learning algorithm
  1. **initial values**: weights, bias, threshould
  2. **calculate the output value**
  3. **adjust weight**
  4. **repeat 2. and 3.**
![image](https://hackmd.io/_uploads/SkJRNraD0.png)


### Multi-Layer Perceptron (MLP) 多層感知網路
:::success 
**前饋式網路(feedforward neural network)**
- 網路每層都可以包含許多各自獨立的神經元，同一層的神經元不互相連結
- 每層的神經元都會連接到下一層神經元(fully connected)
- [前饋神經網路與遞迴神經網路](https://baubimedi.medium.com/%E9%80%9F%E8%A8%98ai%E8%AA%B2%E7%A8%8B-%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92%E5%85%A5%E9%96%80-%E4%BA%8C-954b0e473d7f)
:::

:::info
**激活函數 Activation function**
- 一般是==非線性函數==(nonlinear function)
- 主要讓神經網路可以加入非線性的因素，讓神經網路可以解決更複雜的問題
:::

#### 常用的激活函數
:::spoiler Sigmoid
![image](https://hackmd.io/_uploads/HkxR1maDR.png)
- 函數輸出介於0到1之間，適合用於輸出**機率**(probabilities)的模型
- 在使用反向傳播調整權重時，會有梯度消失的問題
- 特別不適用於有多層的網路模型(多層時梯度消失問題會更嚴重)
:::
:::spoiler tanh
![image](https://hackmd.io/_uploads/B11DZXawA.png)
- 值介於(-1,1)
- 主要用於分類工作
- 也有梯度消失的問題
:::
:::spoiler Rectified Linear Unit (ReLU)
![image](https://hackmd.io/_uploads/BkF7G7TwA.png)
- 當x小於0時，值設為0。當x大於0時，值設為x。
- 捕捉生物特性，刺激超過某個強度才會引發神經衝突。在實際應用上有效率
- 當x大於0時不會有梯度消失問題，但當x小於0時，權重無法再調整(Dead ReLU problem)
:::
:::spoiler Softmax
![image](https://hackmd.io/_uploads/r1WzNX6PC.png)
- 歸一化指數函數:每個元素取指數次方，加總放在分母，分子為每個元素指數次方，則每個元素對應的值都小於1，但所有元素對應的值加總會等於1
- 適合用於==多分類的機率模型==
:::

:::info
Loss Function 損失函數
- 用於計算**預測值**跟**實際值**之間的偏差
- 偏差越小表示模型越精準
:::

#### 常用的損失函數
* 預測結果是數值型的(從數值大小決定要用哪個)
:::spoiler Mean_squared_error
![image](https://hackmd.io/_uploads/Hk7Hw7pPA.png)

:::
:::spoiler Mean_absolute_error
![image](https://hackmd.io/_uploads/HyvuwXTvA.png)

:::
:::spoiler Mean_absolute_percentage_error
![image](https://hackmd.io/_uploads/rkRYwXpPA.png)

:::
:::spoiler Mean_squared_logarithmic_error
![image](https://hackmd.io/_uploads/BkRMu7TvA.png)

:::
![image](https://hackmd.io/_uploads/SJaTd7pPR.png)
- n代表有多少個分類
:::spoiler Binary_crossentropy
- 主要用於二分類
- 基本上會搭配 sigmoid activation function
- output 要經過 one-hot encoding
:::
:::spoiler Categorical_crossentropy
- 用於多分類
- 基本上會搭配 softmax activation function
- output 要經過 one-hot encoding
:::
:::success
- One-Hot Encoding:用N個bit表示狀態

example:
Binary Encoding:
000,001,010,011,100,101
One-Hot Encoding:
000001,000010,000100,001000,010000,100000
:::

### Strategies for adjusting MLP weights 多層感知網路調整權重的策略
* 神經網路的效率代表他的預測值準不準，由Loss function(L(w))計算
* 神經網路的目的主要就是調整這些權重值，使得他的預測所產生的誤差最小

#### 改進多層感知網路效率的方法
:::spoiler Backpropagation 反向傳播法
- 將神經網路中所有權重對損失函數進行梯度運算(Gradient)
- 做Gradient主要用來更新權重，使得損失函數值最小化
![image](https://hackmd.io/_uploads/SkDFpBIO0.png)
- learning rate 也可以做調整
- 影響梯度的因素:Activation Functions
- Problem 1:
  - 一次用全部訓練集的資訊去計算損失函數的梯度才更新一次權重，收斂速度會很慢
  - 解決方式:用**Stochastic Gradient Descent**來加速
- Problem 2:
  - 梯度下降法無法保證能找到global optimal solution
  - 為了避免困在local minimum，可以利用**Momentum**
:::
:::spoiler Stochastic Gradient Descent (SGD)隨機梯度下降法
- 用隨機逼近(stochastic approach)的梯度下降優化方法
- 一次只會跑一個樣本，就會算一次梯度並更新權重。樣本採隨機抽取
- 一次一次更新，時間還是太慢了
:::
:::spoiler Mini-Batch Gradient Descent 小批次梯度下降法
- 把訓練資料拆解成很多的小份資料，每次就有多筆資料進行訓練
- 好處:
  - Compared with SGD:一個epoch的執行時間比較快
  - Compared with GD:收斂(convergence)速度比較快
- batch size:不能太大，實務上大約設2的某個次方(32~2048)
:::

:::spoiler Momentum 動量法
- 梯度下降的一個變形
- 如果目前gradient的方向跟歷史更新權重(historical weight update)的方向一致，此gradient在這個方向就會被加強，反之則會減弱
![image](https://hackmd.io/_uploads/HJGaQ88uR.png)
:::
:::info
**Optimizer 優化器**
使用數值方法在continuous batch training中更新權重(weight)和偏差值(bias)，使得損失函數的誤差值(error value)能夠最小
:::

#### 常用優化器:
:::spoiler SGD - Stochastic Gradient Descent

:::
:::spoiler AdaGrad - Adaptive Gradient Method
- 學習率(learning rate)不設置固定的值，因為迭代到最後時，值已經非常接近最佳解，調整只算微調
- 在迭代過程中，每次參數優化(parameter optimization)會使用不同學習率
:::
:::spoiler RMSprop - Root Mean Square Propagation
- 自適應(adaptive)學習率的一種方法
- 主要解決AdaGrad學習率急遽下降的問題
- 將gradient除以以往梯度的均方根來做比較，決定後面梯度的改變
- 目前公認最好的優化器之一
:::
:::spoiler Adam - Adaptive Moment Estimation
- 類似RMS Propagation加上Momentum
- 目前公認最好且最常用的優化器之一
:::
### Tensorflow
- 主要透過Computational Graphs來進行運算
- 所有運算都是基於張量(Tensor)來進行的，Tensor是單一資料型態的多維陣列
:::info
先import tensorflow 
```python
import tensorflow as tf
tf.constant([1]) #產生一個tensor，裡面儲存常數1
tf.variable([1]) #變數
```
.ndim:查看維度
:::
#### Flow
- Tensorflow裡面的flow是一種資料流(運算)
- 透過得到資料流的圖(Data Flow Graphs)來進行運算，也就是Computation Graphs
- 計算圖的點代表數學運算，邊代表點跟點之間的關聯性
#### Session
- Session是圖和執行者之間的媒介，透過它可以啟動圖
- 主要負責執行圖的架構
- 在計算時分配資源(CPU, GPU)
- 像檔案總管一樣決定要開啟或是釋放資源(variables, queues, threads,...)
#### Eager Execution
- Dynamic Graph, Execution Mode
- 不需要再定義計算圖
- 不需要初始化的參數
- 不需要用Session.run()來執行，可直接啟動
- Tensor跟Numpy可以混用
#### Keras
- 快速建構Tensorflow的模型
- tf.keras就可以直接啟用
#### [Code](https://colab.research.google.com/drive/1zYG7I4Pcw_ijqxTc5Jsm62HKww0jN_9w?usp=sharing)
:::warning
colab印出圖要使用:
```python=
import IPython.display as display
display.Image(filename='Sequential_Model2.png')
#image = Image.open('Sequential_Model2.png')
#image.show() #會失敗!!
```


:::
### Classic Sample Dataset
* **MNIST Dataset**
  - 手寫數字(0~9)數據庫 
  > Special Database 1:高中生手寫字
  > Special Database 3:員工手寫字
  - 下載:
  1.yann.lecun 
  2.Kaggle
  3.keras
  ```python=
  import keras
  from keras.datasets import mnist
  ```
* **CIFAR-10 Dataset**
  - 60,000張32*32的RGB彩色小照片(10類)
  - CIFAR-100有100類(20*5)
  - 下載:
  1.keras
  ```python=
  from keras.datasets import cifar10
  ```
### Build MLP Model
#### Model Training
:::spoiler Basic Step
**1. Load Libraries (函式庫)**
```python=
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import RMSprop
```

**2. Prameter Configuration 參數設定**
```python=
batch_size = 128 #加速訓練過程(設太小會比較慢，但太快可能沒訓練好)
num_classes = 10 #有10類
epochs = 20 #訓練20趟(trained for 20 iterations)
```

**3. Data Loading and Preprocessing 資料讀取前處裡**
1. 從mnist裡面load資料
2. reshape成為一維資料
3. Normalize : 因像素值介於0到255，除以255使值介於0到1之間，加速
4. 利用to_categorical將一般數字轉換成one-hot encoding

**4. Build Model Architecture 建立模型架構**
- 用Sequential model建構框架
- 依序加入input layer, hidden layer(one fully connected layer), output layer

**5. Model Training 模型訓練**
- model.compile : 設定loss function和optimizer
- model.fit : 進行訓練

**6. Model Evaluation 模型評估**
- model.evaluate : 測試模型效率，會回傳Loss value跟accuracy(準確度)

**7. Model Saving 儲存**
- model.save_weights
:::
#### Sample prediction
:::spoiler Basic steps
**1. Load Libraries**
- 前面模型會用到的函式庫還是要事先import進來

**2. Build Model Architecture**
- 跟前面定義的一樣

**3. Load Model**
- model.load_weight

**4. Read sample**
- 讀取樣本
- tensorflow裡面都是用numpy array，所以要轉成numpy array來儲存

**5. Data Preprocessing**
- reshape, normalize(避免格式不同，造成預測結果不準)

**6. Sample prediction**
- model.predict 輸出各類別的機率
:::

### Model Evaluation Metrics 模型評估標準
:::info
**Confusion matrix 混淆矩陣**
![image](https://hackmd.io/_uploads/ry-7sL0dC.png)
- [機器學習-常見的評估指標](https://dysonma.github.io/2020/12/05/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E5%B8%B8%E8%A6%8B%E7%9A%84%E8%A9%95%E4%BC%B0%E6%8C%87%E6%A8%99/)
:::
:::spoiler Accuracy
- Accuracy = (TP + TF) / Total
- 可能造成一些誤導(unbalance data)。
  - ex.罕見疾病全都說沒病，錯的就很少(可能只有1/1000000)，造成Accuracy很高，但沒有預測正確
:::
:::spoiler Precision
- Precision = TP / (TP + FP)
:::
:::spoiler Recall
- 又Sensitivity(靈敏度)
- Recall = TP / (TP + FN)
:::
:::spoiler Specificity
- Specificity:特異度
- Specificity = TN / (FP + TN)
:::
:::spoiler F-measure
- F1 score
  - F1 score = 2 / (1 / precision + 1 / recall)
- F-measure
  - Fα = (1 + α^2) * precision * recall / (α^2 * (precision + recall)) 
:::
:::info
TPR & FPR
TPR = TP / (TP + FN)
FPR = FP / (FP + TN)
:::
:::spoiler ROC
- Receiver Operating Characteristic curve 受試者操作特徵曲線
- 表達不同模型真陽率對假陽率的函數關係
- 點座標(TPR,FPR)
:::
:::spoiler AUC
- Area Under the Curve = Area of ROC
- 面積越大代表分類越好
:::

### Image Convolution 影像捲積
:::info
* 也被稱作image filtering 影像濾波器
* 主要目的:強化影像中某些重要特徵，消除不想要的特徵
:::
:::spoiler Common convolution effects 常用卷積效果:
- Sharpen
- Blur
- Edge Detection
- Edge Enhancement
- Noice Removal
:::

#### Convolution Operation
:::info
**Convolution 卷積:**
A "filter" (or "kernal") refers to a fixed-size window, such as 3 * 3.
當這個filter在圖片中由左上到右下移動，針對每個pixel的鄰近區域做運算(entrywise product)。
![image](https://hackmd.io/_uploads/rJXF4jC_R.png)
:::
#### 常見Filters
:::spoiler **Smoothing Filter 平滑濾波器**
- 模糊化，去除雜訊
- Loss pass filter
  - 消除影像高頻部分，使影像變均勻一點
  - 消除高頻雜訊，使影像變比較平緩，一般可去除對比強烈的雜點
  - 將所有neighboring pixels的灰階值加總起來，再以平均值取代該像素的灰階值
:::
:::spoiler **Sharpening Filter 邊緣銳化**
- 強化物件邊緣位置
- High pass filter
  - 保持高頻部分，減少或消除低頻部分
  - 原始影像減去loss-pass filter的影像
:::
:::spoiler **Sobel Filter**
- 邊緣偵測
- 有分垂直及水平
![image](https://hackmd.io/_uploads/BJjq3sCuA.png)
![image](https://hackmd.io/_uploads/SJkphs0OA.png)
:::

:::spoiler **Laplacian Filter**
- 邊緣偵測
- 計算central pixel和neighboring pixels的差異，計算差異值的和，取代central pixel的值
![image](https://hackmd.io/_uploads/B1YR6jC_0.png)

:::

###  Convolution Neural Network 卷積神經網路
:::info
減少影像複雜度:
- 只取重要特徵來做訓練
- 特徵由neighboring pixels組成
- 用convolution operation來萃取特徵
:::
- 由輸入層，一些隱藏層，及輸出層所組成
- 隱藏層與MLP差異:不是都是全連接層，裡面包含卷積層(convolution)，池化層(pooling)，激活層(activation)，平坦層(flattening)，及一些全連接層
#### Hyperparameters(超參數) for Convolutional Layers
:::spoiler Zero-padding
- 在做convolution時的問題:邊緣Pixel的neighboring pixels會超出圖片
- 解決方式:add extra zeros at the border of the image 
![image](https://hackmd.io/_uploads/HJbWwqkFA.png)
:::
:::spoiler Stride
-  在做convolution時，filter對應的window一次要滑動多少格?
-  reduce the output of convolution layer
![image](https://hackmd.io/_uploads/rybW_qJK0.png)
:::
:::spoiler Depth
- 在做convolution時，要套幾個filter?
- 如果是RGB彩色的，不同的channel會套上不同的filter，最後再組合起來
:::
:::spoiler Pooling
- 影像太大，留下特徵值就好
- 好處:影像會變小，權重變少，訓練模型時Load會輕一點
![image](https://hackmd.io/_uploads/HyRsK9ktR.png)
:::

**Hyperparameter settings**
- 通常影響大小要能被2整除
  - 常見影像:32, 64, 96, 224, 384, 512
- convolution layer filter跟stride的選擇
  - filter size大部分是3 * 3(太大不一定能有好的作用)
  - stride的選擇跟filter有關，通常不會超過filter的一半
  - Very deep CNN model (16+ layers) 通常用3 * 3 filter 跟 stride 1
- Zero-padding 跟 Pooling layer 是選擇性的
- Pooling layer避免overfitting，降低weights的數量，減少影像包含的資訊，一般而言不會大於3 * 3

### Build CNN model
#### Model Training
:::spoiler Basic Step
**1. Load Libraries (函式庫)**
```python=
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Flatten
from keras.layers import Conv2D, MaxPooling2D
```

**2. Prameter Configuration 參數設定**
```python=
batch_size = 128 #加速訓練過程(設太小會比較慢，但太快可能沒訓練好)
num_classes = 10 #有10類
epochs = 20 #訓練20趟(trained for 20 iterations)
```

**3. Data Loading and Preprocessing 資料讀取前處裡**
1. 從mnist裡面load資料
2. reshape成為一維資料
3. Normalize : 因像素值介於0到255，除以255使值介於0到1之間，加速
4. 利用to_categorical將一般數字轉換成one-hot encoding

**4. Build Model Architecture 建立模型架構**
- 用Sequential model建構框架
- 依序加入convolutional layer, pooling layer, Flatten, fully connected layer, output layer

**5. Model Training 模型訓練**
- model.compile : 設定loss function和optimizer
- model.fit : 進行訓練
- verbose=1 : 顯示進度條(0不顯示) 
- validation_split=0.2 : 訓練過程中拿20%當作validation

**6. Model Evaluation 模型評估**
- model.evaluate : 測試模型效率，會回傳Loss value跟accuracy(準確度)

**7. Model Saving 儲存**
- model.save_weights
:::

#### Sample prediction
:::spoiler Basic steps
**1. Load Libraries**
- 前面模型會用到的函式庫還是要事先import進來

**2. Build Model Architecture**
- 跟前面定義的一樣

**3. Load Model**
- model.load_weight

**4. Load sample**
- 讀取樣本
- 必須遵照訓練資料的格式，convert('L')把圖片轉成灰階，存在numpy.array

**5. Data Preprocessing**
- reshape, normalize(避免格式不同，造成預測結果不準)

**6. Sample prediction**
- model.predict 輸出各類別的機率
:::

### Classic CNN Models
:::spoiler LeNet(1998)
- 用於手寫數字和字母辨識
- 主要利用卷積層，池化層等操作提取特徵，再利用全連接層進行分類的訓練辨識
- the basisi of the latest deep neural network architecture
- Model Architecture 
![image](https://hackmd.io/_uploads/ryTSiLft0.png)

:::
:::spoiler AlexNet(2012)
- 使用非線性的activation function:ReLU(在AlexNet以前大部分使用tanh)
- 使用Data Augmentation和Dropout，防止overfitting
- 使用mini-batch SGD，加速
- Model Architecture:包含8個學習層，5個卷積層，3個全連接層
![image](https://hackmd.io/_uploads/SJuyp8MKR.png)

:::
:::spoiler VGGNet(2014)
- 包含5層卷積層，3層全連接層，softmax輸出層，層之間以MaxPooling分離。
- 使用的activation function:ReLU
- 卷積層使用multiple smaller convolution kernels(3 * 3)
  - 減少參數
  - 可以進行更多非線性映射，增加網路的fitting/expression adility
- 使用small pooling kernel(AlexNet用3 * 3，VGGNet用2 * 2)
- 通道數很多(第一層有64個，每層逐漸增加，直到最大512)
  - 可以讓更多特徵被提取出來
:::
:::spoiler ResNet(2015)
- residual learning解決deep internet裡面梯度消失及精確度下降問題，讓神經網路能get deeper
![image](https://hackmd.io/_uploads/B1apMvMYC.png)
:::

### Image Data Augmentation 影像資料擴增
**Data augmentation**
- rotation 旋轉
- shift 位移，左右移動
- zoom 放大縮小
- brightness 亮度
:::spoiler CNN model building process
**1. Data preprocessing** 
- Data augmentation
- import package
```python=
from numpy import expand_dims
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import ImageDataGenerator
```
**2. Determine the model architecture and parameters**
**3. Compile and train the model**
**4. Model Evaluation**
**5. Hyperparameters tuning**
**6. Repeat steps 2~5 until the model efficiency can no longer be improved**
**7. Predictions**
:::

:::info
Compute class_weight 平衡資料不平衡的狀況
```python=
from sklearn.utils import class_weight
class_weight = class_weight.compute_class_weight('balanced',np.unique(y),y)
```
:::

- 資料量少:
  1. Data Augmentation將資料增加
    - image processing(rotation, shift, zoom,...):用原圖生成出來的，效果有限
    - Generative Adversarial Networks(GAN):生成假照片。以假亂真
  2. Segmentation : 從每個pixel判斷到底是不是
  3. 用traditional machine learning algorithms(Random Forest, SVM,...)
- 資料量不平衡:
  1. 用class weights:定權重
  2. 將資料量變大或減小，讓不同類別的資料數量能夠平衡


### OpenCV (Open Source Computer Vision Library)
- Python program import package
```python=
import cv2
```
#### 常用指令:
:::spoiler Read image
```python=
cv2.imread([filename],[flag])
```
Prameter:
  - filename:圖片檔案路徑 file path (資料型態:string)
  - flag:讀取資料模式 reaging mode (資料型態:int)
- Return : image data (資料型態:numpy.array)
- Description:flag option
  - cv2.IMREAD_GRAYSCALE:圖片轉成灰階
  - cv2.IMREAD_COLOR:圖片是彩色的(Defult)
  - cv2.IMREAD_UNCHANGED:不變
:::
:::spoiler Saving image
```python=
imwrite([filename],[image])
```
- Parameter:
  - filename:儲存後檔名及路徑 saving filename path (資料型態:string)
  - image:image data (資料型態:numpy.array)
- Return : 資料是否儲存成功(資料型態:boolen)
:::
:::spoiler Slicing image 切割影像
- Slice operate:use colons(:) for start, end, and step
![image](https://hackmd.io/_uploads/HkcHfn7FA.png)
```python=
import cv2
img=cv2.imread('lena.jpg')
crop=img[50:500,50:420,:] #xy座標，x座標從50到500之前，y同理
cv2.imwrite('lena.imwrite.jpg',crop)
```
:::
:::spoiler color converting 顏色轉換
```python=
cvtColor([image],[code])
```
- Parameter:
  - image:image data(資料型態:numpy.array)
  - code:converting format(資料型態:int)
- Return:轉換後image data(資料型態:numpy.array)
- Description:commomly used code options
  - cv2.COLOR_BGR2GRAY
  - cv2.COLOR_RGB2BGR
:::
:::spoiler Slicing channels
- Slice operate:use colons(:) for start, end, and step
```python=
import cv2
img=cv2.imread('lena.jpg')
img=img[:,:,0] #拿掉藍色通道
cv2.imwrite('lena_b.jpg',img)
img=img[:,:,2] #拿掉紅色通道(綠色通道為1)
cv2.imwrite('lena_r.jpg',img)
```
:::
:::spoiler Zoom out
```python=
cv2.resize([src],[size],[interpolation])
```
- Parameter:
  - src:圖片資料(資料型態:numpy.array)
  - size:新的圖片大小(資料型態:tuple)
  - interpolation:放大方式(補畫質)(資料型態:int)
- Return:調整後image data (資料型態:numpy.array)
- Description:commomly used interpolation code options
  - cv2.INTER_NEAREST
  - cv2.INTER_LINEAR
  - cv2.INTER_AREA
  - cv2.INTER_CUBIC
  - cv2.INTER_LANCZOS4
:::

### Classic Datasets for Data Analysis
:::spoiler Iris Dataset
- Iris Setosa, Iris Versicolor, Iris Virginica
- 四種特徵:花萼長度及寬度，花瓣長度及寬度
- 每種有50張
- [下載](https://www.kaggle.com/datasets/uciml/iris)
:::
:::spoiler Boston Housing
- 14種城鎮資料，總共506筆記錄
- [下載](https://www.kaggle.com/datasets/kyasar/boston-housing)
:::
:::spoiler Breast Cancer Wisconsin Dataset
- 包含569個samples，每筆資料有10種屬性，每個feature有三種data values:平均值，標準差，最差值，所以總共有30個features
- 資料及分為兩種類別:benign(良性的)，malignant(惡性的)
- 資料不平均:benign有357筆, malignant有212筆
- [下載1](https://archive.ics.uci.edu/dataset/17/breast+cancer+wisconsin+diagnostic)
- [下載2](https://www.kaggle.com/datasets/uciml/breast-cancer-wisconsin-data)
```python=
from sklearn.datasets import load_breast_cancer
bunch = load_breast_cancer()
```
:::

### Data Preprocessing
:::spoiler Feature selection 
- 評估feature的重要性
- 刪除較不重要的feature
  - Pandas DataFrame's drop
```python=
import pandas as pd
df = pd.read_csv('data.csv')
df.drop(['id','name']) #將id及name的column刪除
```
:::
:::spoiler Dealing with missing data
- delete the feature
  - 太多features遺失
  - 用Pandas DataFrame刪除
- fill the gaps補資料
  - 如果是ㄧ些類別就先通通補0，若為數值的資料型態先求其平均
  - 用pandas Series median(), mean(), fillna()
```python=
mean = data['price'].mean() #裡面有值的取出來算平均值
data['price'] = data['price'].fillna(mean) #原本沒有值的全部填上平均值(mean)
``` 
:::
:::spoiler Convert data for non-numeric type
- 轉換成數值
  - 地址:可以轉換成經緯度
  - 文字:給編號，數字有大小關係，文字最好是有可比較性
  - `data['level'] = data['level'].map({'normal':0,'mild':1, 'moderate':2, 'serve':3})`
- 類別型態的資料，沒有可比較性，轉換成one-hot encoding 
:::
:::spoiler delete duplicate data
- 若不是augmentation的資料，重複的資料就要刪掉
- 用pandas DataFrame.drop_duplicates 來刪除資料
```python=
data = data.drop_duplicates(keep='first') #留下第一筆
```
:::
:::spoiler pick out the outliers 挑出離群點
- 用data visualization tools，視覺化較容易看出
:::
:::spoiler Dealing with imbalanced classes
- 導致overfitting
- 資料少的做duplicate或augmentation，資料多的做through out(挑出比較重要的)
- 用class_weight調整權重克服imbalance的狀況
```python=
from sklearn.utils import class_weight
import numpy as np
y = [1,1,1,1,0,0,1]
cw = class_weight.compute_class_weight('balanced'.np.unique(y),y)
print(cw)
```
```python=
[1.75 0.7] #0的權重被調整為1.75，1被調整為0.7
```
:::

:::spoiler Standardization 標準化
- z-score
![image](https://hackmd.io/_uploads/HJOxo6mtC.png)
- x:要被標準化的原始分數
- μ:population mean
- σ:population standard deviation()標準差
```python=
import pandas as pd
import numpy.random as rand
df = pd.DataFrame(rand.randiant(100,200,size=(5,3)),clumns = ['A','B','C'])
print(df)

df_zscore = (df-df.mean())/df.std()
print(df_zscore)
```
:::
:::spoiler Normalization
- 加速，把值壓縮到0~1之間，可以在模型訓練時更快調整權重
- size relationship : min-max normalization，把所有值都處理最大值
- 類別資料:one-hot encoding
:::
:::spoiler Training strategy
- Regression:直接預測值
- Classification:分類(多分類使用one-hot encoding，二分類不用特別轉換)
:::

### Feature selection 特徵選擇
:::spoiler RFE
- Recursive Feature Elimination
  - 用base model。根據feature的數量，迭代feature的選擇。每輪訓練完後移除不重要的feature，繼續執行下一輪訓練，直到達到目標feature數量
  - Implement
```python=
from sklearn.feature_selection import RFE

```
:::
:::spoiler Feature Selection-Filter
- 根據feature發散程度(變異數)以及feature跟target之間的相關性，對各個feature進行評分
- filter method
  - 移除變異數較低的feature 
    - use sklearn variance Threshold package
  - 單變量特徵選擇 
    - 個別計算每個feature的統計指標，根據這個指標判斷feature的重要性，去除不重要的feature
    > 評分指標:
    >- 分類問題(classification problem):
    >f_classif(ANOVA F-value), mutual_info_classif and chi2(chi-square test)
    >- regression problem:
    >f_regression and mutual_info_regression
    > sklearn method:
    > - SelectKBest:用評分指標算出每個feature的得分，根據分數留下**前k名的feature**
    > - SelectPercentile:用評分指標算出每個feature的得分，根據分數留**前下k%的feature**
:::