微信號:deep_intelligence(歡迎關注!)

weixin.qq.com/r/ry7r8xz (二維碼自動識別)

當您想購買新車時,您會走到第一家車店並只根據經銷商的建議就馬上購買嗎?這不太可能。您可能會瀏覽一些門戶網站,人們發布評論並比較不同的車型,檢查其功能和價格。你也可能會問你的朋友和同事他們的意見。簡而言之,你不會直接得出結論,而是會考慮其他人的意見做出決定。

機器學習中的集成模型基於類似的想法。他們將來自多個模型的決策結合起來,以提高整體績效。這可以通過各種方式實現,您將在本文中發現。

本文的目的是介紹集成學習的概念,並理解使用該技術的演算法。為了鞏固您對這個多樣化主題的理解,我們將使用針對現實問題的實際案例研究來解釋Python中的高級演算法。

注意:本文假設您對機器學習演算法有基本的了解。

目錄

  1. 集成學習簡介
  2. 基本集成技術2.1最大投票法2.2平均法2.3加權平均法
  3. 高級集成技術3.1堆疊(stacking)

    3.2混合(blending)

    3.3Bagging3.4提升(boosting)
  4. 基於Bagging和Boosting的演算法4.1 Bagging meta-estimator 4.2 隨機森林(Random Forest)4.3 AdaBoost 4.4 GBM 4.5 XGB 4.6 Light GBM 4.7 CatBoost

1.集成學習簡介

讓我們通過一個例子來理解集成學習的概念。假設你是一名電影導演,你已經創作了一部關於非常重要且有趣的話題的短片。現在,您希望在公開之前對電影進行初步反饋(評級)。你可以用這種方式做什麼?

A:您可以讓一位朋友為您評分電影。

現在,你所選擇的人完全有可能非常愛你,即使你的作品很糟糕,他(她)也不會給你打一星差評,因為他(她)不想上你的心。

B:另一種方法可以是讓你的5位同事評價這部電影。

這應該可以更好地了解電影。此方法可以為您的電影提供誠實的評級。但問題仍然存在。這5個人可能不是關於電影主題的「專家」。當然,他們可能會理解電影攝影,鏡頭或音頻,卻可能不是黑暗幽默的最佳裁判。

C:要求50個人評價這部電影怎麼樣?

其中一些可能是你的朋友,其中一些可能是你的同事,有些甚至可能是完全陌生的。在這種情況下,答案會更加概括和多樣化,因為現在你們擁有不同技能的人。事實證明與我們之前看到的案例相比,這是獲得誠實評級的更好方法。

通過這些示例,您可以推斷出與個人相比,不同群體的人可能做出更好的決策。與單一模型相比,各種模型也是如此。機器學習的這種多樣化是通過一種稱為Ensemble Learning(集成學習)的技術實現的。現在您已經了解了集成學習的要點 - 讓我們看看集成學習中的各種技術及其實現。

2.簡單的集成技巧

在本節中,我們將介紹一些簡單但功能強大的技術,即:

  1. 最大投票法
  2. 平均法
  3. 加權平均法

2.1最大投票法

最大投票方法通常用於分類問題。在該技術中,使用多個模型來對每個數據點進行預測。每個模型的預測被視為「投票」。我們從大多數模型得到的預測被用作最終預測。

例如,當你讓5位同事評價你的電影時(總分5分); 我們假設其中三個將它評為4,而其中兩個給它一個5.由於大多數評分為4,最終評級將被視為4. 您可以將此視為採用所有預測的眾數。

最大投票的結果將是這樣的:

示例代碼:

這裡x_train由訓練數據中的獨立變數組成,y_train是訓練數據的目標變數。驗證集是x_test(自變數)和y_test(目標變數)。

model1 = tree.DecisionTreeClassifier()
model2 = KNeighborsClassifier()
model3= LogisticRegression()

model1.fit(x_train,y_train)
model2.fit(x_train,y_train)
model3.fit(x_train,y_train)

pred1=model1.predict(x_test)
pred2=model2.predict(x_test)
pred3=model3.predict(x_test)

