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

df = pd.read_excel('數據.xlsx')

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

# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

加載Excel文件中的數據,分離特征和目標變量,并將數據劃分為訓練集和測試集

定義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': 'reg:squarederror', # 損失函數,這里使用平方誤差
'max_leaves': 127, # 每棵樹的葉子節點數量,控制模型復雜度。較大值可以提高模型復雜度但可能導致過擬合
'verbosity': 1, # 控制 XGBoost 輸出信息的詳細程度,0表示無輸出,1表示輸出進度信息
'seed': 42, # 隨機種子,用于重現模型的結果
'nthread': -1, # 并行運算的線程數量,-1表示使用所有可用的CPU核心
'colsample_bytree': 0.6, # 每棵樹隨機選擇的特征比例,用于增加模型的泛化能力
'subsample': 0.7 # 每次迭代時隨機選擇的樣本比例,用于增加模型的泛化能力
}

這里定義一組初始參數,控制模型的學習速率、提升方法、損失函數等,這些參數用來初始化XGBoost模型

初始化回歸模型

model_xgb = xgb.XGBRegressor(**params_xgb)

使用定義的參數初始化XGBoost回歸模型

定義參數網格

# 定義參數網格,用于網格搜索
param_grid = {
'n_estimators': [100, 200, 300, 400, 500], # 樹的數量,控制模型的復雜度
'max_depth': [3, 4, 5, 6, 7], # 樹的最大深度,控制模型的復雜度,防止過擬合
'min_child_weight': [1, 2, 3, 4, 5], # 節點最小權重,值越大,算法越保守,用于控制過擬合
}

定義需要進行網格搜索的參數范圍,包括樹的數量、最大深度和最小節點權重,這些參數用于調整模型的復雜度和防止過擬合,當然除了這些參數以外還存在很對參數,下面給出一些參考(這些參數并沒有參與網格調參),網格參數范圍多少當對運行速度成倍數增長

param_grid = {
'learning_rate': [0.01, 0.02, 0.05, 0.1], # 學習率,控制每一步的步長,防止過擬合
'gamma': [0, 0.1, 0.2, 0.3], # 節點分裂所需的最小損失減少量,值越大,算法越保守,用于控制過擬合
'subsample': [0.6, 0.7, 0.8, 0.9], # 每次迭代時隨機選擇的樣本比例,防止過擬合
'colsample_bytree': [0.5, 0.6, 0.7, 0.8], # 每棵樹隨機選擇的特征比例,防止過擬合
'reg_alpha': [0, 0.01, 0.1, 1], # L1正則化項的權重,值越大,模型越簡單,用于防止過擬合
'reg_lambda': [0, 0.01, 0.1, 1], # L2正則化項的權重,值越大,模型越簡單,用于防止過擬合
}

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

grid_search = GridSearchCV(
estimator=model_xgb,
param_grid=param_grid,
scoring='neg_root_mean_squared_error',
cv=5,
n_jobs=-1,
verbose=1
)

GridSearchCV用于進行網格搜索和交叉驗證,scoring設為neg_root_mean_squared_error,即負均方根誤差,作為評估指標,cv=5表示使用5折交叉驗證,n_jobs=-1表示使用所有可用的CPU核心進行并行計算

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

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

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

5 folds: 表示使用5折交叉驗證。數據集被分成5個子集,每次使用其中的4個子集進行訓練,1個子集進行驗證,這樣進行5次,每個子集都作為一次驗證集,125 candidates: 表示總共有125組不同的參數組合需要評估(5x5x5)也就是定義的網格參數存在的組合形式,totalling 625 fits: 因為每個參數組合都要經過5次交叉驗證,所以總共進行625次模型訓練和評估(5×125=625),最后模型找到的最佳參數組合為max_depth=7、min_child_weight=5、n_estimators=500,使用這些參數,模型在驗證集上的平均RMSE分數為0.4666597060108463

訓練最優參數下的模型

best_model = grid_search.best_estimator_

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

模型評價指標輸出

from sklearn import metrics
# 預測
y_pred = best_model.predict(X_test)
y_pred_list = y_pred.tolist()
mse = metrics.mean_squared_error(y_test, y_pred_list)
rmse = np.sqrt(mse)
mae = metrics.mean_absolute_error(y_test, y_pred_list)
r2 = metrics.r2_score(y_test, y_pred_list)
print("均方誤差 (MSE):", mse)
print("均方根誤差 (RMSE):", rmse)
print("平均絕對誤差 (MAE):", mae)
print("擬合優度 (R-squared):", r2)

這里對測試集輸出該模型具體的評價指標

可視化

plt.figure(figsize=(10, 6), dpi=1200)
# 繪制 y_pred 和 y_test 的散點圖
plt.scatter(y_test, y_pred, alpha=0.3, color='blue', label='Predicted vs Actual')
# 繪制一條 y = x 的對角線,用于參考
max_value = max(max(y_test), max(y_pred))
plt.plot([0, max_value], [0, max_value], color='red', linestyle='--', linewidth=2, label='Ideal Line (y = x)')
plt.title(f'Actual vs Predicted Values\nR-squared: {r2:.2f}')
plt.xlabel('Actual Values')
plt.ylabel('Predicted Values')
plt.legend()
plt.grid(True)
plt.show()

繪制實際值 (y_test) 和預測值 (y_pred) 之間的散點圖,并在圖中添加一個理想對角線(y = x),以便比較實際值和預測值的關系,最后望讀者掌握XGBoost回歸模型的參數調優技巧,并通過網格搜索和K折交叉驗證實現更高效、更準確的模型

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

上一篇:

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

下一篇:

利用XGBoost模型進行多分類任務下的SHAP解釋附代碼講解及GUI展示

我們有何不同?

API服務商零注冊

多API并行試用

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

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

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

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

#AI深度推理大模型API

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

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