import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

df = pd.read_csv('Dataset.csv')

# 劃分特征和目標(biāo)變量
X = df.drop(['target'], axis=1)
y = df['target']

# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42, stratify=df['target'])

從 Dataset.csv 中讀取數(shù)據(jù),并將其分為訓(xùn)練集和測試集,為后續(xù)的模型訓(xùn)練和評估做好準備,通過分層采樣(stratify 參數(shù))保證訓(xùn)練集和測試集的類別分布一致,這對于模型的公平性和泛化能力至關(guān)重要,該數(shù)據(jù)集為二分類數(shù)據(jù)

定義XGBoost模型參數(shù)

import xgboost as xgb
from sklearn.model_selection import GridSearchCV

# XGBoost模型參數(shù)
params_xgb = {
'learning_rate': 0.02, # 學(xué)習(xí)率,控制每一步的步長,用于防止過擬合。典型值范圍:0.01 - 0.1
'booster': 'gbtree', # 提升方法,這里使用梯度提升樹(Gradient Boosting Tree)
'objective': 'binary:logistic', # 損失函數(shù),這里使用邏輯回歸,用于二分類任務(wù)
'max_leaves': 127, # 每棵樹的葉子節(jié)點數(shù)量,控制模型復(fù)雜度。較大值可以提高模型復(fù)雜度但可能導(dǎo)致過擬合
'verbosity': 1, # 控制 XGBoost 輸出信息的詳細程度,0表示無輸出,1表示輸出進度信息
'seed': 42, # 隨機種子,用于重現(xiàn)模型的結(jié)果
'nthread': -1, # 并行運算的線程數(shù)量,-1表示使用所有可用的CPU核心
'colsample_bytree': 0.6, # 每棵樹隨機選擇的特征比例,用于增加模型的泛化能力
'subsample': 0.7, # 每次迭代時隨機選擇的樣本比例,用于增加模型的泛化能力
'eval_metric': 'logloss' # 評價指標(biāo),這里使用對數(shù)損失(logloss)
}

設(shè)置一個初始的 XGBoost 模型參數(shù)字典 params_xgb,用于后續(xù)的模型訓(xùn)練和優(yōu)化,這些參數(shù)是 XGBoost 在二分類任務(wù)中的常見選擇,如果是多分類模型你將修改以下參數(shù)

params_xgb_multi = {
'learning_rate': 0.02,
'booster': 'gbtree',
'objective': 'multi:softprob', # 選擇 'multi:softmax' 或 'multi:softprob'
'num_class': 3, # 類別總數(shù)
'max_leaves': 127,
'verbosity': 1,
'seed': 42,
'nthread': -1,
'colsample_bytree': 0.6,
'subsample': 0.7,
'eval_metric': 'mlogloss' # 多分類對數(shù)損失
}

objective: ‘multi:softmax’ 或 objective: ‘multi:softprob’,multi:softmax: 輸出預(yù)測類別,multi:softprob: 輸出每個類別的概率num_class:添加參數(shù) num_class,它表示類別的總數(shù)例如,如果有三類,設(shè)置為 num_class: 3eval_metric:修改為 eval_metric: ‘mlogloss’ 或其他適合多分類的指標(biāo),如 merror,mlogloss: 多分類對數(shù)損失,merror: 多分類錯誤率

初始化分類模型

# 初始化XGBoost分類模型
model_xgb = xgb.XGBClassifier(**params_xgb)

使用定義的參數(shù)初始化XGBoost分類模型

定義參數(shù)網(wǎng)格

# 定義參數(shù)網(wǎng)格,用于網(wǎng)格搜索
param_grid = {
'n_estimators': [100, 200, 300, 400, 500], # 樹的數(shù)量
'max_depth': [3, 4, 5, 6, 7], # 樹的深度
'learning_rate': [0.01, 0.02, 0.05, 0.1], # 學(xué)習(xí)率
}

定義一個參數(shù)網(wǎng)格 param_grid,用于進行網(wǎng)格搜索,以便找到 XGBoost 模型的最佳超參數(shù)組合,網(wǎng)格搜索通過在給定的參數(shù)空間中系統(tǒng)地嘗試每一種組合,選擇出最優(yōu)的參數(shù)設(shè)置,下面給出模型其它常見參數(shù)

