XGBoost - 超引數調優
在本章中,我們將討論 XGBoost 模型超引數調整這一至關重要的問題。超引數是控制演算法學習方式的特定數字或權重。正如我們在上一章中已經看到的,XGBoost 提供了廣泛的超引數。透過修改 XGBoost 的超引數,我們可以最大化其效率。XGBoost 以其能夠自動調整數千個可學習引數的能力而聞名,以便在資料中找到模式和規律。
在每個節點上選擇的決策變數是基於樹的模型(如 XGBoost)的可學習引數。設計決策數量的增加會導致較大的超引數。這些是演算法訓練使用的引數,並且保持不變。
基於樹的模型中的超引數包括最大樹深度、要生長的樹的數量、構建每棵樹時要考慮的變數數量、最小葉子樣本數量以及用於構建樹的觀測值的分數。但本章的重點是最大化 XGBoost 超引數,這裡介紹的技術適用於任何其他高階 ML 方法。
使用超引數調優 XGBoost
現在我們將瞭解如何藉助超引數來調整我們的 XGBoost 模型 -
1. 匯入庫
首先,您需要根據以下程式碼匯入所有必要的庫 -
# Import pandas for handling data import pandas as pd # Import numpy for scientific calculations import numpy as np # Import XGBoost for machine learning import xgboost as xgb from sklearn.metrics import accuracy_score # Import libraries for tuning hyperparameters from hyperopt import STATUS_OK, Trials, fmin, hp, tpe
2. 讀取資料集
現在我們將讀取我們的資料集。這裡我們使用 Wholesale-customers-data.csv 資料集。
data = '/Python/Wholesale customers data.csv' df = pd.read_csv(data)
3. 宣告特徵向量和目標變數
這裡我們需要宣告特徵向量和目標變數 -
X = df.drop('Channel', axis=1)
y = df['Channel']
現在讓我們看一下特徵向量 (X) 和目標變數 (y)。
X.head() y.head()
輸出
以下是上述步驟的結果 -
0 2 1 2 2 2 3 1 4 2 Name: Channel, dtype: int64
我們可以看到 y 標籤的值為 1 和 2。我們需要將其轉換為 0 和 1 以進行進一步分析。所以我們將按如下方式進行 -
# Change labels into binary values y[y == 2] = 0 y[y == 1] = 1
然後我們將再次檢查 y 標籤 -
# Now again see the y label y.head()
以下是上述部分的結果 -
0 0 1 0 2 0 3 1 4 0 Name: Channel, dtype: int64
因此,您可以在這裡看到我們的目標變數 (y) 已轉換為 0 和 1。
4. 將資料拆分為單獨的訓練集和測試集
現在我們將把上述資料拆分為單獨的訓練集和測試集。按如下方式進行 -
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)
使用 HYPEROPT 進行貝葉斯最佳化
貝葉斯最佳化是找到機器學習或深度學習演算法的最佳引數的過程。最佳化是確定最低成本函式的過程,該函式導致模型在訓練集和測試集上的整體效能更好。
在這種方法中,我們將使用各種引數範圍訓練模型,直到找到最佳擬合。超引數調整有助於找到最佳調整的引數並返回最佳擬合模型,這是構建 ML 或 DL 演算法時應遵循的最佳方法。
本章討論了一種最精確和成功的超引數調整方法,即使用 HYPEROPT 進行貝葉斯最佳化。
什麼是 HYPEROPT?
HYPEROPT 是一個高階 Python 包,它搜尋超引數值的超引數空間以找到能夠最小化損失函式的最佳選項。
貝葉斯最佳化方法使用 Hyperopt 來調整模型超引數。Hyperopt 是一個用於調整模型超引數的 Python 庫。
貝葉斯最佳化實現
最佳化過程分為 4 個部分:初始化域空間、定義目標函式、最佳化演算法和結果。所以讓我們在這裡逐一討論這些部分 -
1. 初始化域空間
域空間是指我們要搜尋的輸入值。以下是您可以看到的程式碼 -
# Set up hyperparameters for tuning using Hyperopt
space = {
'max_depth': hp.quniform('max_depth', 3, 10, 1),
'learning_rate': hp.uniform('learning_rate', 0.01, 0.2),
'n_estimators': hp.quniform('n_estimators', 50, 300, 50),
'subsample': hp.uniform('subsample', 0.5, 1),
'colsample_bytree': hp.uniform('colsample_bytree', 0.5, 1),
'gamma': hp.uniform('gamma', 0, 0.5),
'lambda': hp.uniform('lambda', 0, 1),
'alpha': hp.uniform('alpha', 0, 1)
}
2. 定義目標函式
目標函式是任何生成我們要最小化的實值的函式。在本例中,我們專注於相對於其超引數減少 ML 模型的驗證誤差。如果準確性確實有價值,我們需要將其最大化。然後程式碼應返回度量的負值。
# Define objective function for hyperparameter tuning
def objective(space):
clf=xgb.XGBClassifier(
n_estimators =space['n_estimators'], max_depth = int(space['max_depth']), gamma = space['gamma'],
reg_alpha = int(space['reg_alpha']),min_child_weight=int(space['min_child_weight']),
colsample_bytree=int(space['colsample_bytree']))
evaluation = [( X_train, y_train), ( X_test, y_test)]
clf.fit(X_train, y_train,
eval_set=evaluation, eval_metric="auc",
early_stopping_rounds=10,verbose=False)
pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, pred>0.5)
print ("SCORE:", accuracy)
return {'loss': -accuracy, 'status': STATUS_OK }
3. 最佳化演算法
它是構建代理目標函式和選擇下一個要評估的值的過程。
# Run Hyperopt to find the best hyperparameters trials = Trials() best = fmin( fn=objective, space=space, algo=tpe.suggest, max_evals=50, trials=trials )
4. 列印結果
結果是演算法用來構建模型的分數或值對。
# Print the best hyperparameters
print("Best Hyperparameters:", best)
輸出
Best Hyperparameters: {'alpha': 0.221612523499914, 'colsample_bytree': 0.7560822278126258, 'gamma': 0.05019667254058424, 'lambda': 0.3047164013099425, 'learning_rate': 0.019578072539274467, 'max_depth': 9.0, 'n_estimators': 150.0, 'subsample': 0.7674996723810256}