2024-08-27|閱讀時間 ‧ 約 20 分鐘

【資料分析】python機器學習-使用不同的方法來評估模型準確率

raw-image

在評估預測模型的準確率時,不同的評估方法可以從不同的角度分析模型的性能,從而幫助你更全面地理解模型的優缺點。這有助於你選擇最合適的方法來提升模型性能,並根據具體的業務需求做出最佳決策。


# 可使用目錄功能快速確認要閱覽的主題


方法選擇參考:

回歸問題

Mean Squared Error (MSE)

  • 定義: 預測值與實際值之間的平方誤差的平均值。
  • 適用情境: 適合在關注較大誤差並希望懲罰大誤差的情況下使用。

Mean Absolute Error (MAE)

  • 定義: 預測值與實際值之間的絕對誤差的平均值。
  • 適用情境: 適合在對誤差的絕對值敏感且希望避免極端誤差過度影響時使用。

R-squared (R²)

  • 定義: 解釋了模型能解釋的目標變量變異的比例。
  • 適用情境: 適合在需要衡量模型解釋變異能力時使用,尤其在基線模型已知的情況下。

Root Mean Squared Error (RMSE)

  • 定義: MSE 的平方根,保持與數據單位一致。
  • 適用情境: 適合在希望與原數據單位一致並關注較大誤差的影響時使用。


分類問題

Accuracy (準確率)

  • 定義: 正確分類的樣本數占總樣本數的比例。
  • 適用情境: 適合在類別分佈均衡且錯誤成本相近的分類問題中使用。

Precision (精確率)

  • 定義: 模型預測為正類的樣本中,實際為正類的比例。
  • 適用情境: 適合在錯誤陽性(假陽性)代價高的情況下使用,例如垃圾郵件過濾。

Recall (召回率)

  • 定義: 實際為正類的樣本中,模型正確識別的比例。
  • 適用情境: 適合在錯誤陰性(假陰性)代價高的情況下使用,例如疾病篩查。

F1-score

  • 定義: Precision 和 Recall 的調和平均數。
  • 適用情境: 適合在數據不平衡且 Precision 和 Recall 需要平衡時使用。

ROC-AUC (Receiver Operating Characteristic - Area Under Curve)

  • 定義: 表示模型在各種分類閾值下的性能,AUC值越接近1越好。
  • 適用情境: 適合在需要比較多個分類模型的整體性能時使用。


更多詳細解釋可參考:

【資料分析】最清楚分別準確率、精確率、召回率、F1-Score 的差異與使用情境


其它常用模型評估技術

交叉驗證(cross_val_score)

  • 定義: 用於執行模型的交叉驗證操作,從而估計模型的預測性能。它自動執行 K 次訓練和測試,每次使用不同的數據子集,並計算每次測試的性能指標。
  • 適用情境: 適合於當需要對模型進行徹底和穩健的評估時使用,特別是在需要避免過擬合並確保模型具有良好泛化能力的情況下。cross_val_score 提供了對模型性能的穩健估計,使得模型評估不依賴於特定的數據分割,適合用於比較不同模型或超參數調整後的模型效果。


為什麼需要用不同方法做模型的準確率評估?

使用不恰當的評估方法可能會誤導你對模型性能的判斷,導致選擇了不適合的模型,或錯過了潛在的好模型。因此,根據具體的數據特性和業務需求選擇合適的評估方法是至關重要的。

以下是一些例子來說明使用不恰當的評估方法可能會導致的誤導性結論。


1. 不平衡數據集中的高準確率陷阱

  • 問題情境: 假設你在處理一個分類問題,如欺詐檢測,其中95%的交易都是合法的,只有5%是欺詐交易。
  • 錯誤方法: 如果你只使用 accuracy_score 來評估模型的性能,並且模型總是預測所有交易都是合法的,那麼它的準確率會高達95%。
  • 潛在問題: 這樣的高準確率會讓你誤以為模型性能很好,但實際上,它根本無法識別欺詐行為。這對業務來說可能是災難性的,因為模型完全忽略了重要的少數類別。

正確方法: 在這種情況下,應該使用 precisionrecallF1-score 來衡量模型的性能,特別是在識別少數類別(欺詐行為)時的表現。


2. 使用MSE評估非均勻分佈的回歸問題

  • 問題情境: 假設你在預測房價,而數據集中包括了價值非常高的豪宅和普通的住宅。豪宅的價格差異可能非常大,從而產生較大的誤差。
  • 錯誤方法: 如果你只使用 MSE 來評估模型性能,豪宅的價格誤差會被平方放大,導致 MSE 變得非常大。
  • 潛在問題: 這會讓你以為模型表現很差,但事實上,模型對於普通住宅的預測可能是非常準確的。這種情況下,MSE 可能過於強調了豪宅部分的誤差,而忽略了其他部分的良好表現。

