目錄
集成學習介紹
1. 核心思想
2. 為什么有效?
3. 主要流派與方法
A. 并行方法:Bagging (Bootstrap Aggregating)
B. 串行方法:Boosting
C. 堆疊法:Stacking
代碼示例
Bagging 的代表 —— 隨機森林 (Random Forest)
集成學習介紹
1. 核心思想
集成學習是一種機器學習范式,其核心思想非常直觀:“三個臭皮匠,頂個諸葛亮”。它通過構建并結合多個基學習器(Base Learners)?來完成學習任務,而不是只使用一個單一的模型。
通過將多個性能可能僅優于隨機猜測的弱學習器(Weak Learners)?組合起來,集成方法往往能夠形成一個強學習器(Strong Learner),獲得比任何單一模型都更加顯著優越的泛化性能。
2. 為什么有效?
集成學習有效的根本原因在于它降低了模型的方差(Variance)、偏差(Bias),或同時降低兩者,從而避免了過擬合或欠擬合。
- 統計角度: 假設一個分類任務,25個基分類器每個的錯誤率為 ε = 0.35。如果使用簡單投票法集成,并且假設分類器之間相互獨立,那么集成分類器出錯的概率(即超過一半的分類器都出錯)會遠低于 0.35。這大大提高了準確性。
- 計算角度: 很多學習算法(如決策樹)對數據微小變動非常敏感,容易陷入局部最優。通過多次運行并平均結果,集成方法可以平滑掉這種不穩定性,找到一個更穩定、更魯棒的解決方案。
- 表示角度: 真實世界的假設空間可能非常龐大,單個模型可能無法找到最優解。集成多個模型相當于擴展了假設空間,從而有可能逼近那個真正的、更優的解。
3. 主要流派與方法
集成學習方法主要分為兩大類:
A. 并行方法:Bagging (Bootstrap Aggregating)
- 核心思想:通過自助采樣法(Bootstrap Sampling)?從原始數據集中隨機有放回地抽取多個子集,并行地訓練多個基學習器,然后通過投票(分類)?或平均(回歸)?的方式結合預測結果。
- 目標:主要旨在降低方差,特別適用于那些容易過擬合的復雜模型(如深度決策樹)。
- 典型算法:
- 隨機森林(Random Forest): Bagging 的升級版和代表作。它在構建每棵決策樹時,不僅對樣本進行隨機采樣,還對特征進行隨機采樣。這種“雙重隨機性”進一步增強了模型的多樣性和泛化能力,有效防止過擬合。
B. 串行方法:Boosting
- 核心思想:基學習器是串行訓練的。后續的模型會更加關注先前模型預測錯誤的樣本,通過不斷調整樣本的權重或擬合殘差,逐步提升整體性能。
- 目標:主要旨在降低偏差,將多個弱學習器提升為一個強學習器。
- 典型算法:
- AdaBoost (Adaptive Boosting): 通過逐步提高被錯誤分類樣本的權重,迫使后續的弱分類器重點關注這些難分的樣本。
- 梯度提升(Gradient Boosting): 不再是調整樣本權重,而是通過擬合損失函數的負梯度(即殘差)?來迭代地構建模型。每一個新模型都是在學習之前所有模型加總的殘差。
- XGBoost, LightGBM, CatBoost: 這些都是 Gradient Boosting 的高效、高性能實現,在各類數據科學競賽中占據統治地位。它們通過優化計算速度、處理缺失值、防止過擬合等方面進行了大量改進。
C. 堆疊法:Stacking
- 核心思想:訓練多個異質的基學習器(第一層模型),然后不是簡單投票,而是訓練一個元學習器(Meta-Learner,第二層模型)?來整合基學習器的預測結果,以得到最終的輸出。
- 目標:結合不同模型的優勢,形成更強大的預測能力。
代碼示例
Bagging 的代表 —— 隨機森林 (Random Forest)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, ConfusionMatrixDisplay
from sklearn.tree import DecisionTreeClassifier# 1. 加載數據(威斯康星州乳腺癌數據集)
data = load_breast_cancer()
X, y = data.data, data.target
feature_names = data.feature_names# 2. 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)print("數據集形狀:", X.shape) # (569, 30)
print("特征示例:\n", feature_names[:5]) # ['mean radius' 'mean texture' 'mean perimeter' 'mean area' 'mean smoothness']
print("目標標簽: 0-惡性(Malignant), 1-良性(Benign)") # 0-惡性(Malignant), 1-良性(Benign)# 3. 訓練一個單一的決策樹(作為對比基準)
single_tree = DecisionTreeClassifier(random_state=42)
single_tree.fit(X_train, y_train)
y_pred_tree = single_tree.predict(X_test)
acc_tree = accuracy_score(y_test, y_pred_tree)
print(f"\n單一決策樹準確率: {acc_tree:.4f}") # 0.9474# 4. 訓練隨機森林集成模型
# n_estimators: 森林中樹的數量
# max_features: 尋找最佳分割時考慮的最大特征數,'sqrt'是常用值,即總特征數的平方根
# random_state: 確保結果可重現
rf_clf = RandomForestClassifier(n_estimators=100, max_features='sqrt', random_state=42)
rf_clf.fit(X_train, y_train)# 5. 在測試集上進行預測并評估
y_pred_rf = rf_clf.predict(X_test)
acc_rf = accuracy_score(y_test, y_pred_rf)
print(f"隨機森林準確率: {acc_rf:.4f}") # 0.9649# 6. 可視化特征重要性(集成模型的強大附加功能)
importances = rf_clf.feature_importances_
indices = np.argsort(importances)[::-1] # 按重要性降序排列索引plt.figure(figsize=(10, 6))
plt.title("Random Forest - Feature Importances")
plt.bar(range(X_train.shape[1]), importances[indices], align='center')
plt.xticks(range(X_train.shape[1]), [feature_names[i] for i in indices], rotation=90)
plt.tight_layout()
plt.show()# 7. 繪制混淆矩陣
cm = confusion_matrix(y_test, y_pred_rf, labels=rf_clf.classes_)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Malignant', 'Benign'])
disp.plot(cmap='Blues')
plt.title("Random Forest Confusion Matrix")
plt.show()