在資料科學領域中,隨機森林和提升法是兩種常用的機器學習技術,它們各自具有優勢,適用於不同型別的問題。隨機森林透過整合多棵決策樹的預測結果,有效提升模型的準確性和穩定性,而提升法則透過逐步訓練一系列模型,並根據前一步模型的錯誤調整後續模型的訓練權重,逐步提升模型的預測效能。對於貸款違約預測這類別問題,兩種方法都能提供有效的解決方案,但需要根據資料特性和模型需求選擇合適的模型和引數設定。實務上,我們可以透過OOB錯誤率、變數重要性排序等指標來評估模型的效能,並透過調整超引數和使用正則化技術來避免過度擬合,提升模型的泛化能力。

隨機森林模型與變數重要性分析

隨機森林是一種強大的整合學習方法,透過結合多棵決策樹的預測結果來提升模型的準確性和穩定性。本文將介紹如何在R和Python中實作隨機森林模型,並探討變數重要性的評估方法。

隨機森林模型實作

R語言實作

首先,在R中使用randomForest套件來建立隨機森林模型。以下範例使用loan3000資料集,預測借款人的還款結果。

rf <- randomForest(outcome ~ borrower_score + payment_inc_ratio, data = loan3000)
rf

輸出結果顯示了模型的詳細資訊,包括錯誤率和混淆矩陣。

Python實作

在Python中,可以使用sklearn.ensemble模組中的RandomForestClassifier來建立隨機森林模型。

from sklearn.ensemble import RandomForestClassifier
import pandas as pd

predictors = ['borrower_score', 'payment_inc_ratio']
outcome = 'outcome'
X = loan3000[predictors]
y = loan3000[outcome]

rf = RandomForestClassifier(n_estimators=500, random_state=1, oob_score=True)
rf.fit(X, y)

模型評估:Out-of-Bag (OOB) 錯誤率

OOB錯誤率是評估隨機森林模型效能的重要指標。在R中,可以直接繪製OOB錯誤率與樹數量之間的關係圖。

error_df = data.frame(error_rate = rf$err.rate[, 'OOB'], num_trees = 1:rf$ntree)
ggplot(error_df, aes(x = num_trees, y = error_rate)) + geom_line()

在Python中,需要手動訓練一系列具有不同樹數量的模型,並記錄OOB分數。

n_estimators = list(range(20, 510, 5))
oob_scores = []
for n in n_estimators:
    rf = RandomForestClassifier(n_estimators=n, random_state=1, oob_score=True)
    rf.fit(X, y)
    oob_scores.append(rf.oob_score_)
df = pd.DataFrame({'n': n_estimators, 'oobScore': oob_scores})
df.plot(x='n', y='oobScore')

內容解密:

  • randomForest函式用於建立隨機森林模型,引數outcome ~ borrower_score + payment_inc_ratio指定了預測變數和解釋變數。
  • RandomForestClassifier類別用於Python中的隨機森林建模,n_estimators引數控制了森林中樹的數量。
  • OOB錯誤率用於評估模型的效能,越低的OOB錯誤率表示模型越準確。

預測結果視覺化

利用隨機森林模型進行預測,並將結果視覺化,可以更直觀地理解模型的表現。

R語言視覺化

pred <- predict(rf, prob = TRUE)
rf_df <- cbind(loan3000, pred = pred)
ggplot(data = rf_df, aes(x = borrower_score, y = payment_inc_ratio, shape = pred, color = pred, size = pred)) +
  geom_point(alpha = 0.8) +
  scale_color_manual(values = c('paid off' = '#b8e186', 'default' = '#d95f02')) +
  scale_shape_manual(values = c('paid off' = 0, 'default' = 1)) +
  scale_size_manual(values = c('paid off' = 0.5, 'default' = 2))

Python視覺化

predictions = X.copy()
predictions['prediction'] = rf.predict(X)

fig, ax = plt.subplots(figsize=(4, 4))
predictions.loc[predictions.prediction == 'paid off'].plot(x='borrower_score', y='payment_inc_ratio', style='.', markerfacecolor='none', markeredgecolor='C1', ax=ax)
predictions.loc[predictions.prediction == 'default'].plot(x='borrower_score', y='payment_inc_ratio', style='o', markerfacecolor='none', markeredgecolor='C0', ax=ax)
ax.legend(['paid off', 'default'])
ax.set_xlim(0, 1)
ax.set_ylim(0, 25)
ax.set_xlabel('borrower_score')
ax.set_ylabel('payment_inc_ratio')

