跳到主要內容

淺談機器學習原理-估模型好壞

評估模型好壞

淺談機器學習原理筆記--

評估模型好壞

  • MSE (Mean Squared Error) 是用來評估模型預測值與實際值之間差異的一種常用指標。將預測誤差平方後平均,懲罰大誤差, MSE 的值越小,表示模型的預測越準確。公式如下:

    MSE=1ni=1n(yiy^i)2MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2

    其中:

    • ( n ) 是樣本數量
    • ( y_i ) 是實際值
    • ( \hat{y}_i ) 是模型的預測值

適合用 MSE 的情境:

  1. 回歸(Regression)問題

不適合用 MSE 的情境:

  1. 資料尺度差異大 :
  2. 對離群值敏感的場景:資料裡常有極端值
  3. 分類問題(Classification)

RMSE (Root Mean Squared Error)

  • RMSE (Root Mean Squared Error)
    RMSE 是 MSE 的平方根,能夠將誤差的單位與原始數據保持一致,因此更容易解釋。公式如下:

    RMSE=1ni=1n(yiy^i)2RMSE = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2}

    其中:

    • ( n ) 是樣本數量
    • ( y_i ) 是實際值
    • ( \hat{y}_i ) 是模型的預測值

    適用情境:

    • 與 MSE 類似,適合回歸問題。
    • 結果的單位和原數據一樣,例如房價是 $10,000,那 RMSE = 8,000 是好解釋的。

    不適合用 RMSE 的情境 :

    • 與 MSE 一樣,對離群值敏感。
  • MAE (Mean Absolute Error)
    MAE 是另一種用來評估模型預測誤差的指標,計算的是預測值與實際值之間誤差的絕對值平均。公式如下:

    MAE=1ni=1nyiy^iMAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|

    其中:

    • ( n ) 是樣本數量
    • ( y_i ) 是實際值
    • ( \hat{y}_i ) 是模型的預測值

    適用情境:

    • 回歸問題,尤其是對離群值不敏感的場景。
    • 當需要簡單解釋誤差時,MAE 提供了直觀的平均偏差。

    不適合用 MAE 的情境:

    • 當需要懲罰大誤差時,MAE 不如 MSE 或 RMSE 敏感。
    • 當數據尺度差異較大時,MAE 可能無法提供足夠的信息。
  • R2R^2 Score (決定係數)
    R2R^2 Score 衡量的是「你的模型預測有多接近真實值」,可以理解為模型對資料的解釋力或擬合度。是用來評估回歸模型性能的一個指標,表示模型解釋變異的能力。其值介於 0 和 1 之間,越接近 1 表示模型的解釋能力越強。公式如下:

    R2=1i=1n(yiy^i)2i=1n(yiyˉ)2R^2 = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{\sum_{i=1}^{n} (y_i - \bar{y})^2}

    其中:

    • ( y_i ): 實際值
    • ( \hat{y}_i ): 模型的預測值
    • ( \bar{y} ): 實際值的平均值
    • ( n ): 樣本數量

    適用情境:

    • 回歸問題,尤其是需要衡量模型對數據變異的解釋能力時。
    • 用於比較不同回歸模型的性能。

    注意事項:

    • R2=1R^2 = 1 時,表示模型完美擬合數據。(預測值 = 真實值)
    • R2=0R^2 = 0 時,表示模型的預測能力與簡單使用平均值的模型相同。
    • R2R^2可能為負值,表示模型的預測能力比使用平均值更差。

    範例:
    假設我們有以下數據:

    • 實際值 y=[3,0.5,2,7]y = [3, -0.5, 2, 7]
    • 預測值 y^=[2.5,0.0,2,8]\hat{y} = [2.5, 0.0, 2, 8]

    因此,模型的 ( R^2 ) Score 約為 0.948,表示模型能解釋約 94.8% 的數據變異。

    適用情境:

    • 回歸問題

    不適合用 MAE 的情境:

    • 如果資料有離群值,R² 容易被影響
  • 混淆矩陣(Confusion Matrix) 是用來評估分類模型性能的一種工具。它是一個表格,顯示了模型的預測結果與實際結果之間的對應關係。混淆矩陣的基本結構如下:

    實際\預測 陽性 (Positive) 陰性 (Negative)
    陽性 TP (True Positive) FN (False Negative)
    陰性 FP (False Positive) TN (True Negative)
    • TP (True Positive): 實際為陽性,且模型預測為陽性
    • FN (False Negative): 實際為陽性,但模型預測為陰性
    • FP (False Positive): 實際為陰性,但模型預測為陽性
    • TN (True Negative): 實際為陰性,且模型預測為陰性

    常見指標

    1. 準確率 (Accuracy):

      Accuracy=TP+TNTP+TN+FP+FNAccuracy = \frac{TP + TN}{TP + TN + FP + FN}

      表示模型預測正確的比例。
    2. 精確率 (Precision):

      Precision=TPTP+FPPrecision = \frac{TP}{TP + FP}

      表示模型預測為陽性的結果中,實際為陽性的比例。
    3. 召回率 (Recall):

      Recall=TPTP+FNRecall = \frac{TP}{TP + FN}

      表示實際為陽性的樣本中,被模型正確預測為陽性的比例。
    4. F1 分數 (F1 Score):

      F1=2PrecisionRecallPrecision+RecallF1 = 2 \cdot \frac{Precision \cdot Recall}{Precision + Recall}

      是精確率與召回率的調和平均,用於平衡兩者。

    適用情境

    • 分類問題: 如垃圾郵件檢測、醫學診斷、信用卡欺詐檢測等。
    • 不平衡資料集: 當正陰性樣本數量差異較大時,混淆矩陣能提供更細緻的評估指標。
    • 模型調參: 幫助選擇最佳的分類閾值或模型參數。

    範例

    假設我們有一個二元分類問題,模型預測結果如下:

    • 實際陽性: 50 個
    • 實際陰性: 50 個
    • 預測陽性: 40 個,其中 35 個為正確預測 (TP),5 個為錯誤預測 (FP)
    • 預測陰性: 60 個,其中 45 個為正確預測 (TN),15 個為錯誤預測 (FN)

    混淆矩陣如下:

    實際\預測 陽性 (Positive) 陰性 (Negative)
    陽性 35 15
    陰性 5 45

    根據此矩陣,我們可以計算:

    • 準確率:
    • Accuracy=35+45100=0.8Accuracy = \frac{35 + 45}{100} = 0.8

    • 精確率:
    • Precision=3535+5=0.875Precision = \frac{35}{35 + 5} = 0.875

    • 召回率:
    • Recall=3535+15=0.7Recall = \frac{35}{35 + 15} = 0.7

    • F1 分數:

      F1=20.8750.70.875+0.70.778F1 = 2 \cdot \frac{0.875 \cdot 0.7}{0.875 + 0.7} \approx 0.778

