跳到主要內容

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

評估模型好壞

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

評估模型好壞

  • 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

參考資料

留言

這個網誌中的熱門文章

GSON基礎教學

GSON 前言 JSON是很常見的資料交換格式,在JAVA領域常用處理JSON的函式庫:GSON、FastXML和JSON-B,本章節會以GSON為主,學習目標如下 JSON格式說明 GSON 套件函式 GSON: 物件轉換JSON字串 GSON: JSON字串轉換物件 JSON 格式說明 JSON全名為JavaScript Object Notation,它是一種輕量級的資料交換格式,會大為流行的理由,主要是他比傳統用xml更輕巧且容易處理, JSON表達方式物件會用大括弧{},陣列則是用中括號[]。 用JSON字串來表達Employee的物件內容,由JSON字串可以知道物件name、age、sex和salary屬性。 JSON表示員工資料方式: {“name”:”Jack Bryant”, “age”:18, “sex”:”M”,”salary”:3500.00} JSON陣列表示方式: 跟我們使用JAVA的陣列方式類似,內容值可以是數字’、文字、布林、陣列、物件、null等等。 範例: 字串: [“紅”、”橙”、”黃”、”綠”、”青”、”藍”、”紫”} 布林: [true, true, false, false, true, true] GSON 套件函式 Gson為google所發布的函式庫,主要將物件與json字串之間的轉換時方便使用。當我們將JAVA物件轉換成JSON字串稱為 序列化 ,JSON字串轉換至JAVA物件稱為 反序列化 。 GSON: 物件轉換JSON字串 有了JSON基本概念後,我們進入本章重點,首先我們需要建立員工類別(Employee),定義如下 物件 屬性 員工類別 Employee name 名字 age 年紀 sex 性別 salary 薪水 /** * name:員工類別 */ public class Employee implements Serializable { //constructor public Employee(String name, double salary){ this.name = name; this.sala...

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 ...

PHP與Python搭配

今天介紹如何利用php網頁呼叫目錄下的python程式工作或是資料交換,本人整理的方法有兩種 使用system()、exec()、shell_exec()呼叫程式 (1) string system ( string return_var ] ) 參考網址 官網解釋system()用來執行外部命令,返回為印出的結果,passthru()跟system()類似但是它不會返回結果。 範例1. 利用system執行ls指定並顯示在網頁上,無法使用變數保留ls的結果 檔案名稱: psystem.php $jsondata= system("ls -al", $result); 結果: (2) exec() : string exec ( string output [, int &$return_var ]] ) 參考網址 範例2. 利用exec執行python程式並可以回傳json格式給前端網頁做處理並顯示。我們ptopy.php就是可以看到callpy()為執行py的函式,它執行完pyEx01.py會將結果給$jsondata變數,做後面json解析。 檔案名稱: ptopy.php function callpy() { $jsondata= exec("/usr/bin/python pyEx01.py"); return $jsondata ; } $jsondata= callpy(); echo $jsondata ; echo " " ; $obj = json_decode($jsondata) ; echo "name:".$obj-> { 'name'} .',' ; echo "id:".$obj-> { 'id'} ; 檔案名稱: pyEx01.py import sys ...