# **機器學習重點**
## 2.What is machine learning
:::success
是否有人類監督的 四種分類
:::
* Supervised learning(監督式學習)
在有標籤的數據集上進行訓練,模型學習輸入數據與相應的輸出標籤之間的關係,並用這些已學到的關係 來預測新的數據。
* Unsupervised learning(非監督式學習)
沒有標籤的數據集上進行訓練。目的是從數據中找出隱藏的結構或模式。
* Semi-supervised lesrning(半監督式學習)
一部分有標籤的數據和大量無標籤的數據進行訓練,以提高模型的性能。
* Reinforcement learning(強化式學習)
無事先標記在機器做出反應時 給予正確或錯誤 使機器知道對錯並從中學習
:::info
從傳送的資料流中 增量學習
:::
* Batch learning(批次學習,離線學習)
在一個==固定的數據==集上進行訓練。模型在所有可用的數據上進行一次或多次訓練,訓練完成後模型不會再更新,直到新的一批數據可用並重新進行訓練。
* Online learning(線上學習)
隨著新的數據==不斷更新==。每當有新的數據到達時,模型會進行即時更新,不需要重新訓練整個數據集。
## 4.Neuron and Perceptron
Perceptron learning algorithm(感知器學習算法)
1. Initial values 初始化值
2. Calculate the output value : 計算y的值
3. Adjust weights : 調整權重
4. Repeat steps 2 to 3
## 5.Multi Layer Perceptron(MLP)
多層感知網路

MLP是一種前饋神經網絡 網路每一層都包含各自獨立神經元
### 激活函數
主要作用 : 讓神經網路加入非線性的因素
* Sigmoid: 適合==機率== 不適用於涵多層網路模型
(因為會有梯度消失問題 只在極大=1 或極小值時趨近於直線微分趨近於0)
* Tanh: 也是會有梯度消失問題

* ReLU
x<0時 值都=0 權重無法調整

* Softmax
每個算對應出來都是<1的值 當所有元素相加=1 適合用於多分類機率模型

### Loss function
計算預測值跟實際值的偏差
* 均方誤差 (Mean Squared Error, MSE) 平方誤差的平均值
* 平均絕對誤差 (Mean Absolute Error, MAE) 絕對誤差的平均值
* 平均絕對百分比誤差 (Mean Absolute Percentage Error, MAPE)相對誤差的平均值,以百分比形式表示
* 均方對數誤差 (Mean Squared Logarithmic Error, MSLE) 對數差異的平方平均值
## 6.Strategies for adjusting MLP weights
:::success
神經網路主要目的 調整權重(w*)使得預測所產生誤差L(w*)為最小
:::
1. 反向傳播(Backpropagation)
計算損失函數相對於每個權重的梯度來調整權重,使損失函數最小化。
使用時問題
* 使用訓練集的所有數據一次性計算損失函數的梯度,然後更新權重,收斂速度會非常慢 使用SGD加速
2. 隨機梯度下降(Stochastic Gradient Descent, SGD)
一次只跑一個樣本 就從新更新權重 :arrow_right: 時間太慢
3. 小批量梯度下降(Mini-Batch Gradient Descent)
將資料拆成小份資料 時間快
4. 動量(Momentum)
Gradient方向和歷史更新方向一致時 加強Gradient方向

