
簡介
機器學習模型已經成為多個行業決策過程中的重要組成部分,然而在處理嘈雜或多樣化的數據集時,它們往往會遇到困難。這就是集成學習(Ensemble Learning)發揮作用的地方。
本文將揭示集成學習的奧秘,并介紹其強大的隨機森林算法。無論你是一名數據科學家想要磨煉自己的工具包,還是一名開發人員尋求實用見解以構建穩健的機器學習模型,本文都適合每個人!
通過本文,你將全面了解集成學習以及Python/ target=_blank class=infotextkey>Python中隨機森林的工作原理。因此,無論是經驗豐富的數據科學家,還是只是想擴展機器學習能力,都可以提升你的機器學習專業知識!
1. 什么是集成學習?
集成學習是一種機器學習方法,它將多個弱模型的預測結果組合在一起,以獲得更強的預測結果。集成學習的概念是通過充分利用每個模型的預測能力來減少單個模型的偏差和錯誤。
為了更好地理解,接下來本文舉一個生活中的例子,假設你看到了一種動物,但不知道它屬于哪個物種。因此,你不需要詢問一位專家,而是詢問十位專家,然后由他們中的大多數人投票決定。這就是所謂的“硬投票”。
硬投票是指考慮到每個分類器的類別預測,然后根據具有最大投票數的類別將輸入進行分類。另一方面,軟投票是指考慮每個分類器對每個類別的概率預測,然后根據該類別的平均概率(在分類器概率的平均值上取得)將輸入分類到具有最大概率的類別。
2. 何時使用集成學習?
集成學習總是用于提高模型性能,包括提高分類準確度和降低回歸模型的平均絕對誤差。此外,集成學習總能產生更穩定的模型。當模型之間沒有相關性時,集成學習的效果最好,因為這樣每個模型都可以學習到獨特的內容,從而提高整體性能。
3. 集成學習策略
盡管集成學習可以以多種方式應用在很多方面,但在實踐中,有三種策略因其易于實施和使用而廣受歡迎。這三種策略是:
-
裝袋法(Bagging):Bagging是bootstrap aggregation的縮寫,是一種集成學習策略,它使用數據集的隨機樣本來訓練模型。
-
堆疊法(Stacking):Stacking是堆疊泛化(stacked generalization)的簡稱,是一種集成學習策略。在這種策略中,我們訓練一個模型,將在數據上訓練的多個模型結合起來。
-
提升法(Boosting):提升法是一種集成學習技術,重點在于選擇被錯誤分類的數據來訓練模型。
接下來本文深入探討每種策略,并看看如何使用Python在數據集上訓練這些集成模型。
4. 裝袋法集成學習
裝袋法使用隨機樣本數據,并使用學習算法和平均值來獲取裝袋概率,也稱為自助聚合。它將多個模型的結果聚合起來得到一個綜合的結果。
該方法涉及以下步驟:
-
將原始數據集分割成多個子集,并進行替換。
-
為每個子集開發基礎模型。
-
在運行所有預測之前,同時運行所有模型,并將所有預測結果匯總以獲得最終預測結果。
Scikit-learn提供了實現BaggingClassifier和BaggingRegressor的能力。BaggingMetaEstimator可以識別原始數據集的隨機子集以適應每個基礎模型,然后通過投票或平均的方式將各個基礎模型的預測結果聚合成最終預測結果。該方法通過隨機化構建過程來減少差異。
【Scikit-learn】:https://scikit-learn.org/stable/
【BaggingClassifier】:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingClassifier.html
【BaggingRegressor】:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingRegressor.html
接下來本文以一個示例來說明如何使用scikit-learn
中的裝袋估計器:
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bagging = BaggingClassifier(base_estimator=DecisionTreeClassifier(),n_estimators=10, max_samples=0.5, max_features=0.5)
裝袋分類器需要考慮幾個參數:
-
base_estimator:裝袋方法中使用的基礎模型。這里我們使用決策樹分類器。
-
n_estimators:裝袋方法中將使用的估計器數量。
-
max_samples:每個基礎估計器將從訓練集中抽取的樣本數。
-
max_features:用于訓練每個基礎估計器的特征數量。
現在,本文將在訓練集上擬合該分類器并進行評分。
bagging.fit(X_trAIn, y_train)
bagging.score(X_test,y_test)
對于回歸任務,我們也可以做類似的操作,不同之處在于我們將使用回歸估計器。
from sklearn.ensemble import BaggingRegressor
bagging = BaggingRegressor(DecisionTreeRegressor())
bagging.fit(X_train, y_train)
model.score(X_test,y_test)
5. 堆疊集成學習
堆疊是一種將多個估計器組合在一起以減小它們的偏差并產生準確預測的技術。然后將每個估計器的預測結果進行組合,并輸入到通過交叉驗證訓練的最終預測元模型中;堆疊可以應用于分類和回歸問題。