參考資料

留言

這個網誌中的熱門文章

JavaBean 和POJO

前言 今天介紹JavaBean和POJO的不同,這兩個名詞在JAVA文章常常被拿來使用以及討論。在JDK1.1時候釋出才有的一個標準架構,很多時候常常被搞混,所以我們特別開闢一章來加以討論。POJO規範在企業級應用已經廣大的被使用的規範。 解釋 POJO : 全名為Plain-old-Java-object,只需要繼承Object就可以,沒有特定規定,只要建立的類別有setter/getter方法都可以稱為POJO JavaBean: JavaBean通常用來封裝多個物件成為單獨物件使用,規範比較嚴格,規則如下 規則 說明 1 需要實作序列(Serializable/Externalizable) 2 不能有參數的建構子( no-arg constructor) 3 需要有公用setter/getter 4 屬性必須要私人(private) 5 屬於特定POJO規則 比較 所有的JavaBean都為POJO,但是所有的POJO不一定為JavaBean 都可以當作重複元件 都必須序列化 特性都為可用性、易用性和持久化使用 - 應用 由圖我們可以知道POJO在應用程式中,主要用來存取資料庫資料達到持久化的目的,並提供給商業邏輯流程處理使用。這種POJO的架構提供程式人員開發時的可以很有規則將資料封裝並加以使用。 範例1. JavaBean(以員工為實例) JavaBean建立員工物件,可以發現Employee物件建構子沒有任何參數,屬性為私有化並setter/getter的命名方式。 //實作序列化 public class Employee implements java.io.Serializable{ private int id; private String name; //無參數建構子 public Employee(){} //以下實作setter/getter public void setId(int id){this.id=id;} public int getId(){return id;} public void setName(String ...

