在評估預測模型的準確率時,不同的評估方法可以從不同的角度分析模型的性能,從而幫助你更全面地理解模型的優缺點。這有助於你選擇最合適的方法來提升模型性能,並根據具體的業務需求做出最佳決策。
# 可使用目錄功能快速確認要閱覽的主題
Mean Squared Error (MSE)
:
Mean Absolute Error (MAE)
R-squared (R²)
Root Mean Squared Error (RMSE)
Accuracy (準確率)
Precision (精確率)
Recall (召回率)
F1-score
ROC-AUC (Receiver Operating Characteristic - Area Under Curve)
更多詳細解釋可參考:
【資料分析】最清楚分別準確率、精確率、召回率、F1-Score 的差異與使用情境
交叉驗證(cross_val_score)
使用不恰當的評估方法可能會誤導你對模型性能的判斷,導致選擇了不適合的模型,或錯過了潛在的好模型。因此,根據具體的數據特性和業務需求選擇合適的評估方法是至關重要的。
以下是一些例子來說明使用不恰當的評估方法可能會導致的誤導性結論。
accuracy_score
來評估模型的性能,並且模型總是預測所有交易都是合法的,那麼它的準確率會高達95%。正確方法: 在這種情況下,應該使用 precision
、recall
和 F1-score
來衡量模型的性能,特別是在識別少數類別(欺詐行為)時的表現。
MSE
來評估模型性能,豪宅的價格誤差會被平方放大,導致 MSE
變得非常大。MSE
可能過於強調了豪宅部分的誤差,而忽略了其他部分的良好表現。正確方法: 在這種情況下,可以考慮使用 MAE
來更均衡地評估模型的表現,因為 MAE
不會像 MSE
那樣過度放大大的誤差。
k-fold cross-validation
),可能會隨機分割數據,將未來的數據用於模型訓練,從而違反了時間序列的順序性。正確方法: 在這種情況下,應該使用時間序列特定的交叉驗證方法,如 TimeSeriesSplit
,以保證訓練和測試集的時間順序是正確的。
MSE
來評估模型性能,這些異常值會極大地影響結果,導致 MSE
非常高。正確方法: 在這種情況下,可以考慮使用 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 缺點:
預測值與實際值之間差異的平方的平均。它放大並懲罰了大的誤差。
應用場景:
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 缺點:
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 缺點:
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² 缺點:
正確預測的實例數占總實例數的比例。
應用場景:
適合於類別平衡的數據集。在類別極度不平衡的情況下,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 缺點:
正確預測為正類的實例數占所有預測為正類的實例數的比例。
應用場景:
當錯誤的正預測的成本很高時,如在醫療診斷或垃圾郵件檢測中。
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 缺點:
被正確預測為正類的實例數占所有真實正類的實例數的比例。
應用場景:
當錯過正類的成本很高時,如在癌症篩查中,錯過病例的後果非常嚴重。
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 是 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 缺點:
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 缺點:
更多詳細解釋可參考:
【資料分析】最清楚分別準確率、精確率、召回率、F1-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) 優點
交叉驗證(cross_val_score) 缺點