正確方法: 在這種情況下,可以考慮使用 MAE 來更均衡地評估模型的表現,因為 MAE 不會像 MSE 那樣過度放大大的誤差。


3. 忽略時間序列的順序特性

  • 問題情境: 你在做時間序列預測,如股價預測。數據的時間順序至關重要,因為未來的數據不應該用來預測過去。
  • 錯誤方法: 如果你在時間序列數據上使用普通的交叉驗證(k-fold cross-validation),可能會隨機分割數據,將未來的數據用於模型訓練,從而違反了時間序列的順序性。
  • 潛在問題: 這會導致過度擬合,並產生不真實的高準確率。模型看起來表現良好,但實際上在真正的預測中可能表現很差,因為它已經看過了未來的信息。

正確方法: 在這種情況下,應該使用時間序列特定的交叉驗證方法,如 TimeSeriesSplit,以保證訓練和測試集的時間順序是正確的。


4. 不考慮異常值的影響

  • 問題情境: 你在做一個簡單的線性回歸,預測某個城市的平均年收入。數據集中有幾個異常值(如某些超高收入的人群),它們嚴重偏離了大多數數據。
  • 錯誤方法: 如果你使用 MSE 來評估模型性能,這些異常值會極大地影響結果,導致 MSE 非常高。
  • 潛在問題: 這會讓你以為模型表現很差,可能讓你錯誤地放棄一個其實對大部分數據表現良好的模型。

正確方法: 在這種情況下,可以考慮使用 MAE,因為它對異常值不敏感,或者考慮對數據進行異常值處理後再評估模型。


回歸問題模型評估指標


Mean Absolute Error (MAE)

預測值與實際值之間差異的絕對值的平均。它衡量了預測值與實際值之間的平均絕對差異。

應用場景:

MAE 適合用於需要衡量預測誤差大小但不想對大誤差給予過大懲罰的場景。對於異常值不敏感,常用於財務、銷售預測等領域。

from sklearn.metrics import mean_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mae = mean_absolute_error(y_true, y_pred)
print("Mean Absolute Error (MAE):", mae)


MAE 優點:

  • 直觀且易於理解:MAE 衡量的是預測值與實際值之間差異的平均絕對值,因此它提供了一個非常直觀的衡量模型誤差的方式。
  • 對異常值不敏感:由於是絕對值,MAE 不會像平方誤差那樣對異常值過於敏感。

MAE 缺點:

  • 缺乏方向性:MAE 不會告訴你誤差是正的還是負的,只給出了誤差的大小。
  • 對誤差的處理相對平等:不像 MSE 那樣能夠給予大誤差更高的權重,這可能在某些情況下是個缺點。


Mean Squared Error (MSE)

預測值與實際值之間差異的平方的平均。它放大並懲罰了大的誤差。

應用場景:

MSE 適合用於需要重點關注並避免大誤差的領域,如制造業和品質控制。

from sklearn.metrics import mean_squared_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mse = mean_squared_error(y_true, y_pred)
print("Mean Squared Error (MSE):", mse)


MSE 優點:

  • 放大大誤差:由於誤差被平方,所以較大的誤差會對總體評分有較大影響,這有助於強調和處理這些大誤差。
  • 廣泛應用:在許多優化算法中,MSE 是自然的性能評估指標,因為其導數(需要用於梯度下降等算法)易於計算。

MSE 缺點:

  • 對異常值高度敏感:由於誤差被平方,因此異常值會對 MSE 造成很大的影響,這可能會導致模型過於關注極端情況。
  • 不易直觀理解誤差的實際大小:由於單位是原始數據的平方,因此較難直觀感知誤差的實際大小。


Root Mean Squared Error (RMSE)

RMSE 是 MSE 的平方根,使得誤差單位與原數據單位一致。

應用場景:

RMSE 適用於需要直接以原始數據單位評估模型誤差大小的場景,如能源消耗、環境監測等。

from sklearn.metrics import mean_squared_error
import numpy as np
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse)
print("Root Mean Squared Error (RMSE):", rmse)


RMSE 優點:

  • 誤差尺度一致性:由於取了平方根,RMSE 的單位與原數據的單位一致,這使得誤差的大小更容易被理解和解釋。
  • 放大大誤差:與 MSE 一樣,RMSE 也放大了大誤差的影響,有助於識別和處理這些情況。

