import numpy as np
df = pd.read_excel('模擬.xlsx')
from sklearn.model_selection import train_test_split
y = df['price']
X = df.drop(['price'], axis=1)
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=42)
df.head()

這里加載數據、準備特征和標簽,并將數據集劃分為訓練集和測試集,這是一個回歸任務,特征price為目標特征其余特征為自變量。

模型訓練

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split

# 設置參數范圍
n_estimators_range = np.arange(25, 201, 20)
max_depth_range = np.arange(3, 16, 1)

# 用于存儲結果的列表
rmse_results = []
r2_results = []

# 進行嵌套循環,遍歷參數組合
for n_estimators in n_estimators_range:
for max_depth in max_depth_range:
# 創建隨機森林回歸模型
model = RandomForestRegressor(
n_estimators=n_estimators,
max_depth=max_depth,
random_state=42
)

# 訓練模型
model.fit(train_X, train_y)

# 進行預測
predictions = model.predict(test_X)

# 計算 RMSE 和 R^2
rmse = np.sqrt(mean_squared_error(test_y, predictions))
r2 = r2_score(test_y, predictions)

# 保存 RMSE 結果
rmse_results.append({
'n_estimators': n_estimators,
'max_depth': max_depth,
'RMSE': rmse
})

# 保存 R^2 結果
r2_results.append({
'n_estimators': n_estimators,
'max_depth': max_depth,
'R^2': r2
})

# 將結果轉換為 DataFrame
rmse_df = pd.DataFrame(rmse_results)
r2_df = pd.DataFrame(r2_results)

通過遍歷不同的 n_estimators 和 max_depth 參數組合,使用隨機森林回歸模型對數據進行訓練和測試,計算每種參數組合下的模型預測誤差(RMSE)和決定系數(R2),并將結果分別保存為各自的一個dataframe,方便接下來進行繪圖展示模型參數和模型評價指標的相互影響變化。

模型可視化

模型參數對RMSE的影響

import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from matplotlib import rcParams
# 設置字體
rcParams['font.family'] = 'Times New Roman'
rcParams['font.size'] = 12 # 設置適合的字體大小
# 創建網格數據
pivot_table = rmse_df.pivot(index="max_depth", columns="n_estimators", values="RMSE")

# 定義自定義顏色映射(從藍色到紅色的漸變,并使其淡化)
cmap = LinearSegmentedColormap.from_list(
"custom_cmap",
[(180/255, 190/255, 240/255), (250/255, 150/255, 160/255)]
)

# 創建圖表
plt.figure(figsize=(10, 8), dpi=1200)

# 使用 contourf 進行平滑填充等高線圖
contour = plt.contourf(
pivot_table.columns.values, # n_estimators 值
pivot_table.index.values, # max_depth 值
pivot_table.values, # RMSE 值
levels=np.linspace(pivot_table.values.min(), pivot_table.values.max(), 10), # 等高線數量,越多越平滑
cmap=cmap # 自定義顏色映射
)

# 添加顏色條,并設置三位小數的格式
cbar = plt.colorbar(contour, format='%.3f')
cbar.set_label('RMSE')
# 設置 y 軸刻度從 4 開始,每 2 為一個間隔
plt.yticks(np.arange(4, pivot_table.index.max() + 1, 2))
# 設置圖表標題和軸標簽
plt.title("Hyperparameter Tuning - RMSE (Magnetite(Mt)%)")
plt.xlabel("n_estimators")
plt.ylabel("max_depth")

# 顯示圖表
plt.show()

通過創建等高線圖(等高線的數量和模型的迭代次數都會影響可視化效果,選擇合理的等高線數量可以使可視化圖表更加精美和易于解讀),我們可視化了不同 n_estimators 和 max_depth 參數組合下隨機森林模型的 RMSE 值,以直觀分析超參數對模型誤差的影響。此處僅選取了隨機森林中最重要的兩個參數作為 X 軸和 Y 軸進行可視化。如果讀者希望對更多參數進行可視化,建議可以引入降維方法,將多維參數降至 2D 或 3D 進行展示,盡管這樣會失去對實際參數值的直接呈現。

當前的可視化展示了不同 n_estimators 和 max_depth 參數組合下的 RMSE 值,但并未明確標出在最優平均指標下的模型參數,接下來,我們將通過改進可視化,在圖表中添加文本標注,明確指出 RMSE 最小值所對應的最優參數組合。

# 創建網格數據
pivot_table = rmse_df.pivot(index="max_depth", columns="n_estimators", values="RMSE")

# 定義自定義顏色映射(從藍色到紅色的漸變,并使其淡化)
cmap = LinearSegmentedColormap.from_list(
"custom_cmap",
[(180/255, 190/255, 240/255), (250/255, 150/255, 160/255)]
)

# 創建圖表
plt.figure(figsize=(10, 8),dpi=1200)

# 使用 contourf 進行平滑填充等高線圖
contour = plt.contourf(
pivot_table.columns.values, # n_estimators 值
pivot_table.index.values, # max_depth 值
pivot_table.values, # RMSE 值
levels=np.linspace(pivot_table.values.min(), pivot_table.values.max(), 10), # 等高線數量,越多越平滑
cmap=cmap # 自定義顏色映射
)

# 找到 RMSE 最小值的位置
min_rmse = pivot_table.values.min()
min_position = np.where(pivot_table.values == min_rmse)
min_x = pivot_table.columns[min_position[1][0]]
min_y = pivot_table.index[min_position[0][0]]