final_pred = np.array([])
for i in range(0,len(x_test)):
final_pred = np.append(final_pred, mode([pred1[i], pred2[i], pred3[i]]))

或者,您可以在sklearn中使用「VotingClassifier」模塊,如下所示:

from sklearn.ensemble import VotingClassifier
model1 = LogisticRegression(random_state=1)
model2 = tree.DecisionTreeClassifier(random_state=1)
model = VotingClassifier(estimators=[(lr, model1), (dt, model2)], voting=hard)
model.fit(x_train,y_train)
model.score(x_test,y_test)

2.2平均法

與最大投票技術類似,對每個數據點的多次預測進行平均。在這種方法中,我們採用所有模型的平均預測值並使用它來進行最終預測。平均可用於在回歸問題中進行預測或在計算分類問題的概率時使用。

例如,在下面的情況中,平均方法將取所有值的平均值。

即(5 + 4 + 5 + 4 + 4)/ 5 = 4.4

示例代碼:

model1 = tree.DecisionTreeClassifier()
model2 = KNeighborsClassifier()
model3 = LogisticRegression()

model1.fit(x_train,y_train)
model2.fit(x_train,y_train)
model3.fit(x_train,y_train)

PRED1 = model1.predict_proba(x_test)
PRED2 = model2.predict_proba(x_test)
pred3 = model3.predict_proba(x_test)

finalpred =(PRED1 + PRED2 + pred3)/ 3

2.3加權平均法

這是平均方法的擴展。為每個模型分配不同的權重,定義每個模型的預測重要性。例如,如果你的兩個同事都是評論員,而另一些同事沒有這方面的經驗,那麼這兩個朋友的答案與其他人相比更為重要。

結果計算為[(5 * 0.23)+(4 * 0.23)+(5 * 0.18)+(4 * 0.18)+(4 * 0.18)] = 4.41。

示例代碼:

model1 = tree.DecisionTreeClassifier()
model2 = KNeighborsClassifier()
model3 = LogisticRegression()

model1.fit(x_train,y_train)
model2.fit(x_train,y_train)
model3.fit(x_train,y_train)

PRED1 = model1.predict_proba(x_test)
PRED2 = model2.predict_proba(x_test)
pred3 = model3.predict_proba(x_test)

finalpred =(PRED1 * 0.3 + PRED2 * 0.3 + pred3 * 0.4)

3.高級集成技術

現在我們已經介紹了基本的集成技術,讓我們繼續理解高級技術。

3.1堆疊

堆疊是一種集成學習技術,它使用來自多個模型(例如決策樹,knn或svm)的預測來構建新模型。該模型用於對測試集進行預測。以下是簡單堆疊集成的逐步說明:

  1. 把訓練集分為10個組。

2. 基礎模型(例如決策樹)用訓練集中的9個組進行訓練,用第10個組進行預測。

3. 然後將基礎模型(例如決策樹)擬合到整個訓練數據集上。

4. 使用此模型,在測試集上進行預測。

5. 對另一個基本模型(比如knn)重複步驟2到4,產生對訓練集和測試集的另一組預測。

6. 訓練集的預測被用作構建新模型的特徵。

7. 該模型用於對測試預測集進行最終預測。

示例代碼:

我們首先定義一個函數來對分成n個部分的訓練數據集和測試數據集的進行預測。此函數返回每個模型的訓練和測試的預測。

def Stacking(model,train,y,test,n_fold):
folds=StratifiedKFold(n_splits=n_fold,random_state=1)
test_pred=np.empty((test.shape[0],1),float)
train_pred=np.empty((0,1),float)
for train_indices,val_indices in folds.split(train,y.values):
x_train,x_val=train.iloc[train_indices],train.iloc[val_indices]
y_train,y_val=y.iloc[train_indices],y.iloc[val_indices]

model.fit(X=x_train,y=y_train)
train_pred=np.append(train_pred,model.predict(x_val))
test_pred=np.append(test_pred,model.predict(test))
return test_pred.reshape(-1,1),train_pred