RMSE 缺點:

  • 對異常值仍然敏感:雖然不如 MSE 那麼敏感,但 RMSE 仍然會對異常值有較高的敏感度。
  • 計算相對複雜:涉及到平方和平方根,計算成本稍高於 MAE。


R-squared (R²)

R² 是一個統計量,表示模型解釋的變異量占總變異量的比例,範圍通常在 0 到 1 之間。

應用場景:

R² 廣泛應用於量化模型對數據集變異的解釋程度,特別是在經濟學和社會科學的預測模型中。

from sklearn.metrics import r2_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
r2 = r2_score(y_true, y_pred)
print("R-squared (R²):", r2)


優點:

  • 解釋性強:R² 提供了一個表示模型解釋目標變量變異的百分比的度量,非常直观地顯示了模型的解釋能力。
  • 無單位:R² 是一個無單位的指標,範圍從 0 到 1,這使得它易於與其他模型或不同問題進行比較。

缺點:

  • 可能被誤解:R² 的值可以是負數(當模型比基線還差時),這可能對非技術受眾來說難以理解。
  • 對非線性模型不敏感:在處理非線性關係時,R² 可能不夠敏感,不能充分反映模型對數據的解釋能力。


分類問題模型評估指標


Accuracy (準確率)

正確預測的實例數占總實例數的比例。

應用場景:

適合於類別平衡的數據集。在類別極度不平衡的情況下,Accuracy 可能會給出誤導性的高分。

from sklearn.metrics import accuracy_score
y_true = [0, 1, 0, 1]
y_pred = [0, 1, 0, 0]
accuracy = accuracy_score(y_true, y_pred)
print("Accuracy:", accuracy)


Accuracy 優點:

  • 直觀易懂:準確率提供了一個直接的衡量模型整體正確性的方式。
  • 計算簡單:只需計算正確預測的比例。

Accuracy 缺點:

  • 對類別不平衡不敏感:在類別極度不平衡的數據集中,即使模型只預測多數類也能獲得高準確率。
  • 忽略了不同類別的錯誤成本:對所有類別的錯誤判斷一視同仁,無法反映實際應用中不同錯誤的成本。


Precision (精確率)

正確預測為正類的實例數占所有預測為正類的實例數的比例。

應用場景:

當錯誤的正預測的成本很高時,如在醫療診斷或垃圾郵件檢測中。

from sklearn.metrics import precision_score
y_true = [0, 1, 0, 1]
y_pred = [0, 1, 0, 0]
precision = precision_score(y_true, y_pred)
print("Precision:", precision)


Precision 優點:

  • 重點衡量正類預測的質量:在正類預測非常關鍵的情況下,如欺詐檢測或疾病診斷,精確率非常有用。
  • 有助於降低假正率:對那些將錯誤正類預測視為高成本的應用特別有用。

Precision 缺點:

  • 可能忽略召回率:單獨使用精確率可能會忽略模型識別正類樣本的能力(即召回率低的情況)。


Recall (召回率)

被正確預測為正類的實例數占所有真實正類的實例數的比例。

應用場景:

當錯過正類的成本很高時,如在癌症篩查中,錯過病例的後果非常嚴重。

from sklearn.metrics import recall_score
y_true = [0, 1, 0, 1]
y_pred = [0, 1, 0, 0]
recall = recall_score(y_true, y_pred)
print("Recall:", recall)


Recall 優點:

  • 專注於正類的全面性:召回率衡量了所有正類中被模型正確識別的比例,對於如醫學診斷這樣不能錯過任何正類案例的場景非常重要。
  • 減少假負率:適用於對漏判敏感的應用。

Recall 缺點:

  • 可能忽視精確率:高召回率可能伴隨著更多的假正率(即精確率降低)。


F1-Score

F1-Score 是 Precision 和 Recall 的調和平均,是兩者之間的平衡。

應用場景:

當你需要同時考慮 Precision 和 Recall,且這兩者同等重要時,常見於類別不平衡的情況。

from sklearn.metrics import f1_score
y_true = [0, 1, 0, 1]
y_pred = [0, 1, 0, 0]
f1 = f1_score(y_true, y_pred)
print("F1-Score:", f1)


F1-Score 優點:

  • 平衡精確率和召回率:F1-Score 是精確率和召回率的調和平均,當你需要平衡這兩個指標時非常有用。
  • 適合於不平衡數據集:尤其在正負類比例不均時,提供更實際的性能評估。