# 在最小值位置添加標注和箭頭,向左移動標注
plt.annotate(
f'RMSE Min: {min_rmse:.3f}\n(n_estimators: {min_x}, max_depth: {min_y})',
xy=(min_x, min_y), xycoords='data',
xytext=(min_x - 30, min_y + 1), textcoords='data', # 向左移動
arrowprops=dict(facecolor='black', shrink=0.05, width=1, headwidth=6),
fontsize=12, ha='right' # 文本對齊方式改為靠右
)

# 添加顏色條,并設置三位小數的格式
cbar = plt.colorbar(contour, format='%.3f')
cbar.set_label('RMSE')

# 設置 y 軸刻度從 4 開始,每 2 為一個間隔
plt.yticks(np.arange(4, pivot_table.index.max() + 1, 2))

# 設置圖表標題和軸標簽
plt.title("Hyperparameter Tuning - RMSE (Magnetite(Mt)%)")
plt.xlabel("n_estimators")
plt.ylabel("max_depth")
# 顯示圖表
plt.show()

模型參數對 R2的影響

# 創建網格數據
pivot_table = r2_df.pivot(index="max_depth", columns="n_estimators", values="R^2")

# 定義自定義顏色映射(從藍色到紅色的漸變,并使其淡化)
cmap = LinearSegmentedColormap.from_list(
"custom_cmap",
[(180/255, 190/255, 240/255), (250/255, 150/255, 160/255)]
)

# 創建圖表
plt.figure(figsize=(10, 8),dpi=1200)

# 使用 contourf 進行平滑填充等高線圖
contour = plt.contourf(
pivot_table.columns.values, # n_estimators 值
pivot_table.index.values, # max_depth 值
pivot_table.values, # RMSE 值
levels=np.linspace(pivot_table.values.min(), pivot_table.values.max(), 10), # 等高線數量,越多越平滑
cmap=cmap # 自定義顏色映射
)

# 添加顏色條,并設置三位小數的格式
cbar = plt.colorbar(contour, format='%.3f')
cbar.set_label('R^2')
# 設置 y 軸刻度從 4 開始,每 2 為一個間隔
plt.yticks(np.arange(4, pivot_table.index.max() + 1, 2))
# 設置圖表標題和軸標簽
plt.title(r"Hyperparameter Tuning - $R^2$ (Magnetite(Mt)%)")
plt.xlabel("n_estimators")
plt.ylabel("max_depth")
# 顯示圖表
plt.show()

同理與RMSE的代碼相似,但這里目的是可視化不同參數組合下的 值,而不是 RMSE。

# 創建網格數據
pivot_table = r2_df.pivot(index="max_depth", columns="n_estimators", values="R^2")

# 定義自定義顏色映射(從藍色到紅色的漸變,并使其淡化)
cmap = LinearSegmentedColormap.from_list(
"custom_cmap",
[(180/255, 190/255, 240/255), (250/255, 150/255, 160/255)]
)

# 創建圖表
plt.figure(figsize=(10, 8), dpi=1200)

# 使用 contourf 進行平滑填充等高線圖
contour = plt.contourf(
pivot_table.columns.values, # n_estimators 值
pivot_table.index.values, # max_depth 值
pivot_table.values, # R^2 值
levels=np.linspace(pivot_table.values.min(), pivot_table.values.max(), 10), # 等高線數量,越多越平滑
cmap=cmap # 自定義顏色映射
)

# 添加顏色條,并設置三位小數的格式
cbar = plt.colorbar(contour, format='%.3f')
cbar.set_label(r"$R^2$")

# 找到 R^2 最大值及對應的 max_depth 和 n_estimators
max_r2 = pivot_table.values.max()
max_r2_location = np.where(pivot_table.values == max_r2)
max_depth = pivot_table.index[max_r2_location[0][0]]
n_estimators = pivot_table.columns[max_r2_location[1][0]]

# 在圖表上添加文本標注
plt.text(
x=n_estimators,
y=max_depth,
s=f"$R^2$: {max_r2:.3f}\nmax_depth: {max_depth}\nn_estimators: {n_estimators}",
color="black",
fontsize=10,
ha="right", # 水平對齊方式為右對齊
va="top", # 垂直對齊方式為頂對齊
bbox=dict(facecolor='white', alpha=0.6, edgecolor='none') # 添加背景框以提高可讀性
)

# 設置 y 軸刻度從 4 開始,每 2 為一個間隔
plt.yticks(np.arange(4, pivot_table.index.max() + 1, 2))

# 設置圖表標題和軸標簽
plt.title(r"Hyperparameter Tuning - $R^2$ (Magnetite(Mt)%)")
plt.xlabel("n_estimators")
plt.ylabel("max_depth")

# 顯示圖表
plt.show()

結束語

通過本次分析,我們對隨機森林模型中的兩個關鍵參數 n_estimators 和 max_depth 在不同組合下對模型性能的影響進行了可視化探討,主要聚焦于 和RMSE這兩個評價指標,通過直觀的可視化,我們不僅揭示了如何通過調整超參數來優化模型,還提供了一種有效的方法來識別最優的參數組合。

然而,模型性能的評估并不僅限于 和RMSE,讀者們可以進一步擴展此方法,針對其它回歸評價指標,如 MAE(平均絕對誤差)或 MAPE(平均絕對百分比誤差)等,進行類似的分析,同樣,對于分類模型而言,此方法同樣適用,可以針對 F1-score、召回率等指標進行參數調優的可視化展示,從而全面提升模型的準確性與可靠性。

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

上一篇:

特征選擇:基于隨機森林的Boruta算法應用

下一篇:

提升機器學習精度:利用SHAP值與蒙特卡洛模擬優化特征選擇

我們有何不同?

API服務商零注冊

多API并行試用

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

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

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

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

#AI深度推理大模型API

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

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