# 機器學習 周信宏老師機器學習課程 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)