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

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

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

# 劃分訓練集和測試集
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 中讀取數據,并將其分為訓練集和測試集,為后續的模型訓練和評估做好準備,通過分層采樣(stratify 參數)保證訓練集和測試集的類別分布一致,這對于模型的公平性和泛化能力至關重要,該數據集為二分類數據

定義XGBoost模型參數

import xgboost as xgb
from sklearn.model_selection import GridSearchCV

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

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

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

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

初始化分類模型

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

使用定義的參數初始化XGBoost分類模型

定義參數網格

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

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

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

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

使用GridSearchCV進行網格搜索和k折交叉驗證

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

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

訓練模型并輸出最優參數及得分

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

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

網格搜索通過系統地評估參數組合,發現最優參數組合為:learning_rate: 0.02(學習率)max_depth: 3(樹的最大深度)n_estimators: 200(樹的數量)這些參數組合在當前給定的參數網格和交叉驗證配置下提供了最佳的模型性能

訓練最優參數下的模型

# 使用最優參數訓練模型
best_model = grid_search.best_estimator_

使用找到的最優參數重新訓練模型,得到最終的最佳模型

模型評價指標輸出

from sklearn.metrics import classification_report

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

# 輸出模型報告, 查看評價指標
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()

本文章轉載微信公眾號@Python機器學習AI

上一篇:

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

下一篇:

優化XGBoost回歸模型:網格搜索與K折交叉驗證實現

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

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

#AI深度推理大模型API

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

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