現在我們將創建兩個基本模型 - 決策樹和knn。

model1 = tree.DecisionTreeClassifier(random_state=1)

test_pred1 ,train_pred1=Stacking(model=model1,n_fold=10, train=x_train,test=x_test,y=y_train)

train_pred1=pd.DataFrame(train_pred1)
test_pred1=pd.DataFrame(test_pred1)
model2 = KNeighborsClassifier()

test_pred2 ,train_pred2=Stacking(model=model2,n_fold=10,train=x_train,test=x_test,y=y_train)

train_pred2=pd.DataFrame(train_pred2)
test_pred2=pd.DataFrame(test_pred2)

在決策樹和knn模型的預測上創建第三個模型,邏輯回歸。

df = pd.concat([train_pred1, train_pred2], axis=1)
df_test = pd.concat([test_pred1, test_pred2], axis=1)

model = LogisticRegression(random_state=1)
model.fit(df,y_train)
model.score(df_test, y_test)

為了簡化上述說明,我們創建的堆疊模型只有兩個級別。決策樹和knn模型建立在零級,而邏輯回歸模型建立在第一級。您可以在堆疊模型中創建多個級別。

3.2混合

混合遵循與堆疊相同的方法,但僅使用來自訓練集的保留/(驗證)集來進行預測。換句話說,與堆疊不同,預測僅在保留集上進行。保留集和它的預測用於構建模型,用測試集對這個模型進行測試。以下是混合過程的詳細說明:

  1. 原始的訓練集分為訓練集和驗證集。

2.把模型擬合到訓練集上。

3. 預測在驗證集和測試集上進行。

4. 驗證集及其預測用作構建新模型的特徵。

5. 該模型用於對測試集和元特徵(meta-features)進行最終預測。

示例代碼:

我們將在訓練集上創建兩個模型,決策樹和knn,以便對驗證集進行預測。

model1 = tree.DecisionTreeClassifier()
model1.fit(x_train,y_train)
val_pred1 = model1.predict(x_val)
test_pred1 = model1.predict(x_test)
val_pred1 = pd.DataFrame(val_pred1)
test_pred1 = pd.DataFrame(test_pred1)

model2 = KNeighborsClassifier()
model2.fit(x_train,y_train)
val_pred2 = model2.predict(x_val)
test_pred2 = model2.predict(x_test)
val_pred2 = pd.DataFrame(val_pred2)
test_pred2 = pd.DataFrame(test_pred2)

結合元特徵和驗證集,構建邏輯回歸模型以對測試集進行預測。

df_val = pd.concat([x_val,val_pred1,val_pred2],axis = 1)
df_test = pd.concat([x_test,test_pred1,test_pred2],axis = 1)

model = LogisticRegression()
model.fit(df_val,y_val)
model.score(df_test,y_test)

3.3 Bagging

Bagging背後的思想是結合多個模型的結果(例如,所有決策樹)來獲得泛華的結果。問題是:如果您在同一組數據上創建所有模型並將其組合起來,它會有用嗎?這些模型很可能會得到相同的結果,因為它們獲得相同的輸入。那麼我們如何解決這個問題呢?其中一種方案是使用bootstrapping。

Bootstrapping是一種(有放回的)採樣技術,我們在其中創建來自原始數據集的觀察子集。子集的大小與原始集的大小相同。

Bagging(或Bootstrap Aggregating)技術使用這些子集(包)來獲得分布的完整概念(完整集)。為Bagging創建的子集的大小可能小於原始集。

  1. 從原始數據集有放回地採樣數據來創建多個子集,。
  2. 在每個子集上創建基本模型(弱模型)。
  3. 這些模型並行運行,彼此獨立。
  4. 通過組合所有模型的預測來確定最終預測。

3.4提升(Boosting)

在開始之前,請先思考一個問題:如果一個數據點被第一個模型錯誤地預測,然後下一個模型(可能是所有模型)的預測也是錯誤的,那麼結合預測會提供更好的結果嗎?通過提升來處理這種情況。