## 7.Tensorflow
Tensor 單一資料多維陣列
## 9.Build MLP Model
:::spoiler 程式碼
```
# coding=utf-8
# 載入函式庫
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import RMSprop
# 設置參數
batch_size = 128
num_classes = 10
epochs = 20
# 載入mnist資料集的訓練部分: 訓練資料集x_train, y_train(標記)和測試資料集x_test, y_test
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 資料轉成float32和正規化
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# 類別轉換成onehot encoding
y_train = tf.keras.utils.to_categorical(y_train, num_classes)
y_test = tf.keras.utils.to_categorical(y_test, num_classes)
# 模型架構
model = Sequential()
# 輸入層
model.add(Dense(512, activation='relu', input_shape=(784,)))
# 隱藏層
model.add(Dense(512, activation='relu'))
# 輸出層
model.add(Dense(num_classes, activation='softmax'))
# 模型架構摘要
model.summary()
# 編譯模型
model.compile(loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])
# 訓練模型
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
# 評估模型
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
```
:::
## 10.Model Evaluation Metrics
### Confusion Matrix (混淆矩陣結構)
| | True Yes | True NO |
| ----------- |:------------------- | ------------------- |
| Predict Yes | True Positive (TP) | False Positive (FP) |
| Predict NO | False Negative (FN) | True Negative (TN) |
1.Accuracy = (TP+TN)/Total ==*TP 很少時可能造成誤導 如罕見疾病*==
2.Precision = TP/(TP+FP) ==*預測YES裡 到底有多少真的YES*==
3.Recall = TP/(TP+FN) *有病沒病都當有病,可信度低*
4.Specificity = TN/(FP+TN)
## 11.Image Convolution
圖像捲積
1.內核(Filter):
內核是一個小矩陣,通常大小為3x3、5x5或7x7。內核矩陣中的每個值都是一個權重,決定了圖像中對應像素對新像素值的影響程度。
2.滑動窗口:
將內核放在圖像的左上角。內核覆蓋的像素值與內核對應的值相乘並求和,得到一個新的像素值。這個過程會隨著內核滑動整個圖像而重複進行。
3.卷積運算:
對於內核的每個位置,計算內核值與相應圖像像素值的乘積之和。這個和就是輸出圖像中的新像素值。
4.輸出圖像:
卷積的結果是一個新圖像,其中每個像素值是內核應用於原圖像相應位置的結果。
## 12.Convolutional Neural Networks
### MLP與CNN比較
| 特點 | MLP | CNN |
| ------------ | ------------------ |:---------------------------- |
| 層次結構 | 全連接層 | 卷積層、池化層、全連接層 |
| 輸入數據格式 | 一維向量 | 二維矩陣(圖像) |
| 特徵提取能力 | 有限 | 強,能自動提取局部特徵 |
| 參數數量 | 大 | 相對較少(參數共享) |
| 計算效率 | 相對較低 | 高,特別是對於大規模圖像數據 |
| 應用場景 | 表格數據、一維數據 | 圖像、視頻、計算機視覺任務 |
stride(步輻) 也就是每一個小視窗3X3多少步
Depth(深度)
pooling(池化) 只留下重要特徵質 Max Average Global
這層不會學習任何參數 Param=0
## 14 classic CNN model
### LeNet 模型
早期 CNN 結構 主要用tanh當激活函數
:::spoiler 程式碼
```
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Flatten
from keras.layers import Conv2D, AveragePooling2D
from keras.utils.np_utils import to_categorical
# Build LeNet model
def LeNet(input_shape, num_classes):
model = Sequential()
model.add(Conv2D(filters=6, kernel_size=(5, 5), strides=(1, 1),
input_shape=input_shape, activation='tanh', padding='same')) #add捲基層 Fillters 5*5*1=25 6*25=150 150+6=156
model.add(AveragePooling2D(pool_size=(4, 4), strides=(2, 2))) #池化(28-2(pool_size))/2(strides)
model.add(Conv2D(filters=16, kernel_size=(3, 3), strides=(1, 1), #第二卷基層 ((3*3)*6)+1=55 55*16
activation='tanh', padding='same'))
model.add(AveragePooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Flatten()) #展開成一維
model.add(Dense(120, activation='tanh'))
model.add(Dense(84, activation='tanh'))
model.add(Dense(num_classes, activation='softmax'))
return model
# 設定輸入形狀和類別數量
input_shape = (28, 28, 1) # MNIST 圖像大小
num_classes = 10 # 手寫數字 0-9
# 建立模型
model = LeNet(input_shape, num_classes)
# 顯示模型摘要
model.summary()
# 載入 MNIST 數據集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1).astype('float32') / 255
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1).astype('float32') / 255
# 將類別向量轉換為二進制類別矩陣
y_train = to_categorical(y_train, num_classes)
y_test = to_categorical(y_test, num_classes)
# 編譯模型
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 訓練模型
model.fit(x_train, y_train, batch_size=128, epochs=12, validation_split=0.2, verbose=1)
# 評估模型
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
# 進行預測
predictions = model.predict(x_test)
print('Predicted probabilities for first test image:', predictions[0])
print('Predicted class for first test image:', predictions[0].argmax())
```
:::
### AlexNet
使用 ==ReLU== 激活函數 用數據增強 (Data Augmentation) 和 Dropout 來防止Overfitting
使用小批量隨機梯度下降 (Mini-batch SGD) 來加速訓練
Dropout: 在訓練過程中隨機丟棄一部分神經元
### VGGNet
通過使用大量的卷積層來增加網絡的深度。最深的 VGGNet 模型(VGG-19)包含 19 層
這些卷積層的濾波器數量逐層增加,通常是 64、128、256、512 使用 3x3 的小卷積核進行卷積操作。這樣可以保持更多的圖像細節,同時減少參數數量 ==固定池化層==
### ResNet
Residual Block每一層學習到的只是輸入和輸出之間的殘差,而不是整個輸出
跳躍連接(Skip Connection)輸入直接通過一條捷徑傳遞到後面的層,並與後面的層的輸出相加。保證穩定性
## 18 Data Preprocessing
Feature Selection(特徵選擇)
Pandas DataFrame的drop方法刪除欄位
```
import pandas as pd
# 移除不必要的列
df = pd.read_csv('data.csv')
df.drop(['id', 'name'])
```