在接下來的代碼實(shí)現(xiàn)中,我們將復(fù)現(xiàn)并細(xì)化類似的可視化效果,希望能為大家在實(shí)踐中提供參考,通過這種方式,我們能夠更好地理解模型的表現(xiàn),并為數(shù)據(jù)分析與模型調(diào)優(yōu)提供有力支持
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
df = pd.read_excel('數(shù)據(jù).xlsx')
# 劃分特征和目標(biāo)變量
X = df.drop(['price'], axis=1)
y = df['price']
# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
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': 'reg:squarederror', # 損失函數(shù),這里使用平方誤差
'max_leaves': 127, # 每棵樹的葉子節(jié)點(diǎn)數(shù)量,控制模型復(fù)雜度。較大值可以提高模型復(fù)雜度但可能導(dǎo)致過擬合
'verbosity': 1, # 控制 XGBoost 輸出信息的詳細(xì)程度,0表示無輸出,1表示輸出進(jìn)度信息
'seed': 42, # 隨機(jī)種子,用于重現(xiàn)模型的結(jié)果
'nthread': -1, # 并行運(yùn)算的線程數(shù)量,-1表示使用所有可用的CPU核心
'colsample_bytree': 0.6, # 每棵樹隨機(jī)選擇的特征比例,用于增加模型的泛化能力
'subsample': 0.7 # 每次迭代時(shí)隨機(jī)選擇的樣本比例,用于增加模型的泛化能力
}
model_xgb = xgb.XGBRegressor(**params_xgb)
# 定義參數(shù)網(wǎng)格,用于網(wǎng)格搜索
param_grid = {
'n_estimators': [100, 200, 300, 400, 500], # 樹的數(shù)量,控制模型的復(fù)雜度
'max_depth': [3, 4, 5, 6, 7], # 樹的最大深度,控制模型的復(fù)雜度,防止過擬合
'min_child_weight': [1, 2, 3, 4, 5], # 節(jié)點(diǎn)最小權(quán)重,值越大,算法越保守,用于控制過擬合
}
grid_search = GridSearchCV(
estimator=model_xgb,
param_grid=param_grid,
scoring='neg_root_mean_squared_error',
cv=5,
n_jobs=-1,
verbose=1
)
# 訓(xùn)練模型
grid_search.fit(X_train, y_train)
best_model = grid_search.best_estimator_
使用網(wǎng)格搜索優(yōu)化了XGBoost回歸模型的參數(shù),并在訓(xùn)練集上訓(xùn)練了最佳模型,用于預(yù)測目標(biāo)變量。
from sklearn import metrics
# 預(yù)測
y_pred_train = best_model.predict(X_train)
y_pred_test = best_model.predict(X_test)
y_pred_train_list = y_pred_train.tolist()
y_pred_test_list = y_pred_test.tolist()
# 計(jì)算訓(xùn)練集的指標(biāo)
mse_train = metrics.mean_squared_error(y_train, y_pred_train_list)
rmse_train = np.sqrt(mse_train)
mae_train = metrics.mean_absolute_error(y_train, y_pred_train_list)
r2_train = metrics.r2_score(y_train, y_pred_train_list)
# 計(jì)算測試集的指標(biāo)
mse_test = metrics.mean_squared_error(y_test, y_pred_test_list)
rmse_test = np.sqrt(mse_test)
mae_test = metrics.mean_absolute_error(y_test, y_pred_test_list)
r2_test = metrics.r2_score(y_test, y_pred_test_list)
print("訓(xùn)練集評(píng)價(jià)指標(biāo):")
print("均方誤差 (MSE):", mse_train)
print("均方根誤差 (RMSE):", rmse_train)
print("平均絕對(duì)誤差 (MAE):", mae_train)
print("擬合優(yōu)度 (R-squared):", r2_train)
print("\n測試集評(píng)價(jià)指標(biāo):")
print("均方誤差 (MSE):", mse_test)
print("均方根誤差 (RMSE):", rmse_test)
print("平均絕對(duì)誤差 (MAE):", mae_test)
print("擬合優(yōu)度 (R-squared):", r2_test)
量化和比較模型在訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)上的預(yù)測效果,通過一系列常用的回歸指標(biāo)來衡量模型的性能。
import seaborn as sns
from sklearn import metrics
# 創(chuàng)建一個(gè)包含訓(xùn)練集和測試集真實(shí)值與預(yù)測值的數(shù)據(jù)框
data_train = pd.DataFrame({
'True': y_train,
'Predicted': y_pred_train,
'Data Set': 'Train'
})
data_test = pd.DataFrame({
'True': y_test,
'Predicted': y_pred_test,
'Data Set': 'Test'
})
data = pd.concat([data_train, data_test])
# 自定義調(diào)色板
palette = {'Train': '#b4d4e1', 'Test': '#f4ba8a'}
# 創(chuàng)建 JointGrid 對(duì)象
plt.figure(figsize=(8, 6), dpi=1200)
g = sns.JointGrid(data=data, x="True", y="Predicted", hue="Data Set", height=10, palette=palette)
# 繪制中心的散點(diǎn)圖
g.plot_joint(sns.scatterplot, alpha=0.5)
# 添加訓(xùn)練集的回歸線
sns.regplot(data=data_train, x="True", y="Predicted", scatter=False, ax=g.ax_joint, color='#b4d4e1', label='Train Regression Line')
# 添加測試集的回歸線
sns.regplot(data=data_test, x="True", y="Predicted", scatter=False, ax=g.ax_joint, color='#f4ba8a', label='Test Regression Line')
# 添加邊緣的柱狀圖
g.plot_marginals(sns.histplot, kde=False, element='bars', multiple='stack', alpha=0.5)
# 添加擬合優(yōu)度文本在右下角
ax = g.ax_joint
ax.text(0.95, 0.1, f'Train $R^2$ = {r2_train:.3f}', transform=ax.transAxes, fontsize=12,
verticalalignment='bottom', horizontalalignment='right', bbox=dict(boxstyle="round,pad=0.3", edgecolor="black", facecolor="white"))
ax.text(0.95, 0.05, f'Test $R^2$ = {r2_test:.3f}', transform=ax.transAxes, fontsize=12,
verticalalignment='bottom', horizontalalignment='right', bbox=dict(boxstyle="round,pad=0.3", edgecolor="black", facecolor="white"))
# 在左上角添加模型名稱文本
ax.text(0.75, 0.99, 'Model = xgboost', transform=ax.transAxes, fontsize=12,
verticalalignment='top', horizontalalignment='left', bbox=dict(boxstyle="round,pad=0.3", edgecolor="black", facecolor="white"))
# 添加中心線
ax.plot([data['True'].min(), data['True'].max()], [data['True'].min(), data['True'].max()], c="black", alpha=0.5, linestyle='--', label='x=y')
ax.legend()
plt.savefig("TrueFalse.pdf", format='pdf', bbox_inches='tight')
創(chuàng)建一個(gè)聯(lián)合網(wǎng)格圖(JointGrid),其中包含散點(diǎn)圖、回歸線以及直方圖,用于直觀比較真實(shí)值和預(yù)測值的關(guān)系,讀者能直觀地看到模型在訓(xùn)練集和測試集上的表現(xiàn),并通過 值和對(duì)角線判斷模型的擬合效果,如果要關(guān)閉y軸柱狀圖只需要在添加邊緣的柱狀圖 下面添加以下代碼。
# 關(guān)閉 y 軸的邊緣柱狀圖
g.ax_marg_y.set_visible(False)
文章轉(zhuǎn)自微信公眾號(hào)@Python機(jī)器學(xué)習(xí)AI
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)