Boosting是一個順序過程,每個後續模型都會嘗試糾正先前模型的錯誤。隨後的模型取決於之前的模型。讓我們通過以下步驟了解提升的方式。

  1. 從原始數據集創建子集。
  2. 最初,所有數據點都具有相同的權重。
  3. 在此子集上創建基本模型。
  4. 該模型用於對整個數據集進行預測。

5. 使用實際值和預測值計算誤差。

6. 錯誤的預測的觀察結果具有更高的權重。

(在上圖中,三個被錯誤分類的藍色+被賦予更高的權重)

6. 創建另一個模型並對數據集進行預測。

(此模型嘗試更正先前模型中的錯誤)

7. 類似地,創建多個模型,每個模型校正先前模型的錯誤。

8. 最終模型(強學習器)是所有模型(弱學習器)的加權平均值。

因此,提升演算法結合了許多弱學習器以形成強大的學習器。單個模型在整個數據集上表現不佳,但它們適用於數據集的某些部分。因此,每個模型實際上提升了整體的性能。

4.基於Bagging和Boosting的演算法

Bagging和Boosting是機器學習中最常用的兩種技術。在本節中,我們將詳細介紹它們。以下是我們將關注的演算法:

Bagging演算法:

  • Bagging meta-estimator
  • 隨機森林

提升演算法:

  • AdaBoost的
  • GBM
  • XGBM
  • LightGBM
  • CatBoost

對於本節中討論的所有演算法,我們將遵循以下過程:

  • 演算法簡介
  • 示例代碼
  • 參數

對於本文,我使用了貸款預測問題。您可以從此處【1】下載數據集。請注意,對於每種演算法,一些代碼行(讀取數據,訓練集和測試集的分割等)將是相同的。為了避免重複,我在下面編寫了相同的代碼,並且僅對演算法相關的代碼進行進一步討論。

#importing important packages
import pandas as pd
import numpy as np

#reading the dataset
df=pd.read_csv("/home/user/Desktop/train.csv")

#filling missing values
df[Gender].fillna(Male, inplace=True)

同樣,填充所有列的值。這裡跳過了EDA,缺失值和異常值處理。要了解這些主題,您可以閱讀這篇文章:使用NumPy,Matplotlib和Pandas在Python中進行數據探索的終極指南。【2】

#split數據集進入訓練和測試

#split dataset into train and test

from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.3, random_state=0)

x_train=train.drop(Loan_Status,axis=1)
y_train=train[Loan_Status]

x_test=test.drop(Loan_Status,axis=1)
y_test=test[Loan_Status]

#create dummies
x_train=pd.get_dummies(x_train)
x_test=pd.get_dummies(x_test)

4.1 Bagging meta-estimator

Bagging meta-estimator是一種集成演算法,可用於分類(BaggingClassifier)和回歸(BaggingRegressor)問題。它採用典型的Bagging技術進行預測。以下是Bagging meta-estimator演算法的步驟:

  1. 從原始數據集(Bootstrapping)創建隨機子集。
  2. 數據集的子集包括所有特徵。
  3. 用戶指定的基本估計器(estimator)擬合這些較小的集合中的每一個上。
  4. 將每個模型的預測結合起來得到最終結果。

源碼:

from sklearn.ensemble import BaggingClassifier
from sklearn import tree
model = BaggingClassifier(tree.DecisionTreeClassifier(random_state=1))
model.fit(x_train, y_train)
model.score(x_test,y_test)
0.75135135135135134

回歸的示例代碼:

from sklearn.ensemble import BaggingRegressor
model = BaggingRegressor(tree.DecisionTreeRegressor(random_state=1))
model.fit(x_train, y_train)
model.score(x_test,y_test)

