XGBoost 是梯度提升集成算法的強大且流行的實現,配置 XGBoost 模型的一個重要方面是選擇在模型訓練期間最小化的損失函數。
該損失函數必須匹配預測建模問題類型,以同樣的方式,我們必須選擇根據問題類型與深學習神經網絡的適當的損耗的功能。
XGBoost 和損失函數
Extreme Gradient Boosting,簡稱 XGBoost,是梯度提升算法的高效開源實現。因此 XGBoost 是一個算法、一個開源項目和一個 Python 庫。

它最初由 Tianqi Chen 開發,並由 Chen 和 Carlos Guestrin 在 2016 年題為“ XGBoost:A Scalable Tree Boosting System ”的論文中進行了描述。
它被設計為計算效率高(例如執行速度快)和高效,可能比其他開源實現更有效。
XGBoost 支持一系列不同的預測建模問題,最顯着的是分類和回歸。 通過最小化目標函數對數據集的損失進行訓練。因此,損失函數的選擇是一個關鍵的超參數,直接與要解決的問題類型相關,就像深度學習神經網絡一樣。
該實現允許通過 objective 超參數指定目標函數,並使用適用於大多數情況的合理默認值。
然而,對於在訓練 XGBoost 模型時使用什麼損失函數,初學者仍然存在一些困惑。
在開始之前,讓我們進行配置
XGBoost 可以作為獨立庫安裝,並且可以使用 scikit-learn API 開發 XGBoost 模型。
安裝 XGBoost 庫(如果尚未安裝)。這可以在大多數平台上使用 pip python 包管理器來實現。
pip install xgboost
然後,您可以確認 XGBoost 庫已正確安裝並且可以通過運行以下腳本來使用。
import xgboost
print(xgboost.__version__)
運行該腳本將打印您已安裝的 XGBoost 庫的版本。
1.1.1
您可能在使用最新版本的庫時遇到問題。不是你的的問題,因為有時庫的最新版本會提出額外的要求,或者可能不太穩定。
如果您在嘗試運行上述腳本時確實遇到錯誤,我建議您降級到 1.0.1(或更低版本)。這可以通過指定要安裝到 pip 命令的版本來實現,如下所示:
pip install xgboost==1.0.1
如果您看到警告消息,現在可以放心地忽略它。例如,以下是您可能會看到並可以忽略的警告消息示例:
FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.
如果您需要針對您的開發環境的特定說明,請參閱教程:
XGBoost 安裝指南
XGBoost 庫有自己的自定義 API,儘管我們將通過 scikit-learn 包裝類使用該方法:XGBRegressor 和 XGBClassifier 。這將使我們能夠使用 scikit-learn 機器學習庫中的全套工具來準備數據和評估模型。
兩個模型以相同的方式運行,並採用相同的參數來影響決策樹的創建和添加到集成的方式。
分類的 XGBoost 損失函數
分類任務涉及在給定輸入樣本的情況下預測每個可能類別的標籤或概率。

