代碼實(shí)現(xiàn)

數(shù)據(jù)讀取

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import metrics
import scipy.stats as stats
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False

df_train = pd.read_excel('GBDT_train.xlsx')
df_test = pd.read_excel('GBDT_test.xlsx')

從 Excel 文件中分別加載訓(xùn)練數(shù)據(jù) (GBDT_train.xlsx) 和測(cè)試數(shù)據(jù) (GBDT_test.xlsx) 到數(shù)據(jù)框 (df_train 和 df_test) 中,里面包含真實(shí)值以及預(yù)測(cè)值。

模型性能計(jì)算

from sklearn import metrics
# 真實(shí)
y_train = df_train['Experimental value']
y_test = df_test['Experimental value']
# 預(yù)測(cè)
y_pred_train = df_train['Predicted value']
y_pred_test = df_test['Predicted value']

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ì)算測(cè)試集的指標(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測(cè)試集評(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)練集和測(cè)試集的數(shù)據(jù)中提取真實(shí)值 (Experimental value) 和預(yù)測(cè)值 (Predicted value),計(jì)算模型在訓(xùn)練集和測(cè)試集上的回歸性能指標(biāo)。

文章一可視化

# 創(chuàng)建一個(gè)包含訓(xùn)練集和測(cè)試集真實(shí)值與預(yù)測(cè)值的數(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')
# 添加測(cè)試集的回歸線
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 = GBDT', 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')
plt.show()

文章二基礎(chǔ)可視化

plt.figure(figsize=(8, 6), dpi=1200)
plt.scatter(y_test, y_pred_test, color='coral', label="Predicted N?O concentration", alpha=0.2) # 預(yù)測(cè)值散點(diǎn)圖
plt.plot(y_test, y_test, color='grey', alpha=0.6, label="1:1 Line") # 1:1灰色虛線

# 擬合線
z = np.polyfit(y_test, y_pred_test, 1)
p = np.poly1d(z)
plt.plot(y_test, p(y_test), color='blue', alpha=0.6,
label=f"Line of Best Fit\n$R^2$ = {r2_test:.2f},MAE = {mae_test:.2f}")
plt.title("GBDT Regression")
plt.xlabel("Observed Values")
plt.ylabel("Predicted Values")
plt.legend(loc="upper left")
plt.savefig('1.pdf', format='pdf', bbox_inches='tight')
plt.show()

集成置信區(qū)間與邊緣柱狀圖

通過多項(xiàng)式擬合計(jì)算訓(xùn)練集和測(cè)試集的預(yù)測(cè)值,并利用置信區(qū)間公式估算預(yù)測(cè)結(jié)果的不確定性,分別繪制訓(xùn)練集和測(cè)試集的擬合曲線、95%置信區(qū)間、散點(diǎn)圖以及誤差分布直方圖,此外添加對(duì)角線(1:1參考線)以顯示預(yù)測(cè)值與真實(shí)值的理想匹配,最終生成一張包含主要信息和輔助分布圖的可視化圖表。

文章轉(zhuǎn)自微信公眾號(hào)@Python機(jī)器學(xué)習(xí)AI

上一篇:

從入門到實(shí)踐:如何利用Stacking集成多種機(jī)器學(xué)習(xí)算法提高模型性能

下一篇:

特征選擇:Lasso和Ridge算法結(jié)合的彈性網(wǎng)絡(luò)回歸實(shí)現(xiàn)

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

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

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

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

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)