演算法中使用的參數:

  • base_estimator
    • 它定義了基本估計器以擬合數據集的隨機子集。
    • 如果未指定任何內容,則基本估計器是決策樹。
  • n_estimators
    • 它是要創建的基本估算器的數量。
    • 應仔細調整估算器的數量,因為大量的估算器需要很長時間才能運行,而極少數可能無法提供最佳結果。
  • max_samples
    • 此參數控制子集的大小。
    • 它是訓練每個基本估算器的最大樣本數。
  • max_features
    • 控制從整個數據集中繪製的特徵數。
    • 它定義了訓練每個基本估算器所需的最大特徵數。
  • n_jobs
    • 並行運行的作業數。
    • 將此值設置為等於CPU系統中的核心。
    • 如果為-1,則將作業數設置為CPU核心數。
  • random_state
    • 它指定了隨機分割的方法。當兩個模型的隨機狀態值相同時,兩個模型的隨機選擇相同。
    • 當您想要比較不同的模型時,此參數很有用。

4.2隨機森林

隨機森林是另一種遵循Bagging技術的集成機器學習演算法。它是bagging估算演算法的擴展。隨機森林中的基礎估計量是決策樹。與Bagging meta-estimator不同,隨機森林隨機選擇一組特徵,這些特徵用於決定決策樹的每個節點處的最佳分割。

隨機森林模型的演算法如下:

  1. 從原始數據集(bootstrapping)創建隨機子集。
  2. 在決策樹中的每個節點處,僅考慮一組隨機特徵來決定最佳分割。
  3. 在每個子集上擬合決策樹模型。
  4. 通過對來自所有決策樹的預測求平均來計算最終預測。

注意:隨機林中的決策樹可以構建在數據和特徵的子集上。特別地,隨機森林的sklearn模型使用決策樹的所有特徵,並且隨機選擇特徵子集用於在每個節點處分裂。

綜上所述,隨機森林隨機地選擇數據點和特徵點,並建立多個樹(林)。

源碼:

from sklearn.ensemble import RandomForestClassifier
model= RandomForestClassifier(random_state=1)
model.fit(x_train, y_train)
model.score(x_test,y_test)
0.77297297297297296

您可以通過在隨機森林上使用model.feature_importances_來查看特徵的重要性。

for i, j in sorted(zip(x_train.columns, model.feature_importances_)):
print(i, j)

結果如下:

ApplicantIncome 0.180924483743
CoapplicantIncome 0.135979758733
Credit_History 0.186436670523
.
.
.
Property_Area_Urban 0.0167025290557
Self_Employed_No 0.0165385567137
Self_Employed_Yes 0.0134763695267

回歸的示例代碼:

from sklearn.ensemble import RandomForestRegressor
model= RandomForestRegressor()
model.fit(x_train, y_train)
model.score(x_test,y_test)

參數

  • n_estimators:
    • 它定義了在隨機林中創建的決策樹的數量。
    • 通常,較大的數字使預測更強和更穩定,但是非常大的數量可以導致更高的訓練時間。

  • criterion
    • 它定義了用於分割的函數。
    • 該函數測量每個特徵的分割質量,並選擇最佳分割。

  • max_features
    • 它定義了每個決策樹中允許拆分的最大特徵數。
    • 增加最大特徵通常可以提高性能,但是非常大的數量會降低每棵樹的多樣性。

  • max_depth
    • 隨機森林有多個決策樹。此參數定義樹的最大深度。

  • min_samples_split:
    • 用於在嘗試分割之前定義葉節點中所需的最小樣本數。
    • 如果樣本數小於所需數量,則不分割節點。

  • min_samples_leaf:
    • 這定義了葉子節點所需的最小樣本數。
    • 較小的葉片尺寸使得模型更容易捕獲訓練數據中的雜訊。

  • max_leaf_nodes:
    • 此參數指定每個樹的最大葉節點數。
    • 當葉節點的數量變得等於最大葉節點時,樹停止分裂。

  • n_jobs
    • 這表示並行運行的作業數。
    • 如果要在CPU系統中的所有核心上運行,請將值設置為-1。

  • random_state
    • 此參數用於定義隨機選擇。
    • 它用於各種模型之間的比較。

4.3 AdaBoost

自適應提升或AdaBoost是最簡單的提升演算法之一。通常,決策樹用於建模。創建多個順序模型,每個模型都校正上一個模型的錯誤。AdaBoost為不正確預測的觀測值分配權重,後續模型用於正確預測這些值。