Python AI-手寫辨識

Python AI-手寫辨識 類神經網路-手寫辨識 手寫辨識 (1) 問題定義 將輸入手寫數字圖片,經由類神經網路訓練後,可以辨識手寫圖片得到一個正確的答案,例如讓電腦辨識上面圖片手寫數字0-9,都可以認得.在了解問題後,需要先知道輸入的資料格式,例如圖片為NxN的矩陣向量. 輸入:輸入的資料格式有很多種,例如數字圖片為矩陣向量 模型:NN 輸出:輸出的方式,神經網路輸出不一定跟輸入同值,手寫數字輸入為1,輸出有可能是1.1或是1.5等等,所以輸出必須經過轉換成真實世界的數字. (2)定義函式 輸出會有兩個問題: A.輸出利用one-hot encoding來表示,就是N個狀態會對應N的結果,例如:輸出結果為1,表示[0,1,0,0,0,0,0,0,0,0] B.輸出結果不能超過1,我們通常會利用 Softmax函数 來進行輸出的處理. (3) 準備訓練/測試資料 在這邊需要從輸入去定義那些要當作訓練與測試資料,我們手寫資料使用MNIST 資料庫來訓練使用,MNIST共有70,000筆手寫資料,60,000筆為訓練資料,10,000為測試資料. (4)建構類神經網路模型 開始建構我們的神經網路模型,首先決定好28x28的像素(這邊不用擔心如何將圖片轉成矩陣),模型使用SGD的方式進行學習,輸出是一個10為的陣列來表示. 輸入:手寫數字圖片(28x28=784) 模型:SGD 輸出:數字(one hard encoding) (5)學習 首先介紹SGD(Stochastic Gradient Descent) 的學習方式,因為蕾神經網路需要訓練很多次才會提高準確度,SGD最大的好處就是當每次重新學習的會將訓練資料打散,來防止機器學習將答案死背下來. (6)實作開發 下面程式碼有完整的說明,這邊就不多說明了,當開始執行程式時就會進行資料訓練. 由訓練結果最後acc=0.9447,表示準確率可以到達94%,我們再由實際測試可以看出該圖為7的圖示,由神經網路判斷為7,跟我們人類判斷相同,我們可以知道由訓練的結果可看得到不錯的準確度. 執行神經網路遇到不少問題,請參考下面連結,是筆者所整理的問題集,請多多指教 https://programdoubledragon.bl...

Python AI-問題集

Python AI-問題集 問題集 Jupyter Notebook執行ipywidgets會出現kernel死掉的錯誤發生(The kernel appears to have died) 解決方法 (1) 根據log檔來判斷問題: 例如:log訊息出現OMP: Error #15: Initializing libiomp5.dylib, but found libiomp5.dylib already initialized. (2) 根據問題關鍵字找出問題所在: 利用google查詢所遭遇到的問題,例如我把上面的問題上google查詢可以找到這篇的解法 https://blog.csdn.net/bingjianIT/article/details/86182096 (3)實作解法: 我實作下面解法後,就可以順利執行手寫辨識的程式. //在Python宣告時加入 import os os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE" 參考 https://blog.csdn.net/bingjianIT/article/details/86182096