機器學習建模過程中,常常需要評估模型預測值與真實值之間的擬合程度,這種圖表的主要作用是直觀展示機器學習模型預測結(jié)果的準確性和一致性,尤其在回歸任務(wù)中用來評估模型對連續(xù)變量的預測效果,以下是圖表中的幾個關(guān)鍵元素及其作用:

代碼實現(xiàn)

模型構(gòu)建

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")

plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('2024-11-5-公眾號Python機器學習AI.xlsx')
from sklearn.model_selection import train_test_split, KFold

X = df.drop(['待預測變量Y'],axis=1)
y = df['待預測變量Y']

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

from hyperopt import fmin, tpe, hp
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error

# 定義超參數(shù)搜索空間
parameter_space_rf = {
'n_estimators': hp.choice('n_estimators', [50, 100, 200, 300]), # 決策樹數(shù)量
'max_depth': hp.choice('max_depth', [5, 10, 20, None]), # 樹的最大深度
'min_samples_split': hp.uniform('min_samples_split', 0.01, 0.5), # 分裂所需最小樣本比例
'min_samples_leaf': hp.uniform('min_samples_leaf', 0.01, 0.5) # 葉節(jié)點最小樣本比例
}

# 定義目標函數(shù)
def objective(params):
# 使用超參數(shù)創(chuàng)建隨機森林回歸模型
model = RandomForestRegressor(
n_estimators=params['n_estimators'],
max_depth=params['max_depth'],
min_samples_split=params['min_samples_split'],
min_samples_leaf=params['min_samples_leaf'],
random_state=42
)

# 在訓練集上擬合模型
model.fit(X_train, y_train)

# 在測試集上預測
y_pred = model.predict(X_test)

# 計算均方誤差(MSE)
mse = mean_squared_error(y_test, y_pred)

# 返回MSE,Hyperopt會最小化該目標值
return mse

# 運行超參數(shù)優(yōu)化
best_params = fmin(
fn=objective, # 優(yōu)化的目標函數(shù)
space=parameter_space_rf, # 搜索空間
algo=tpe.suggest, # 貝葉斯優(yōu)化算法
max_evals=100 # 最大評估次數(shù)
)

# 顯示最優(yōu)超參數(shù)組合
print("Best hyperparameters:", best_params)

# 使用最佳超參數(shù)組合重新訓練模型
best_model_regression = RandomForestRegressor(
n_estimators=[50, 100, 200, 300][best_params['n_estimators']],
max_depth=[5, 10, 20, None][best_params['max_depth']],
min_samples_split=best_params['min_samples_split'],
min_samples_leaf=best_params['min_samples_leaf'],
random_state=42
)

# 在訓練集上訓練模型
best_model_regression.fit(X_train, y_train)

使用Hyperopt庫對隨機森林回歸模型的超參數(shù)進行優(yōu)化,以最小化均方誤差(MSE),并通過最佳參數(shù)組合訓練最終模型,為后續(xù)繪制預測結(jié)果的對比圖做好準備

模型評價指標

from sklearn import metrics

# 預測
y_pred_train = best_model_regression.predict(X_train)
y_pred_test = best_model_regression.predict(X_test)

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("擬合優(yōu)度 (R-squared):", r2_train)

print("\n測試集評價指標:")
print("均方誤差 (MSE):", mse_test)
print("均方根誤差 (RMSE):", rmse_test)
print("平均絕對誤差 (MAE):", mae_test)
print("擬合優(yōu)度 (R-squared):", r2_test)

計算模型在訓練集和測試集上的多項誤差指標(MSE、RMSE、MAE、R2),其中MSE和RMSE越小越好,表示模型預測誤差?。籑AE越小說明平均誤差更??;R2值越接近1,表示模型擬合度越高,從而綜合評估模型的預測性能

基礎(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) # 預測值散點圖
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("Random Forest Regression")
plt.xlabel("Observed dissolved N?O concentration (μg/L)")
plt.ylabel("Modeled dissolved N?O concentration (μg/L)")
plt.legend(loc="upper left")
plt.savefig('1.pdf', format='pdf', bbox_inches='tight')
plt.show()

生成了一個基礎(chǔ)可視化圖,用于比較隨機森林回歸模型在測試集上的預測值與真實觀察值。圖中包括:

用于快速評估模型預測效果,觀察預測值與真實值之間的吻合程度(當然作者這里為模擬數(shù)據(jù))

進階可視化—1

在基礎(chǔ)可視化的基礎(chǔ)上增加置信區(qū)間,以增強模型預測效果的解釋性,置信區(qū)間的添加提供了模型預測的置信水平,展示了模型的預測值圍繞擬合線的分布,進一步說明模型的穩(wěn)定性和預測的準確度,使用置信區(qū)間后,可以更直觀地了解模型預測的精度和可能的誤差范圍,幫助判斷預測值的可靠性,這里也已經(jīng)基本接近文獻中的可視化了,但是會發(fā)現(xiàn)文獻中的置信區(qū)間總體而言較為顯眼,可能的原因為是由于數(shù)據(jù)點少、殘差大、置信水平高或數(shù)據(jù)偏離擬合線等因素引起的,當然也可以引入其它變量在不影響原始數(shù)據(jù)的統(tǒng)計意義下,調(diào)整置信區(qū)間在圖表中的顯示范圍。

進階可視化—2

在這里引入?yún)?shù)放大置信區(qū)間的寬度,scale_factor是一個人為設(shè)置的縮放因子,用于放大或縮小置信區(qū)間的寬度,通常,置信區(qū)間的寬度由統(tǒng)計公式計算,但可以通過將其乘以scale_factor來調(diào)整寬度,以增加或減少置信區(qū)間的范圍,當 scale_factor=1時,置信區(qū)間的寬度為標準理論值;若scale_factor 1(例如 1.5),置信區(qū)間的寬度會變大,使圖中陰影區(qū)域擴展;而若scale_factor1<1(例如 0.8),置信區(qū)間寬度則會縮小,通過調(diào)整scale_factor,可以在圖中更好地展示擬合效果,例如當置信區(qū)間看起來太窄時,可以增大scale_factor使其更明顯,需要注意的是,scale_factor僅影響置信區(qū)間的視覺展示范圍,并不會改變數(shù)據(jù)的實際統(tǒng)計意義。

文章轉(zhuǎn)自微信公眾號@Python機器學習AI

上一篇:

貝葉斯優(yōu)化在XGBoost中的應用:從參數(shù)調(diào)優(yōu)到性能提升

下一篇:

復現(xiàn)Nature圖表——基于PCA降維與模型預測概率的分類效果可視化
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

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

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

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

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

#AI深度推理大模型API

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

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