以下是執行AdaBoost演算法的步驟:

  1. 最初,數據集中的所有觀察值都具有相同的權重。
  2. 模型建立在數據子集上。
  3. 使用此模型,可以對整個數據集進行預測。
  4. 通過比較預測值和實際值來計算誤差。
  5. 在創建下一個模型時,會對未正確預測的數據點賦予更高的權重。
  6. 可以使用誤差值確定權重。例如,誤差越大,分配給觀察的權重越大。
  7. 重複該過程直到誤差函數沒有改變,或達到估計量(estimators)的最大限制。

原碼:

from sklearn.ensemble import AdaBoostClassifier
model = AdaBoostClassifier(random_state=1)
model.fit(x_train, y_train)
model.score(x_test,y_test)
0.81081081081081086

回歸的示例代碼:

from sklearn.ensemble import AdaBoostRegressor
model = AdaBoostRegressor()
model.fit(x_train, y_train)
model.score(x_test,y_test)

參數

  • base_estimators
    • 它有助於指定基本估計器的類型,即用作基礎學習器的機器學習演算法。

  • n_estimators:
    • 它定義了基本估算器的數量。
    • 默認值為10,但您應選擇較大的值以獲得更好的性能。

  • learning_rate:
    • 此參數控制估算器在最終組合中的貢獻。
    • 在learning_rate和n_estimators之間進行權衡。

  • max_depth
    • 定義單個估算器的最大深度。
    • 調整此參數以獲得最佳性能。

  • n_jobs
    • 指定允許使用的處理器數。
    • 對於允許的最大處理器,將值設置為-1。

  • random_state
    • 用於指定隨機數據分割整數值。
    • 如果給出相同的參數和訓練數據,random_state的確定值將始終產生相同的結果。

4.4梯度提升(GBM)

Gradient Boosting或GBM是另一種集成機器學習演算法,適用於回歸和分類問題。GBM使用boosting技術,結合了許多弱學習器,形成了一個強大的學習器。回歸樹用作基礎學習器,每個後續的樹都是基於前一樹計算的錯誤構建的。

我們將使用一個簡單的例子來理解GBM演算法。我們必須使用以下數據預測一群人的年齡:

  1. 假設平均年齡是數據集中所有觀測值的預測值。
  2. 使用該平均預測和年齡的實際值來計算誤差。

3. 使用上面計算的誤差作為目標變數創建樹模型。我們的目標是找到最佳分割以最小化錯誤。4. 該模型的預測與預測1相結合。

5. 上面計算的這個值是新的預測。

6. 使用此預測值和實際值計算新誤差。

7. 重複步驟2到6,直到達到最大迭代次數(或錯誤函數不改變)。

源碼:

from sklearn.ensemble import GradientBoostingClassifier
model= GradientBoostingClassifier(learning_rate=0.01,random_state=1)
model.fit(x_train, y_train)
model.score(x_test,y_test)
0.81621621621621621

回歸的示例代碼:

from sklearn.ensemble import GradientBoostingRegressor
model= GradientBoostingRegressor()
model.fit(x_train, y_train)
model.score(x_test,y_test)

參數

  • min_samples_split
    • 定義要考慮分割的節點中所需的最小樣本數(或觀察數)。
    • 用於控制過度擬合。較大的值可以阻止模型學習關係,這種關係可能對某個樹選擇的特定樣本高度相關。

  • min_samples_leaf
    • 定義終端或葉節點中所需的最小樣本數。
    • 一般來說,應該為不平衡的分類問題選擇較低的值,因為少數群體佔大多數的地區將非常小。

  • min_weight_fraction_leaf
    • 與min_samples_leaf類似,但定義為觀察總數的一小部分而不是整數。

  • MAX_DEPTH
    • 樹的最大深度。
    • 用於控制過擬合,因為更大的深度將允許模型學習非常特定於特定樣本的關係。
    • 應該使用CV進行調整。

  • max_leaf_nodes
    • 樹中終端節點或葉子的最大數量。
    • 可以定義代替max_depth。由於創建了二叉樹,因此深度n將產生最多2 ^ n個葉子。
    • 如果已定義,則GBM將忽略max_depth。

  • max_features
    • 搜索最佳分割時要考慮的特徵數量。這些將被隨機選擇。
    • 作為一個經驗規則,選擇特徵總數的平方根效果很好,但我們可以嘗試直到特徵總數的30-40%。
    • 較大的值可能導致過擬合,但通常取決於具體情況。