F1-Score 缺點:

  • 不容易解釋:相比精確率和召回率,調和平均更難直觀理解。
  • 對極端值敏感:如果精確率或召回率其中之一非常低,F1-Score 也會受到極大影響。


ROC-AUC (Receiver Operating Characteristic - Area Under Curve)

ROC 曲線是真正率對假正率的圖,AUC 表示該曲線下的面積,是模型區分兩個類別的能力的度量。

應用場景:

適合於評價模型在各種閾值下的整體表現,特別是在接收者需要從多個模型中選擇一個最佳模型時。

from sklearn.metrics import roc_auc_score
y_true = [0, 1, 0, 1]
y_scores = [0.1, 0.4, 0.35, 0.8]
roc_auc = roc_auc_score(y_true, y_scores)
print("ROC-AUC Score:", roc_auc)


ROC-AUC 優點:

  • 性能的整體評估:ROC 曲線展示了在不同閾值設定下模型的表現,AUC 表示模型區分正負類的能力。
  • 不受類別分布影響:ROC-AUC 性能不直接受到類別不平衡的影響,對比單一準確率更全面。

ROC-AUC 缺點:

  • 在極端類別不平衡下可能具有誤導性:雖然性能評估不受影響,但在正樣本非常少的情況下,假正率的變化不夠敏感,可能會過分樂觀地評估模型性能。
  • 計算和解釈相對複雜:比起基本的準確率或精確率,ROC 曲線和 AUC 的計算及解釋需要更多的統計知識。


更多詳細解釋可參考:

【資料分析】最清楚分別準確率、精確率、召回率、F1-Score 的差異與使用情境


其它常用模型評估技術


交叉驗證(cross_val_score)

cross_val_score 是 scikit-learn 提供的一個功能,用於執行模型的交叉驗證,它自動將數據集分割成多個子集,進行多次訓練和測試以評估模型的效能。它可以幫助估計模型的性能指標(如準確率、均方誤差等),並通過多次不同的數據子集分割來減少評估的偏差。

應用場景:

  • 模型選擇和調參: 通過交叉驗證多個模型或同一模型的不同參數配置,找出最適合數據的模型或參數設置。
  • 泛化能力評估: 在不同的數據子集上評估模型,以估計模型在新數據上的表現。
  • 避免過擬合: 通過在多個獨立的數據子集上訓練和測試,檢查模型是否過度學習到某一特定子集的特性。
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris

# 加載數據集
data = load_iris()
X, y = data.data, data.target

# 創建隨機森林分類器模型
model = RandomForestClassifier(n_estimators=100, random_state=42)

# 執行 5 折交叉驗證,計算準確率
scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')

# 輸出每一折的準確率以及平均準確率
print("Cross-validation scores:", scores)
print("Mean accuracy:", scores.mean())


交叉驗證(cross_val_score) 優點

  1. 減少過擬合風險:
    • 交叉驗證通過多次將數據集分割成不同的訓練集和測試集來訓練和評估模型,幫助確保模型在未見數據上也能表現良好,從而降低過擬合的風險。
  2. 更可靠的性能評估:
    • 由於模型在多個獨立的數據子集上被評估,因此得到的性能指標(如準確率、精確率等)通常比單次數據分割更加穩定和可靠。
  3. 全面利用可用數據:
    • 在 K 折交叉驗證中,每一個數據點都會被用作訓練和測試,這使得模型訓練可以充分利用所有可用數據,增加學習效率。
  4. 靈活選擇評估指標:
    • cross_val_score 允許選擇不同的性能評估指標,如準確率、F1 分數、ROC-AUC 等,使其適應不同的模型和需求。


交叉驗證(cross_val_score) 缺點

  1. 計算成本高:
    • 交叉驗證需要多次訓練模型,對於大型數據集或計算密集型的模型,這可能導致顯著的計算成本和時間成本。
  2. 數據分割的隨機性:
    • 雖然通常認為交叉驗證可以減少評估的隨機性,但數據的分割方式仍然可能影響模型的性能評估,尤其是在數據量較小或分布不均的情況下。
  3. 不適用於時間序列數據:
    • 標準的交叉驗證方法不考慮數據點之間的時間依賴性,對於時間序列數據可能不合適。這種情況下需要使用專門的時間序列交叉驗證技術。
  4. 管理數據洩漏的挑戰:
    • 在進行交叉驗證時,需要仔細管理數據處理和特徵選擇過程,以防止信息從訓練集洩漏到測試集,尤其是在特徵工程和數據預處理階段。


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.