堆疊的步驟如下:
-
將數據分為訓練集和驗證集。 -
將訓練集分為K個折疊。 -
在K-1個折疊上訓練基礎模型,并在第K個折疊上進行預測。 -
重復步驟3,直到對每個折疊都有一個預測結果。 -
在整個訓練集上擬合基礎模型。 -
使用該模型對測試集進行預測。 -
對其他基礎模型重復步驟3-6。 -
使用測試集的預測結果作為新模型(元模型)的特征。 -
使用元模型對測試集進行最終預測。
在下面的示例中,本文首先創建兩個基礎分類器(RandomForestClassifier和GradientBoostingClassifier)和一個元分類器(LogisticRegression),然后使用K折交叉驗證從這些分類器的預測結果(iris數據集上的訓練數據)中提取特征用于元分類器(LogisticRegression)的訓練。
在使用K折交叉驗證將基礎分類器在測試數據集上進行預測,并將這些預測結果作為元分類器的輸入特征后,再使用這兩者的預測結果進行測試集上的預測,并將其準確性與堆疊集成模型進行比較。
# 加載數據集
data = load_iris()
X, y = data.data, data.target
# 將數據拆分為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 定義基礎分類器
base_classifiers = [
RandomForestClassifier(n_estimators=100, random_state=42),
GradientBoostingClassifier(n_estimators=100, random_state=42)
]
# 定義元分類器
meta_classifier = LogisticRegression()
# 創建一個數組來保存基礎分類器的預測結果
base_classifier_predictions = np.zeros((len(X_train), len(base_classifiers)))
# 使用K折交叉驗證進行堆疊
kf = KFold(n_splits=5, shuffle=True, random_state=42)
for train_index, val_index in kf.split(X_train):
train_fold, val_fold = X_train[train_index], X_train[val_index]
train_target, val_target = y_train[train_index], y_train[val_index]
for i, clf in enumerate(base_classifiers):
cloned_clf = clone(clf)
cloned_clf.fit(train_fold, train_target)
base_classifier_predictions[val_index, i] = cloned_clf.predict(val_fold)
# 在基礎分類器預測的基礎上訓練元分類器
meta_classifier.fit(base_classifier_predictions, y_train)
# 使用堆疊集成進行預測
stacked_predictions = np.zeros((len(X_test), len(base_classifiers)))
for i, clf in enumerate(base_classifiers):
stacked_predictions[:, i] = clf.predict(X_test)
# 使用元分類器進行最終預測
final_predictions = meta_classifier.predict(stacked_predictions)
# 評估堆疊集成的性能
accuracy = accuracy_score(y_test, final_predictions)
print(f"Stacked Ensemble Accuracy: {accuracy:.2f}")
6. 提升集成學習
提升(Boosting)是一種機器學習的集成技術,通過將弱學習器轉化為強學習器來減小偏差和方差。這些弱學習器按順序應用于數據集,首先創建一個初始模型并將其擬合到訓練集上。一旦第一個模型的錯誤被識別出來,就會設計另一個模型來進行修正。
有一些流行的算法和實現方法用于提升集成學習技術。接下來將探討其中最著名的幾種。
6.1 AdaBoost
AdaBoost是一種有效的集成學習技術,通過按順序使用弱學習器進行訓練。每次迭代都會優先考慮錯誤的預測結果,同時減小分配給正確預測實例的權重;這種策略性地強調具有挑戰性的觀察結果,使得AdaBoost隨著時間的推移變得越來越準確,其最終的預測結果由弱學習器的多數投票或加權總和決定。
AdaBoost是一種通用的算法,適用于回歸和分類任務,但在這里本文更關注它在分類問題上的應用,使用Scikit-learn進行演示。接下來看看如何在下面的示例中將其應用于分類任務:
from sklearn.ensemble import AdaBoostClassifier
model = AdaBoostClassifier(n_estimators=100)
model.fit(X_train, y_train)
model.score(X_test,y_test)
在這個示例中,本文使用了Scikit-learn中的AdaBoostClassifier,并將n_estimators
設置為100
。默認的學習器是決策樹,用戶可以進行更改。此外,還可以調整決策樹的參數。
6.2 極限梯度提升(XGBoost)
極限梯度提升(eXtreme Gradient Boosting),更常被稱為XGBoost,是提升集成學習算法中最佳的實現之一,由于其并行計算能力,在單臺計算機上運行非常高效。可以通過機器學習社區開發的xgboost
軟件包來使用XGBoost。
import xgboost as xgb
params = {"objective":"binary:logistic",'colsample_bytree': 0.3,'learning_rate': 0.1,
'max_depth': 5, 'alpha': 10}
model = xgb.XGBClassifier(**params)
model.fit(X_train, y_train)
model.fit(X_train, y_train)
model.score(X_test,y_test)
6.3 LightGBM
LightGBM是另一種基于樹學習的梯度提升算法,但與其他基于樹的算法不同的是,它使用基于葉子的樹生長方式,這使其收斂更快。

在下面的示例中,本文將使用LightGBM解決一個二元分類問題:
import lightgbm as lgb
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)
params = {'boosting_type': 'gbdt',
'objective': 'binary',
'num_leaves': 40,
'learning_rate': 0.1,
'feature_fraction': 0.9
}
gbm = lgb.train(params,
lgb_train,
num_boost_round=200,
valid_sets=[lgb_train, lgb_eval],
valid_names=['train','valid'],
)
結語
集成學習和隨機森林是強大的機器學習模型,機器學習從業者和數據科學家經常使用它們。在本文中,我們介紹了提升集成學習的基本原理、應用場景,并介紹了其中最受歡迎的算法及其在Python中的使用方法。