param_grid = {
'n_estimators': [100, 200, 300], # 樹的數(shù)量,較多的樹可能提高模型性能,但也增加訓(xùn)練時間和風(fēng)險過擬合
'max_depth': [3, 4, 5], # 樹的最大深度,控制樹的復(fù)雜度,較大值允許更復(fù)雜的模型但增加過擬合風(fēng)險
'learning_rate': [0.01, 0.05, 0.1], # 學(xué)習(xí)率,控制每棵樹對最終模型的貢獻,較小值提供更穩(wěn)健的學(xué)習(xí)
'min_child_weight': [1, 3, 5], # 最小葉子節(jié)點樣本權(quán)重和,較大值防止過擬合,適用于高噪聲數(shù)據(jù)集
'gamma': [0, 0.1, 0.2], # 節(jié)點分裂的最小損失減少,越大模型越保守,減少過擬合風(fēng)險
'subsample': [0.7, 0.8, 0.9], # 隨機選擇樣本的比例,用于構(gòu)建每棵樹,降低過擬合
'colsample_bytree': [0.7, 0.8, 0.9], # 隨機選擇特征的比例,用于構(gòu)建每棵樹,增強模型的泛化能力
'reg_alpha': [0, 0.1, 0.5], # L1正則化項的權(quán)重,增加稀疏性,降低過擬合
'reg_lambda': [1, 1.5, 2], # L2正則化項的權(quán)重,控制模型復(fù)雜度,增加泛化能力
'scale_pos_weight': [1, 2, 3] # 類別不平衡時調(diào)整正負樣本權(quán)重比,值為正負樣本比例 僅適用為二分類模型
}

這種網(wǎng)格搜索方法通過系統(tǒng)地嘗試不同的參數(shù)組合,幫助 XGBoost 模型在各種條件下表現(xiàn)良好,并找到最適合數(shù)據(jù)的參數(shù)設(shè)置,在定義參數(shù)網(wǎng)格時,我們應(yīng)注意選擇最關(guān)鍵的參數(shù),以避免模型運行時間過長的問題,接下來使用的還是第一種網(wǎng)格

使用GridSearchCV進行網(wǎng)格搜索和k折交叉驗證

# 使用GridSearchCV進行網(wǎng)格搜索和k折交叉驗證
grid_search = GridSearchCV(
estimator=model_xgb,
param_grid=param_grid,
scoring='neg_log_loss', # 評價指標(biāo)為負對數(shù)損失
cv=5, # 5折交叉驗證
n_jobs=-1, # 并行計算
verbose=1 # 輸出詳細進度信息
)

使用 GridSearchCV 結(jié)合 5 折交叉驗證,在所有 CPU 核心上并行計算,通過負對數(shù)損失(neg_log_loss)作為評價指標(biāo),系統(tǒng)地搜索并評估 XGBoost 模型的最佳參數(shù)組合,同時輸出詳細的進度信息

訓(xùn)練模型并輸出最優(yōu)參數(shù)及得分

# 訓(xùn)練模型
grid_search.fit(X_train, y_train)

# 輸出最優(yōu)參數(shù)
print("Best parameters found: ", grid_search.best_params_)
print("Best Log Loss score: ", -grid_search.best_score_)

網(wǎng)格搜索通過系統(tǒng)地評估參數(shù)組合,發(fā)現(xiàn)最優(yōu)參數(shù)組合為:learning_rate: 0.02(學(xué)習(xí)率)max_depth: 3(樹的最大深度)n_estimators: 200(樹的數(shù)量)這些參數(shù)組合在當(dāng)前給定的參數(shù)網(wǎng)格和交叉驗證配置下提供了最佳的模型性能

訓(xùn)練最優(yōu)參數(shù)下的模型

# 使用最優(yōu)參數(shù)訓(xùn)練模型
best_model = grid_search.best_estimator_

使用找到的最優(yōu)參數(shù)重新訓(xùn)練模型,得到最終的最佳模型

模型評價指標(biāo)輸出

from sklearn.metrics import classification_report

# 預(yù)測測試集
y_pred = best_model.predict(X_test)

# 輸出模型報告, 查看評價指標(biāo)
print(classification_report(y_test, y_pred))

混淆矩陣熱力圖繪制

from sklearn.metrics import confusion_matrix
import seaborn as sns
# 輸出混淆矩陣
conf_matrix = confusion_matrix(y_test, y_pred)

# 繪制熱力圖
plt.figure(figsize=(10, 7), dpi=1200)
sns.heatmap(conf_matrix, annot=True, annot_kws={'size':15},
fmt='d', cmap='YlGnBu', cbar_kws={'shrink': 0.75})
plt.xlabel('Predicted Label', fontsize=12)
plt.ylabel('True Label', fontsize=12)
plt.title('Confusion matrix heat map', fontsize=15)
plt.show()

本文章轉(zhuǎn)載微信公眾號@Python機器學(xué)習(xí)AI

上一篇:

決策曲線分析 (DCA) 可視化:如何判斷模型在實際應(yīng)用中的表現(xiàn)

下一篇:

優(yōu)化XGBoost回歸模型:網(wǎng)格搜索與K折交叉驗證實現(xiàn)

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費