內容解密:

  • predict函式用於根據建立的隨機森林模型進行預測。
  • ggplotmatplotlib.pyplot用於視覺化預測結果,直觀展示不同變數對預測結果的影響。

變數重要性評估

隨機森林模型提供了評估變數重要性的功能,可以幫助理解哪些變數對預測結果的影響最大。

R語言實作變數重要性評估

rf_all <- randomForest(outcome ~ ., data = loan_data, importance = TRUE)
varImpPlot(rf_all, type = 1)
varImpPlot(rf_all, type = 2)

Python實作變數重要性評估

rf_all = RandomForestClassifier(n_estimators=500, random_state=1)
rf_all.fit(X, y)
importances = rf_all.feature_importances_

內容解密:

  • importance = TRUE引數使得randomForest函式計算變數的重要性。
  • feature_importances_屬性提供了Python中隨機森林模型變數重要性的評估結果。
  • varImpPlot函式用於視覺化變數重要性,幫助理解不同變數對模型預測的貢獻程度。

隨機森林中的變數重要性評估與超引數調校

在統計機器學習的領域中,隨機森林(Random Forest)是一種強大的整合學習方法。透過對決策樹的整合,隨機森林能夠有效地提高模型的準確性和穩定性。本文將探討隨機森林中的變數重要性評估方法及其超引數調校的重要性。

變數重要性評估

隨機森林提供了一種衡量變數重要性的有效方法,主要透過兩種方式來評估:

  1. 準確度下降(Accuracy Decrease):透過隨機排列某個變數的值,觀察模型的準確度下降程度。這種方法能夠有效地衡量該變數對於模型預測能力的貢獻。

    shuff_acc = metrics.accuracy_score(valid_y, rf.predict(X_t))
    scores[column].append((acc-shuff_acc)/acc)
    
  2. 基尼不純度下降(Gini Impurity Decrease):透過計算基尼不純度的減少量來評估變數的重要性。這種方法衡量了變數在決策樹分裂過程中對於節點純度的改善程度。

    df = pd.DataFrame({
        'feature': X.columns,
        'Accuracy decrease': [np.mean(scores[column]) for column in X.columns],
        'Gini decrease': rf_all.feature_importances_,
    })
    

圖表呈現

此圖示展示了根據準確度下降和基尼不純度下降兩種指標對變數重要性的評估結果。變數的重要性根據準確度下降進行排序。

@startuml
skinparam class {
  BackgroundColor LightGreen
  BorderColor DarkGreen
}

package "隨機森林變數重要性評估" {

  class "變數重要性分析" {
    --評估方法--
    + 準確度下降 (Accuracy Decrease)
    + 基尼不純度下降 (Gini Decrease)
    --
    計算重要性()
    排序變數()
    視覺化呈現()
  }

  object "準確度下降法" {
    概念: 移除變數後準確度的下降程度
    優勢: 直接反映預測能力
    計算: OOB樣本的預測誤差變化
  }

  object "基尼不純度下降法" {
    概念: 變數在分裂節點的貢獻
    優勢: 衡量節點純度改善
    計算: 所有決策樹的平均Gini指數減少量
  }

  class "特徵工程" {
    + borrower_score
    + payment_inc_ratio
    + loan_amnt
    + purpose
    + home_ownership
    --
    選擇重要特徵()
    降維處理()
  }
}

"變數重要性分析" --> "準確度下降法" : 使用
"變數重要性分析" --> "基尼不純度下降法" : 使用
"特徵工程" ..> "變數重要性分析" : 依據分析結果

note right of "準確度下降法"
  計算步驟:
  1. 計算OOB樣本原始準確度
  2. 隨機打亂特定變數值
  3. 重新計算準確度
  4. 準確度下降 = 原始 - 打亂後
end note

note bottom of "基尼不純度下降法"
  Gini指數:
  Gini = 1 - Σ(p_i²)
  變數重要性 = 該變數分裂帶來的
  平均Gini指數下降量
end note

@enduml

內容解密:

  • 此類別圖展示了隨機森林的兩種主要變數重要性評估方法。準確度下降法透過比較移除變數前後的預測準確度變化,直接衡量變數對模型預測能力的貢獻。基尼不純度下降法則從決策樹內部結構出發,計算變數在所有分裂節點上帶來的純度改善總和。
  • 兩種評估方法提供了不同的視角:準確度下降關注預測能力的變化,而基尼不純度下降則關注變數在決策樹中的作用。透過結合兩種方法,可以更全面地理解特徵的重要性,進而優化特徵工程。