具有互斥標籤的分類任務有兩種主要類型:具有兩個類標籤的二元分類和具有兩個以上類標籤的多類分類。
- 二元分類:具有兩個類標籤的分類任務。
- 多類分類:具有兩個以上類標籤的分類任務。
有關不同類型分類任務的更多信息,請參閱教程:
機器學習中的 4 種分類任務,分別是:二元分類、多類分類、多標籤分類、不平衡分類。
XGBoost 為這些問題類型中的每一種都提供了損失函數。
在機器學習中,典型的做法是訓練模型來預測概率任務的類成員概率,以及任務是否需要清晰的類標籤來對預測的概率進行後處理(例如使用argmax)。
這種方法在訓練深度學習神經網絡進行分類時使用,在使用 XGBoost 進行分類時也推薦使用。
用於預測二元分類問題概率的損失函數是 binary:logistic ,用於預測多類問題類別概率的損失函數是 multi:softprob 。
- binary:logistic :用於二進制分類的 XGBoost 損失函數。
- multi:softprob :用於多類分類的 XGBoost 損失函數。
在配置 XGBClassifier 模型時,可以通過“ objective ”超參數指定這些字符串值。
對於二元分類
# 二元分類模型
model = XGBClassifier(objective='binary:logistic')
對於多類分類
# 多元分類模型
model = XGBClassifier(objective='multi:softprob')
重要的是,如果您不指定 objective 超參數,XGBClassifier 將根據訓練期間提供的數據自動選擇這些損失函數之一。
我們可以通過一個有效的例子來具體說明這一點。
下面的示例創建一個合成二元分類數據集,使用默認超參數在數據集上擬合 XGBClassifier ,然後打印模型目標配置。
from sklearn.datasets import make_classification
from xgboost import XGBClassifier
# 隨機生成數據
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1)
# 選擇模型
model = XGBClassifier()
# 擬合模型
model.fit(X, y)
# 匯總模型損失函數
print(model.objective)
運行示例在數據集上擬合模型並打印損失函數配置。
我們可以看到模型自動選擇一個損失函數進行二元分類。
binary:logistic
或者,我們可以指定目標並擬合模型,確認使用了損失函數。
from sklearn.datasets import make_classification
from xgboost import XGBClassifier
# 隨機生成數據
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1)
# 選擇模型
model = XGBClassifier(objective='binary:logistic')
# 擬合模型
model.fit(X, y)
# 匯總模型損失函數
print(model.objective)
運行示例在數據集上擬合模型並打印損失函數配置。
我們可以看到用於指定二元分類損失函數的模型。
binary:logistic
讓我們在具有兩個以上類的數據集上重複此示例。在這種情況下,三個類別。
下面列出了完整的示例。
from sklearn.datasets import make_classification
from xgboost import XGBClassifier
# 隨機生成數據
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1, n_classes=3)
# 選擇模型
model = XGBClassifier()
# 擬合模型
model.fit(X, y)
# 匯總模型損失函數
print(model.objective)
運行示例在數據集上擬合模型並打印損失函數配置。
我們可以看到模型自動為多類分類選擇了一個損失函數。
multi:softprob
或者,我們可以手動指定損失函數並確認它用於訓練模型。
from sklearn.datasets import make_classification
from xgboost import XGBClassifier
# 隨機生成數據
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1, n_classes=3)
# 選擇模型
model = XGBClassifier(objective="multi:softprob")
# 擬合模型
model.fit(X, y)
# 匯總模型損失函數
print(model.objective)
運行示例在數據集上擬合模型並打印損失函數配置。
我們可以看到用於為多類分類指定損失函數的模型。
multi:softprob
最後,還有其他損失函數可用於分類,包括:用於二元分類的 binary:logitraw 和 binary:hinge以及用於多類分類的 multi:softmax 。
您可以在此處查看完整列表:
Learning Task Parameters: objective
回歸的 XGBoost 損失函數
回歸是指在給定輸入樣本的情況下預測數值的預測建模問題。

雖然預測概率聽起來像一個回歸問題(即概率是一個數值),但它通常不被視為回歸類型的預測建模問題。
預測數值時使用的 XGBoost 目標函數是 reg:squarederror 損失函數。
- reg:squarederror :回歸預測建模問題的損失函數。
在配置XGBRegressor模型時,可以通過“ objective ”超參數指定此字符串值。
例如:
model = XGBRegressor(objective='reg:squarederror')
重要的是,如果你沒有指定 objective 超參數,XGBRegressor 會自動為你選擇這個目標函數。
我們可以通過一個有效的例子來具體說明這一點。
下面的示例創建一個合成回歸數據集,在數據集上擬合XGBRegressor,然後打印模型目標配置。
from sklearn.datasets import make_regression
from xgboost import XGBRegressor
# 隨機生成數據
X, y = make_regression(n_samples=1000, n_features=20, n_informative=15, noise=0.1, random_state=7)
# 選擇模型
model = XGBRegressor()
# 擬合模型
model.fit(X, y)
# 匯總損失函數
print(model.objective)
運行示例在數據集上擬合模型並打印損失函數配置。
我們可以看到模型自動選擇一個損失函數進行回歸。
reg:squarederror
或者,我們可以指定目標並擬合模型,確認使用了損失函數。
from sklearn.datasets import make_regression
from xgboost import XGBRegressor
# 隨機生成數據
X, y = make_regression(n_samples=1000, n_features=20, n_informative=15, noise=0.1, random_state=7)
# 選擇模型
model = XGBRegressor(objective='reg:squarederror')
# 擬合模型
model.fit(X, y)
# 匯總損失函數
print(model.objective)
運行示例在數據集上擬合模型並打印損失函數配置。
我們可以看到模型使用指定的損失函數進行回歸。
reg:squarederror
最後,還有其他損失函數可用於回歸,包括:reg:squaredlogerror 、 reg:logistic 、 reg:pseudohubererror 、 reg:gamma 和 reg:tweedie 。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/205622.html