4.5 XGBoost

XGBoost(extreme Gradient Boosting)是梯度提升演算法的高級實現。事實證明,XGBoost是一種高效的ML演算法,廣泛應用於機器學習競賽和黑客馬拉松。XGBoost具有很高的預測能力,幾乎比其他梯度提升技術快10倍。它還包括各種正規化,可減少過擬合併提高整體性能。因此,它也被稱為「 正則化提升 」技術。

讓我們看看XGBoost如何比其他技術更好:

  1. 正則:
  • 標準GBM實現沒有像XGBoost那樣的正則化。
  • 因此,XGBoost還有助於減少過擬合。

2. 並行處理:

    • XGBoost實現並行處理,並且比GBM更快。
    • XGBoost還支持Hadoop上的實現。

3. 高靈活性:

    • XGBoost允許用戶定義自定義優化目標和評估標準,為模型添加全新維度。

4. 處理缺失值:

    • XGBoost有一個內置的常式來處理缺失值。

5. 樹修剪:

    • XGBoost進行分割,直到指定的max_depth,然後開始向後修剪樹並刪除沒有正增益的分割。

6. 內置交叉驗證:

    • XGBoost允許用戶在提升過程的每次迭代中運行交叉驗證,因此很容易在一次運行中獲得精確的最佳提升迭代次數。

源碼:

由於XGBoost會自行處理缺失值,因此您不必估算缺失值。您可以跳過上述代碼中缺失值插補的步驟。一如既往地遵循其餘步驟,然後如下所示應用xgboost。

import xgboost as xgb
model=xgb.XGBClassifier(random_state=1,learning_rate=0.01)
model.fit(x_train, y_train)
model.score(x_test,y_test)
0.82702702702702702

回歸問題的示例代碼:

import xgboost as xgb
model=xgb.XGBRegressor()
model.fit(x_train, y_train)
model.score(x_test,y_test)

參數

  • nthread
    • 這用於並行處理,應輸入CPU的核心數。
    • 如果您希望在所有核心上運行,請不要輸入此值。該演算法將自動檢測它。

  • ETA
    • 類似於GBM中的學習率。
    • 通過縮小每一步的權重,使模型更加魯棒。

  • min_child_weight
    • 定義子節點所需觀察的最小權重總和。
    • 用於控制過擬合。較大的值會阻止模型學習關係,這種關係可能對為樹選擇的特定樣本高度特定。

  • MAX_DEPTH
    • 它用於定義最大深度。
    • 更高的深度將允許模型學習非常特定於特定樣本的關係。

  • max_leaf_nodes
    • 樹中終端節點或葉子的最大數量。
    • 可以定義代替max_depth。由於創建了二叉樹,因此深度n將產生最多2 ^ n個葉子。
    • 如果已定義,則GBM將忽略max_depth。

  • Gamma
    • 僅當結果分割給出損失函數的正向減少時,才分割節點。Gamma指定進行分割所需的最小損失減少量。
    • 使演算法保守。值可能會根據損失函數而有所不同,因此應進行調整。

  • subsample
    • 與GBM的子樣本相同。表示對每棵樹隨機採樣的觀察部分。
    • 較低的值使演算法更加保守並防止過擬合,但是太小的值可能導致不合適。

  • colsample_bytree
    • 它類似於GBM中的max_features。
    • 表示要為每個樹隨機採樣的列的分數。

4.6 Light GBM

在討論Light GBM如何工作之前,讓我們首先理解為什麼在我們有這麼多其他演算法時(例如我們上面看到的演算法)我們需要這個演算法。當數據集非常大時,Light GBM會擊敗所有其他演算法。與其他演算法相比,Light GBM在較大的數據集上運行所需的時間較短。