超引數調校

隨機森林的效能高度依賴於其超引數的設定。主要的超引數包括:

  1. nodesize / min_samples_leaf:終端節點(葉節點)的最小樣本數量。預設值在分類別問題中通常為1,在迴歸問題中為5。適當地調整這個引數可以避免過擬合。

  2. maxnodes / max_leaf_nodes:決策樹的最大節點數量。預設情況下沒有限制,但可以透過設定最大葉節點數量來間接控制。

超引數調校的重要性

  • 避免過擬合:透過調整nodesizemaxnodes,可以控制模型的複雜度,避免在訓練資料上過擬合。
  • 交叉驗證:使用交叉驗證方法來評估不同超引數設定下的模型效能,從而選擇最優的超引陣列合。

提升法(Boosting)技術詳解

提升法是一種透過組合多個模型來形成預測的通用技術,廣泛應用於機器學習領域。其核心思想是透過逐步訓練一系列模型,並根據前一步模型的錯誤調整後續模型的訓練權重,從而提高整體預測效能。

關鍵概念

  • 整合學習(Ensemble):透過組合多個模型來提高預測準確性。
  • 提升法(Boosting):一種特殊的整合學習方法,透過逐步訓練模型並調整樣本權重來最佳化預測結果。
  • AdaBoost:提升法的早期版本,透過調整樣本權重來訓練模型。
  • 梯度提升法(Gradient Boosting):將提升法視為最佳化問題,透過擬合模型到偽殘差來最小化損失函式。
  • 隨機梯度提升法(Stochastic Gradient Boosting):在梯度提升法的基礎上加入隨機性,透過抽樣樣本和特徵變數來提高模型的泛化能力。

提升法演算法

提升法演算法有多種變體,但基本思想保持一致。以AdaBoost為例,其步驟如下:

  1. 初始化:設定最大模型數量$M$,初始化迭代計數器$m=1$,並為所有樣本設定初始權重$w_i = 1/N$。
  2. 訓練模型:使用當前權重訓練模型$f_m$,使其最小化加權誤差$e_m$。
  3. 更新整合模型:將新模型加入整合模型中,$F_m = F_{m-1} + \alpha_m f_m$,其中$\alpha_m = \log \frac{1-e_m}{e_m}$。
  4. 更新樣本權重:增加被錯誤分類別樣本的權重,權重的增加幅度取決於$\alpha_m$。
  5. 迭代:重複步驟2至4,直到達到最大模型數量$M$。

最終的預測結果由所有模型的加權平均給出:$F = \alpha_1 f_1 + \alpha_2 f_2 + \cdots + \alpha_M f_M$。

程式碼範例與解析

# 以Python實作XGBoost模型訓練
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 資料準備
X = loan3000[['borrower_score', 'payment_inc_ratio']]
y = loan3000['outcome']

# 分割訓練集與測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化XGBoost分類別器
xgb_clf = xgb.XGBClassifier(objective='binary:logistic', subsample=0.63, learning_rate=0.1)

# 訓練模型
xgb_clf.fit(X_train, y_train)

# 進行預測
y_pred = xgb_clf.predict(X_test)

# 評估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"模型準確率:{accuracy:.3f}")

內容解密:

  1. 資料準備:選取borrower_scorepayment_inc_ratio作為特徵變數,將outcome作為目標變數。
  2. 資料分割:使用train_test_split將資料分為訓練集和測試集,比例為8:2。
  3. XGBoost初始化:設定目標函式為二元邏輯迴歸,並啟用隨機抽樣(subsample=0.63)和學習率(learning_rate=0.1)。
  4. 模型訓練與預測:使用訓練集訓練模型,並對測試集進行預測。
  5. 準確率評估:透過比較預測結果和實際值計算模型準確率。

XGBoost實作

XGBoost是一種高效的梯度提升法實作,廣泛應用於資料科學領域。它提供了豐富的引數調優選項,例如subsample控制抽樣比例,eta控制學習率。

R語言範例

# R語言中使用XGBoost進行貸款資料分析
library(xgboost)

