十分鐘掌握Python集成學(xué)習(xí)和隨機(jī)森林算法
簡(jiǎn)介
機(jī)器學(xué)習(xí)模型已經(jīng)成為多個(gè)行業(yè)決策過(guò)程中的重要組成部分,然而在處理嘈雜或多樣化的數(shù)據(jù)集時(shí),它們往往會(huì)遇到困難。這就是集成學(xué)習(xí)(Ensemble Learning)發(fā)揮作用的地方。
本文將揭示集成學(xué)習(xí)的奧秘,并介紹其強(qiáng)大的隨機(jī)森林算法。無(wú)論你是一名數(shù)據(jù)科學(xué)家想要磨煉自己的工具包,還是一名開發(fā)人員尋求實(shí)用見解以構(gòu)建穩(wěn)健的機(jī)器學(xué)習(xí)模型,本文都適合每個(gè)人!
通過(guò)本文,你將全面了解集成學(xué)習(xí)以及Python中隨機(jī)森林的工作原理。因此,無(wú)論是經(jīng)驗(yàn)豐富的數(shù)據(jù)科學(xué)家,還是只是想擴(kuò)展機(jī)器學(xué)習(xí)能力,都可以提升你的機(jī)器學(xué)習(xí)專業(yè)知識(shí)!
1. 什么是集成學(xué)習(xí)?
集成學(xué)習(xí)是一種機(jī)器學(xué)習(xí)方法,它將多個(gè)弱模型的預(yù)測(cè)結(jié)果組合在一起,以獲得更強(qiáng)的預(yù)測(cè)結(jié)果。集成學(xué)習(xí)的概念是通過(guò)充分利用每個(gè)模型的預(yù)測(cè)能力來(lái)減少單個(gè)模型的偏差和錯(cuò)誤。
為了更好地理解,接下來(lái)本文舉一個(gè)生活中的例子,假設(shè)你看到了一種動(dòng)物,但不知道它屬于哪個(gè)物種。因此,你不需要詢問(wèn)一位專家,而是詢問(wèn)十位專家,然后由他們中的大多數(shù)人投票決定。這就是所謂的“硬投票”。
硬投票是指考慮到每個(gè)分類器的類別預(yù)測(cè),然后根據(jù)具有最大投票數(shù)的類別將輸入進(jìn)行分類。另一方面,軟投票是指考慮每個(gè)分類器對(duì)每個(gè)類別的概率預(yù)測(cè),然后根據(jù)該類別的平均概率(在分類器概率的平均值上取得)將輸入分類到具有最大概率的類別。
2. 何時(shí)使用集成學(xué)習(xí)?
集成學(xué)習(xí)總是用于提高模型性能,包括提高分類準(zhǔn)確度和降低回歸模型的平均絕對(duì)誤差。此外,集成學(xué)習(xí)總能產(chǎn)生更穩(wěn)定的模型。當(dāng)模型之間沒(méi)有相關(guān)性時(shí),集成學(xué)習(xí)的效果最好,因?yàn)檫@樣每個(gè)模型都可以學(xué)習(xí)到獨(dú)特的內(nèi)容,從而提高整體性能。
3. 集成學(xué)習(xí)策略
盡管集成學(xué)習(xí)可以以多種方式應(yīng)用在很多方面,但在實(shí)踐中,有三種策略因其易于實(shí)施和使用而廣受歡迎。這三種策略是:
- 裝袋法(Bagging):Bagging是bootstrap aggregation的縮寫,是一種集成學(xué)習(xí)策略,它使用數(shù)據(jù)集的隨機(jī)樣本來(lái)訓(xùn)練模型。
- 堆疊法(Stacking):Stacking是堆疊泛化(stacked generalization)的簡(jiǎn)稱,是一種集成學(xué)習(xí)策略。在這種策略中,我們訓(xùn)練一個(gè)模型,將在數(shù)據(jù)上訓(xùn)練的多個(gè)模型結(jié)合起來(lái)。
- 提升法(Boosting):提升法是一種集成學(xué)習(xí)技術(shù),重點(diǎn)在于選擇被錯(cuò)誤分類的數(shù)據(jù)來(lái)訓(xùn)練模型。
接下來(lái)本文深入探討每種策略,并看看如何使用Python在數(shù)據(jù)集上訓(xùn)練這些集成模型。
4. 裝袋法集成學(xué)習(xí)
裝袋法使用隨機(jī)樣本數(shù)據(jù),并使用學(xué)習(xí)算法和平均值來(lái)獲取裝袋概率,也稱為自助聚合。它將多個(gè)模型的結(jié)果聚合起來(lái)得到一個(gè)綜合的結(jié)果。
該方法涉及以下步驟:
- 將原始數(shù)據(jù)集分割成多個(gè)子集,并進(jìn)行替換。
- 為每個(gè)子集開發(fā)基礎(chǔ)模型。
- 在運(yùn)行所有預(yù)測(cè)之前,同時(shí)運(yùn)行所有模型,并將所有預(yù)測(cè)結(jié)果匯總以獲得最終預(yù)測(cè)結(jié)果。
Scikit-learn提供了實(shí)現(xiàn)BaggingClassifier和BaggingRegressor的能力。BaggingMetaEstimator可以識(shí)別原始數(shù)據(jù)集的隨機(jī)子集以適應(yīng)每個(gè)基礎(chǔ)模型,然后通過(guò)投票或平均的方式將各個(gè)基礎(chǔ)模型的預(yù)測(cè)結(jié)果聚合成最終預(yù)測(cè)結(jié)果。該方法通過(guò)隨機(jī)化構(gòu)建過(guò)程來(lái)減少差異。
【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
接下來(lái)本文以一個(gè)示例來(lái)說(shuō)明如何使用scikit-learn中的裝袋估計(jì)器:
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)
裝袋分類器需要考慮幾個(gè)參數(shù):
- base_estimator:裝袋方法中使用的基礎(chǔ)模型。這里我們使用決策樹分類器。
- n_estimators:裝袋方法中將使用的估計(jì)器數(shù)量。
- max_samples:每個(gè)基礎(chǔ)估計(jì)器將從訓(xùn)練集中抽取的樣本數(shù)。
- max_features:用于訓(xùn)練每個(gè)基礎(chǔ)估計(jì)器的特征數(shù)量。
現(xiàn)在,本文將在訓(xùn)練集上擬合該分類器并進(jìn)行評(píng)分。
bagging.fit(X_train, y_train)
bagging.score(X_test,y_test)
對(duì)于回歸任務(wù),我們也可以做類似的操作,不同之處在于我們將使用回歸估計(jì)器。
from sklearn.ensemble import BaggingRegressor
bagging = BaggingRegressor(DecisionTreeRegressor())
bagging.fit(X_train, y_train)
model.score(X_test,y_test)
5. 堆疊集成學(xué)習(xí)
堆疊是一種將多個(gè)估計(jì)器組合在一起以減小它們的偏差并產(chǎn)生準(zhǔn)確預(yù)測(cè)的技術(shù)。然后將每個(gè)估計(jì)器的預(yù)測(cè)結(jié)果進(jìn)行組合,并輸入到通過(guò)交叉驗(yàn)證訓(xùn)練的最終預(yù)測(cè)元模型中;堆疊可以應(yīng)用于分類和回歸問(wèn)題。
圖片
堆疊集成學(xué)習(xí)
堆疊的步驟如下:
- 將數(shù)據(jù)分為訓(xùn)練集和驗(yàn)證集。
- 將訓(xùn)練集分為K個(gè)折疊。
- 在K-1個(gè)折疊上訓(xùn)練基礎(chǔ)模型,并在第K個(gè)折疊上進(jìn)行預(yù)測(cè)。
- 重復(fù)步驟3,直到對(duì)每個(gè)折疊都有一個(gè)預(yù)測(cè)結(jié)果。
- 在整個(gè)訓(xùn)練集上擬合基礎(chǔ)模型。
- 使用該模型對(duì)測(cè)試集進(jìn)行預(yù)測(cè)。
- 對(duì)其他基礎(chǔ)模型重復(fù)步驟3-6。
- 使用測(cè)試集的預(yù)測(cè)結(jié)果作為新模型(元模型)的特征。
- 使用元模型對(duì)測(cè)試集進(jìn)行最終預(yù)測(cè)。
在下面的示例中,本文首先創(chuàng)建兩個(gè)基礎(chǔ)分類器(RandomForestClassifier和GradientBoostingClassifier)和一個(gè)元分類器(LogisticRegression),然后使用K折交叉驗(yàn)證從這些分類器的預(yù)測(cè)結(jié)果(iris數(shù)據(jù)集上的訓(xùn)練數(shù)據(jù))中提取特征用于元分類器(LogisticRegression)的訓(xùn)練。
在使用K折交叉驗(yàn)證將基礎(chǔ)分類器在測(cè)試數(shù)據(jù)集上進(jìn)行預(yù)測(cè),并將這些預(yù)測(cè)結(jié)果作為元分類器的輸入特征后,再使用這兩者的預(yù)測(cè)結(jié)果進(jìn)行測(cè)試集上的預(yù)測(cè),并將其準(zhǔn)確性與堆疊集成模型進(jìn)行比較。
# 加載數(shù)據(jù)集
data = load_iris()
X, y = data.data, data.target
# 將數(shù)據(jù)拆分為訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 定義基礎(chǔ)分類器
base_classifiers = [
RandomForestClassifier(n_estimators=100, random_state=42),
GradientBoostingClassifier(n_estimators=100, random_state=42)
]
# 定義元分類器
meta_classifier = LogisticRegression()
# 創(chuàng)建一個(gè)數(shù)組來(lái)保存基礎(chǔ)分類器的預(yù)測(cè)結(jié)果
base_classifier_predictions = np.zeros((len(X_train), len(base_classifiers)))
# 使用K折交叉驗(yàn)證進(jìn)行堆疊
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)
# 在基礎(chǔ)分類器預(yù)測(cè)的基礎(chǔ)上訓(xùn)練元分類器
meta_classifier.fit(base_classifier_predictions, y_train)
# 使用堆疊集成進(jìn)行預(yù)測(cè)
stacked_predictions = np.zeros((len(X_test), len(base_classifiers)))
for i, clf in enumerate(base_classifiers):
stacked_predictions[:, i] = clf.predict(X_test)
# 使用元分類器進(jìn)行最終預(yù)測(cè)
final_predictions = meta_classifier.predict(stacked_predictions)
# 評(píng)估堆疊集成的性能
accuracy = accuracy_score(y_test, final_predictions)
print(f"Stacked Ensemble Accuracy: {accuracy:.2f}")
6. 提升集成學(xué)習(xí)
提升(Boosting)是一種機(jī)器學(xué)習(xí)的集成技術(shù),通過(guò)將弱學(xué)習(xí)器轉(zhuǎn)化為強(qiáng)學(xué)習(xí)器來(lái)減小偏差和方差。這些弱學(xué)習(xí)器按順序應(yīng)用于數(shù)據(jù)集,首先創(chuàng)建一個(gè)初始模型并將其擬合到訓(xùn)練集上。一旦第一個(gè)模型的錯(cuò)誤被識(shí)別出來(lái),就會(huì)設(shè)計(jì)另一個(gè)模型來(lái)進(jìn)行修正。
有一些流行的算法和實(shí)現(xiàn)方法用于提升集成學(xué)習(xí)技術(shù)。接下來(lái)將探討其中最著名的幾種。
6.1 AdaBoost
AdaBoost是一種有效的集成學(xué)習(xí)技術(shù),通過(guò)按順序使用弱學(xué)習(xí)器進(jìn)行訓(xùn)練。每次迭代都會(huì)優(yōu)先考慮錯(cuò)誤的預(yù)測(cè)結(jié)果,同時(shí)減小分配給正確預(yù)測(cè)實(shí)例的權(quán)重;這種策略性地強(qiáng)調(diào)具有挑戰(zhàn)性的觀察結(jié)果,使得AdaBoost隨著時(shí)間的推移變得越來(lái)越準(zhǔn)確,其最終的預(yù)測(cè)結(jié)果由弱學(xué)習(xí)器的多數(shù)投票或加權(quán)總和決定。
AdaBoost是一種通用的算法,適用于回歸和分類任務(wù),但在這里本文更關(guān)注它在分類問(wèn)題上的應(yīng)用,使用Scikit-learn進(jìn)行演示。接下來(lái)看看如何在下面的示例中將其應(yīng)用于分類任務(wù):
from sklearn.ensemble import AdaBoostClassifier
model = AdaBoostClassifier(n_estimators=100)
model.fit(X_train, y_train)
model.score(X_test,y_test)
在這個(gè)示例中,本文使用了Scikit-learn中的AdaBoostClassifier,并將n_estimators設(shè)置為100。默認(rèn)的學(xué)習(xí)器是決策樹,用戶可以進(jìn)行更改。此外,還可以調(diào)整決策樹的參數(shù)。
6.2 極限梯度提升(XGBoost)
極限梯度提升(eXtreme Gradient Boosting),更常被稱為XGBoost,是提升集成學(xué)習(xí)算法中最佳的實(shí)現(xiàn)之一,由于其并行計(jì)算能力,在單臺(tái)計(jì)算機(jī)上運(yùn)行非常高效。可以通過(guò)機(jī)器學(xué)習(xí)社區(qū)開發(fā)的xgboost軟件包來(lái)使用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是另一種基于樹學(xué)習(xí)的梯度提升算法,但與其他基于樹的算法不同的是,它使用基于葉子的樹生長(zhǎng)方式,這使其收斂更快。
圖片
樹葉的生長(zhǎng)/圖片來(lái)源:LightGBM
在下面的示例中,本文將使用LightGBM解決一個(gè)二元分類問(wèn)題:
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'],
)
結(jié)語(yǔ)
集成學(xué)習(xí)和隨機(jī)森林是強(qiáng)大的機(jī)器學(xué)習(xí)模型,機(jī)器學(xué)習(xí)從業(yè)者和數(shù)據(jù)科學(xué)家經(jīng)常使用它們。在本文中,我們介紹了提升集成學(xué)習(xí)的基本原理、應(yīng)用場(chǎng)景,并介紹了其中最受歡迎的算法及其在Python中的使用方法。