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 文件中分別加載訓練數據 (GBDT_train.xlsx) 和測試數據 (GBDT_test.xlsx) 到數據框 (df_train 和 df_test) 中,里面包含真實值以及預測值。
from sklearn import metrics
# 真實
y_train = df_train['Experimental value']
y_test = df_test['Experimental value']
# 預測
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()
# 計算訓練集的指標
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)
# 計算測試集的指標
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("訓練集評價指標:")
print("均方誤差 (MSE):", mse_train)
print("均方根誤差 (RMSE):", rmse_train)
print("平均絕對誤差 (MAE):", mae_train)
print("擬合優度 (R-squared):", r2_train)
print("\n測試集評價指標:")
print("均方誤差 (MSE):", mse_test)
print("均方根誤差 (RMSE):", rmse_test)
print("平均絕對誤差 (MAE):", mae_test)
print("擬合優度 (R-squared):", r2_test)
從訓練集和測試集的數據中提取真實值 (Experimental value) 和預測值 (Predicted value),計算模型在訓練集和測試集上的回歸性能指標。
# 創建一個包含訓練集和測試集真實值與預測值的數據框
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])
# 自定義調色板
palette = {'Train': '#b4d4e1', 'Test': '#f4ba8a'}
# 創建 JointGrid 對象
plt.figure(figsize=(8, 6), dpi=1200)
g = sns.JointGrid(data=data, x="True", y="Predicted", hue="Data Set", height=10, palette=palette)
# 繪制中心的散點圖
g.plot_joint(sns.scatterplot, alpha=0.5)
# 添加訓練集的回歸線
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)
# 添加擬合優度文本在右下角
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()
plt.figure(figsize=(8, 6), dpi=1200)
plt.scatter(y_test, y_pred_test, color='coral', label="Predicted N?O concentration", alpha=0.2) # 預測值散點圖
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()
通過多項式擬合計算訓練集和測試集的預測值,并利用置信區間公式估算預測結果的不確定性,分別繪制訓練集和測試集的擬合曲線、95%置信區間、散點圖以及誤差分布直方圖,此外添加對角線(1:1參考線)以顯示預測值與真實值的理想匹配,最終生成一張包含主要信息和輔助分布圖的可視化圖表。