# 資料準備
predictors <- data.matrix(loan3000[, c('borrower_score', 'payment_inc_ratio')])
label <- as.numeric(loan3000[, 'outcome']) - 1

# 訓練XGBoost模型
xgb_model <- xgboost(data = predictors, label = label, objective = "binary:logistic",
                     params = list(subsample = 0.63, eta = 0.1), nrounds = 100)

內容解密:

  1. 資料轉換:將預測變數轉換為矩陣格式,將目標變數轉換為0/1標籤。
  2. 模型設定:指定目標函式為二元邏輯迴歸,並設定抽樣比例和學習率。
  3. 模型訓練:使用100輪迭代訓練XGBoost模型。

超引數調優

提升法的效能高度依賴於超引數的選擇,例如XGBoost中的subsampleeta。適當的超引數能夠有效防止過擬合並提升模型泛化能力。

Boosting與過度擬合:以XGBoost為例的分析

Boosting是一種強大的機器學習技術,能夠透過組合多個弱學習器來建立一個強大的預測模型。然而,Boosting也可能導致過度擬合的問題,特別是在使用XGBoost等工具時。本篇文章將探討Boosting的原理、過度擬合的原因以及如何透過正則化技術來避免過度擬合。

XGBoost的預測結果分析

首先,我們來分析XGBoost在貸款違約資料上的預測結果。下面的程式碼展示瞭如何使用XGBoost對貸款資料進行預測,並繪製預測結果的散點圖。

xgb_df.loc[xgb_df.prediction=='default'].plot(
    x='borrower_score', y='payment_inc_ratio', style='o',
    markerfacecolor='none', markeredgecolor='C0', ax=ax)
ax.legend(['paid off', 'default'])
ax.set_xlim(0, 1)
ax.set_ylim(0, 25)
ax.set_xlabel('borrower_score')
ax.set_ylabel('payment_inc_ratio')

內容解密:

  1. 資料篩選與繪圖xgb_df.loc[xgb_df.prediction=='default']篩選出預測為違約的資料,並繪製borrower_scorepayment_inc_ratio的散點圖。
  2. 圖表設定:設定x軸與y軸的範圍,分別為0到1和0到25,並標註坐標軸名稱。
  3. 結果解讀:從圖中可以觀察到,即使借款人評分很高,有些仍然被預測為違約,這表明模型的預測存在一定的噪聲。

過度擬合的問題

過度擬合是機器學習中常見的問題,尤其是在使用複雜模型如XGBoost時。當模型過度擬合訓練資料時,它在訓練集上的表現很好,但在測試集上的表現則明顯下降。

xgb_default = XGBClassifier(objective='binary:logistic', n_estimators=250,
                            max_depth=6, reg_lambda=0, learning_rate=0.3,
                            subsample=1)
xgb_default.fit(train_X, train_y)
pred_default = xgb_default.predict_proba(valid_X)[:, 1]
error_default = abs(valid_y - pred_default) > 0.5
print('default: ', np.mean(error_default))

內容解密:

  1. 模型訓練:使用XGBClassifier訓練模型,目標函式為二元邏輯迴歸,迭代次數為250次。
  2. 預測與評估:對測試集進行預測,並計算錯誤率。結果顯示,訓練集的錯誤率為13.3%,而測試集的錯誤率則高達35.3%。
  3. 過度擬合分析:這表明模型在訓練集上過度擬合,導致在測試集上的表現不佳。

正則化技術:避免過度擬合

正則化是一種透過修改成本函式來懲罰模型複雜度的技術。在XGBoost中,可以透過設定reg_alphareg_lambda引數來實作正則化。

xgb_penalty = XGBClassifier(objective='binary:logistic', n_estimators=250,
                            max_depth=6, reg_lambda=1000, learning_rate=0.1,
                            subsample=0.63)
xgb_penalty.fit(train_X, train_y)
pred_penalty = xgb_penalty.predict_proba(valid_X)[:, 1]
error_penalty = abs(valid_y - pred_penalty) > 0.5
print('penalty: ', np.mean(error_penalty))

內容解密:

  1. 正則化引數設定:設定reg_lambda=1000來增加模型的正則化程度。
  2. 模型訓練與評估:重新訓練模型並評估其在測試集上的表現。結果顯示,測試集的錯誤率下降到32.86%,與訓練集的錯誤率更加接近。
  3. 正則化效果:透過正則化,模型的過度擬合問題得到緩解,預測效能更加穩定。