評估分類別模型效能時,不能只看準確率,還需考量其他指標如召回率、特異度、精確率等,尤其在資料不平衡的情況下。ROC 曲線和 AUC 值能更全面地反映模型區分正負樣本的能力,而提升度和增益圖則能評估模型在特定比例資料中的預測效果。實際應用中,面對不平衡資料集,可以採用欠抽樣、過抽樣、權重調整或 SMOTE 等技術來改善模型效能。程式碼範例中,R 語言使用數值積分計算 AUC,Python 則使用 scikit-learn 的 roc_auc_score 函式,並示範如何繪製增益圖以及使用權重調整方法。
評估分類別模型
在評估分類別模型時,準確率(預測分類別正確的百分比)只是第一步。其他指標(如召回率、特異度、精確率)則關注更具體的效能特徵。
ROC 曲線與 AUC
Figure 5-7 展示了貸款模型的 ROC 曲線下面積(AUC)。AUC 的值可以透過數值積分計算。在 R 中,可以使用以下程式碼計算:
sum(roc_df$recall[-1] * diff(1 - roc_df$specificity))
輸出結果為 [1] 0.6926172,表示模型的 AUC 約為 0.69,對應於一個相對較弱的分類別器。
程式碼解析
# 計算 AUC
sum(roc_df$recall[-1] * diff(1 - roc_df$specificity))
內容解密:
roc_df$recall[-1]:取得召回率的值,但不包含第一個元素。diff(1 - roc_df$specificity):計算特異度的差分值,用於數值積分。sum(...):將上述兩個值的乘積相加,得到 AUC 的值。
在 Python 中,可以使用 scikit-learn 的 roc_auc_score 函式計算 AUC:
from sklearn.metrics import roc_auc_score
import numpy as np
# 假設 y 是真實標籤,logit_reg 是邏輯迴歸模型,X 是特徵資料
y_pred_proba = logit_reg.predict_proba(X)[:, 0]
y_true = [1 if yi == 'default' else 0 for yi in y]
print(roc_auc_score(y_true, y_pred_proba))
程式碼解析
# 匯入必要的函式庫
from sklearn.metrics import roc_auc_score
import numpy as np
# 計算 AUC
y_pred_proba = logit_reg.predict_proba(X)[:, 0] # 取得預測機率
y_true = [1 if yi == 'default' else 0 for yi in y] # 將真實標籤轉換為 0 或 1
print(roc_auc_score(y_true, y_pred_proba)) # 輸出 AUC 值
內容解密:
logit_reg.predict_proba(X)[:, 0]:取得邏輯迴歸模型的預測機率。[1 if yi == 'default' else 0 for yi in y]:將真實標籤轉換為 0 或 1。roc_auc_score(y_true, y_pred_proba):計算 AUC 值。
提升度(Lift)與增益圖(Gains Chart)
提升度是指在前 x% 的資料中,模型的預測效果比隨機選擇好多少倍。增益圖則是用來評估模型的預測效果。
計算提升度
# 假設已經有了預測機率和真實標籤
y_pred_proba = logit_reg.predict_proba(X)[:, 1]
y_true = [1 if yi == 'default' else 0 for yi in y]
# 將資料按照預測機率排序
sorted_indices = np.argsort(y_pred_proba)[::-1]
y_true_sorted = [y_true[i] for i in sorted_indices]
# 計算累積增益
cumulative_gains = np.cumsum(y_true_sorted) / np.sum(y_true)
# 繪製增益圖
import matplotlib.pyplot as plt
plt.plot(cumulative_gains)
plt.plot([0, 1], [0, 1], 'k--')
plt.xlabel('累積比例')
plt.ylabel('累積增益')
plt.title('增益圖')
plt.show()
程式碼解析
# 將資料按照預測機率排序
sorted_indices = np.argsort(y_pred_proba)[::-1]
y_true_sorted = [y_true[i] for i in sorted_indices]
# 計算累積增益
cumulative_gains = np.cumsum(y_true_sorted) / np.sum(y_true)
# 繪製增益圖
plt.plot(cumulative_gains)
plt.plot([0, 1], [0, 1], 'k--') # 對角線代表隨機選擇的效果
plt.xlabel('累積比例')
plt.ylabel('累積增益')
plt.title('增益圖')
plt.show()
內容解密:
np.argsort(y_pred_proba)[::-1]:將預測機率排序,取得排序後的索引。np.cumsum(y_true_sorted) / np.sum(y_true):計算累積增益。plt.plot(cumulative_gains):繪製增益圖。
不平衡資料的處理策略
對於不平衡資料,可以採用以下策略:
- 欠抽樣(Undersampling):減少多數類別的樣本數量。
- 過抽樣(Oversampling):增加少數類別的樣本數量。
- 權重調整(Up weight or down weight):調整不同類別的權重。
- 資料生成(Data generation):生成新的少數類別樣本。
重點整理
- 評估分類別模型時,除了準確率外,還需要考慮其他指標,如召回率、特異度、精確率等。
- AUC 是用於評估模型區分正負樣本的能力的指標。
- 提升度(Lift)是用於評估模型在前 x% 資料中的預測效果的指標。
- 不平衡資料的處理策略包括欠抽樣、過抽樣、權重調整和資料生成等。
相關閱讀
- Data Mining by Ian Whitten, Eibe Frank, and Mark Hall (Morgan Kaufmann, 2011)
- Modern Data Science with R by Benjamin Baumer, Daniel Kaplan, and Nicholas Horton (Chapman & Hall/CRC Press, 2017)
- Data Mining for Business Analytics by Galit Shmueli, Peter Bruce, Nitin Patel, Peter Gedeck, Inbal Yahav, and Kenneth Lichtendahl (Wiley, 2007–2020)
不平衡資料的處理策略
在處理分類別問題時,經常會遇到資料不平衡的情況,即某一類別的樣本數量遠遠多於其他類別。這種情況下,模型可能會偏向於多數類別,導致少數類別的預測效果不佳。本文將介紹幾種處理不平衡資料的方法,包括欠取樣、過取樣、權重調整和資料生成等。
欠取樣
欠取樣是指減少多數類別的樣本數量,使其與少數類別的樣本數量更加平衡。這種方法的優點是可以減少資料集的大小,提高模型的訓練速度和預測效果。
內容解密:
- 欠取樣透過減少多數類別的樣本數量來平衡資料集。
- 當少數類別的樣本數量足夠大(通常為數萬)時,欠取樣是一種有效的策略。
- 欠取樣的缺點是可能會丟棄有用的資訊。
# R語言示例
mean(full_train_set$outcome=='default')
[1] 0.1889455
# Python示例
print('percentage of loans in default: ',
100 * np.mean(full_train_set.outcome == 'default'))
內容解密:
- 上述程式碼計算了資料集中違約貸款的比例。
- 結果顯示,只有約19%的貸款違約,這是一個不平衡的資料集。
全資料集訓練模型的結果
如果使用全資料集訓練模型,則模型的預測結果可能會偏向於多數類別(即非違約貸款)。
# R語言示例
full_model <- glm(outcome ~ payment_inc_ratio + purpose_ + home_ +
emp_len_+ dti + revol_bal + revol_util,
data=full_train_set, family='binomial')
pred <- predict(full_model)
mean(pred > 0)
[1] 0.003942094
# Python示例
predictors = ['payment_inc_ratio', 'purpose_', 'home_', 'emp_len_',
'dti', 'revol_bal', 'revol_util']
outcome = 'outcome'
X = pd.get_dummies(full_train_set[predictors], prefix='', prefix_sep='',
drop_first=True)
y = full_train_set[outcome]
full_model = LogisticRegression(penalty='l2', C=1e42, solver='liblinear')
full_model.fit(X, y)
print('percentage of loans predicted to default: ',
100 * np.mean(full_model.predict(X) == 'default'))
內容解密:
- 上述程式碼使用全資料集訓練了一個邏輯迴歸模型。
- 結果顯示,只有約0.39%的貸款被預測為違約,這遠低於實際的違約比例。
過取樣和權重調整
過取樣是指增加少數類別的樣本數量,使其與多數類別的樣本數量更加平衡。權重調整是指為不同類別的樣本分配不同的權重,使模型在訓練時更加關注少數類別。
# R語言示例
wt <- ifelse(full_train_set$outcome=='default',
1 / mean(full_train_set$outcome == 'default'), 1)
full_model <- glm(outcome ~ payment_inc_ratio + purpose_ + home_ +
emp_len_+ dti + revol_bal + revol_util,
data=full_train_set, weight=wt, family='quasibinomial')
pred <- predict(full_model)
mean(pred > 0)
[1] 0.5767208
# Python示例
default_wt = 1 / np.mean(full_train_set.outcome == 'default')
wt = [default_wt if outcome == 'default' else 1
for outcome in full_train_set.outcome]
full_model = LogisticRegression(penalty="l2", C=1e42, solver='liblinear')
full_model.fit(X, y, sample_weight=wt)
print('percentage of loans predicted to default (weighting): ',
100 * np.mean(full_model.predict(X) == 'default'))
內容解密:
- 上述程式碼使用權重調整來平衡資料集。
- 結果顯示,使用權重調整後,模型的預測結果更加平衡。
資料生成
資料生成是指透過對現有資料進行擾動來生成新的資料,以增加少數類別的樣本數量。SMOTE(Synthetic Minority Oversampling Technique)是一種常見的資料生成方法。
內容解密:
- SMOTE透過對現有少數類別樣本進行插值來生成新的樣本。
- SMOTE可以有效地增加少數類別的樣本數量,改善模型的預測效果。
統計機器學習:自動化預測建模的新進展
近年來,統計學領域在發展更強大的自動化預測建模技術方面取得了顯著進步,無論是迴歸還是分類別問題,這些方法都表現出卓越的效能。與前一章討論的方法一樣,這些技術屬於監督式學習的範疇——它們透過已知結果的資料進行訓練,並學習預測新資料的結果。這些方法被歸類別為統計機器學習,與傳統統計方法的區別在於它們是資料驅動的,不試圖在資料上強加線性或其他整體結構。
K-近鄰法:簡單而有效的分類別技術
K-近鄰法是一種非常簡單的技術:根據與某記錄相似的記錄的分類別結果來對該記錄進行分類別。這種方法不需要事先假設資料的分佈或關係,直接從資料中學習。
整合學習與決策樹:最成功的預測建模技術
最成功和廣泛使用的技術是根據整合學習和決策樹的方法。整合學習的基本思想是結合多個模型的預測結果,而不是僅依賴單一模型。決策樹是一種靈活且自動化的技術,用於學習預測變數和結果變數之間的關係。將整合學習與決策樹相結合,形成了一些效能最佳的通用預測建模技術。
內容解密:
- K-近鄰法(K-Nearest Neighbors):根據相似記錄的分類別來決定新記錄的分類別,是一種簡單有效的分類別方法。
- 整合學習(Ensemble Learning):結合多個模型的預測結果,以提高預測的準確性和穩定性。
- 決策樹(Decision Trees):一種用於分類別和迴歸的樹狀模型,透過遞迴地將資料分割成更小的子集來進行預測。
統計機器學習的發展歷程
許多統計機器學習技術的發展可以追溯到加州大學伯克利分校的Leo Breiman和斯坦福大學的Jerry Friedman的工作。他們的研究工作始於1984年對樹模型的開發。隨後在1990年代,Bagging和Boosting等整合方法的發展奠定了統計機器學習的基礎。
內容解密:
- Leo Breiman和Jerry Friedman的工作:兩位統計學家在樹模型和整合方法上的貢獻,為統計機器學習的發展奠定了基礎。
- 樹模型的開發:1984年開始的研究,樹模型是一種用於分類別和迴歸的非引數方法。
- Bagging和Boosting:兩種重要的整合學習方法,透過構建多個模型並結合它們的預測結果來提高預測效能。
不平衡資料的處理策略
在許多實際應用中,資料往往是不平衡的,即某些類別的樣本數量遠遠少於其他類別。處理不平衡資料是一項具有挑戰性的任務。常見的策略包括透過欠取樣豐富類別或過取樣稀有類別來平衡訓練資料。如果稀有類別的樣本仍然不足,可以透過Bootstrapping或SMOTE(合成少數類別過取樣技術)來生成合成資料。
內容解密:
- 不平衡資料(Imbalanced Data):某些類別的樣本數量遠遠少於其他類別,對分類別演算法構成挑戰。
- 欠取樣(Undersampling)和過取樣(Oversampling):透過調整不同類別樣本的數量來平衡訓練資料。
- SMOTE(Synthetic Minority Over-sampling Technique):一種透過生成合成樣本來增加稀有類別樣本數量的方法。
分類別模型的評估指標
除了簡單的準確度外,還有多種評估指標用於評估分類別模型的效能,特別是在稀有類別的情況下。這些指標包括精確率、召回率、F1分數和AUC-ROC等。
內容解密:
- 精確率(Precision):模型預測為正類別的樣本中,真正為正類別的比例。
- 召回率(Recall):所有正類別樣本中,被模型正確預測為正類別的比例。
- F1分數(F1 Score):精確率和召回率的調和平均,用於綜合評估模型的效能。
- AUC-ROC(Area Under the Receiver Operating Characteristic Curve):ROC曲線下的面積,用於評估模型區分不同類別的能力。