LightGBM是一個梯度提升框架,它使用基於樹的演算法並遵循逐葉子方法,而其他演算法以逐層式工作。下面的圖片將幫助您以更好的方式理解差異。

逐葉子方式可能導致較小的數據集過擬合,但可以通過使用max_depth參數進行學習來避免這種情況。

將lightgbm導入為lgb
train_data = lgb.Dataset(x_train,標記= y_train)
import lightgbm as lgb
train_data=lgb.Dataset(x_train,label=y_train)
#define parameters
params = {learning_rate:0.001}
model= lgb.train(params, train_data, 100)
y_pred=model.predict(x_test)
for i in range(0,185):
if y_pred[i]>=0.5:
y_pred[i]=1
else:
y_pred[i]=0
0.81621621621621621

回歸問題的示例代碼:

import lightgbm as lgb
train_data=lgb.Dataset(x_train,label=y_train)
params = {learning_rate:0.001}
model= lgb.train(params, train_data, 100)
from sklearn.metrics import mean_squared_error
rmse=mean_squared_error(y_pred,y_test)**0.5

參數

  • num_iterations
    • 它定義了要執行的提升迭代次數。

  • num_leaves
    • 此參數用於設置要在樹中形成的葉子數。
    • 在Light GBM的情況下,由於分割是逐葉子方式而不是深度方式進行的,因此num_leaves必須小於2 ^(max_depth),否則可能導致過擬合。

  • min_data_in_leaf
    • 非常小的值可能導致過度擬合。
    • 它也是處理過度擬合的最重要參數之一。

  • max_depth
    • 它指定樹可以生長的最大深度或級別。
    • 此參數的值非常高可能會導致過度擬合。

  • bagging_fraction
    • 它用於指定每次迭代使用的數據分數。
    • 此參數通常用於加速訓練。

  • max_bin
    • 定義特徵值被分塊的最大分箱數量。
    • 較小的max_bin值可以節省大量時間,因為它在離散區間中存儲特徵值,這在計算上是便宜的。

4.7 CatBoost

處理分類變數是一個繁瑣的過程,尤其是當您有大量此類變數時。當您的分類變數具有太多標籤(即它們是高度基數)時,對它們執行one-hot編碼會以指數方式增加維度,並且使用數據集變得非常困難。

CatBoost可以自動處理分類變數,並且不需要像其他機器學習演算法那樣進行大量數據預處理。

源碼:

CatBoost演算法有效地處理分類變數。因此,您不應對分類變數執行one-hot編碼。只需載入文件,估算缺失的值,就可以了。

from catboost import CatBoostClassifier
model=CatBoostClassifier()
categorical_features_indices = np.where(df.dtypes != np.float)[0]
model.fit(x_train,y_train,cat_features=([ 0, 1, 2, 3, 4, 10]),eval_set=(x_test, y_test))
model.score(x_test,y_test)
0.80540540540540539

回歸問題的示例代碼:

from catboost import CatBoostRegressor
model=CatBoostRegressor()
categorical_features_indices = np.where(df.dtypes != np.float)[0]
model.fit(x_train,y_train,cat_features=([ 0, 1, 2, 3, 4, 10]),eval_set=(x_test, y_test))
model.score(x_test,y_test)

參數

  • loss_function:
    • 定義用於訓練的度量標準。

  • 迭代:
    • 可以構建的最大樹數。
    • 樹的最終數量可能小於或等於此數字。

  • learning_rate:
    • 定義學習率。
    • 用於減少梯度步驟。

  • border_count:
    • 它指定數字型特徵的拆分數。
    • 它類似於max_bin參數。

  • DEPTH:
    • 定義樹的深度。

  • RANDOM_SEED:
    • 此參數類似於我們之前看到的random_state參數。
    • 它是一個整數值,用於定義訓練的隨機種子。

參考資料:

本文翻譯自:A Comprehensive Guide to Ensemble Learning (with Python codes)


推薦閱讀:
相关文章