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

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

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-12-06公眾號(hào)Python機(jī)器學(xué)習(xí)AI.xlsx')
from sklearn.model_selection import train_test_split, KFold
X = df.drop(['Y'],axis=1)
y = df['Y']
# 劃分訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
random_state=42)

導(dǎo)入必要的庫(kù),讀取一個(gè)包含特征X和目標(biāo)變量Y的Excel數(shù)據(jù)集,將其分成訓(xùn)練集和測(cè)試集,目標(biāo)是構(gòu)建回歸模型進(jìn)行預(yù)測(cè),其中特征X和目標(biāo)變量Y是針對(duì)回歸任務(wù)設(shè)計(jì)的。

構(gòu)建多模型融合的Stacking回歸器

from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, AdaBoostRegressor, StackingRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from catboost import CatBoostRegressor
from sklearn.linear_model import LinearRegression
# 定義一級(jí)學(xué)習(xí)器
base_learners = [
("RF", RandomForestRegressor(n_estimators=100, random_state=42)),
("XGB", XGBRegressor(n_estimators=100, random_state=42, verbosity=0)),
("LGBM", LGBMRegressor(n_estimators=100, random_state=42, verbose=-1)),
("GBM", GradientBoostingRegressor(n_estimators=100, random_state=42)),
("AdaBoost", AdaBoostRegressor(n_estimators=100, random_state=42)),
("CatBoost", CatBoostRegressor(n_estimators=100, random_state=42, verbose=0))
]
# 定義二級(jí)學(xué)習(xí)器
meta_model = LinearRegression()
# 創(chuàng)建Stacking回歸器
stacking_regressor = StackingRegressor(estimators=base_learners, final_estimator=meta_model, cv=5)
# 訓(xùn)練模型
stacking_regressor.fit(X_train, y_train)

通過(guò)集成學(xué)習(xí)中的Stacking方法,結(jié)合多種回歸模型(包括隨機(jī)森林、XGBoost、LightGBM、Gradient Boosting、AdaBoost 和 CatBoost)作為一級(jí)學(xué)習(xí)器,利用線性回歸作為二級(jí)元學(xué)習(xí)器,學(xué)習(xí)各模型預(yù)測(cè)的最佳組合方式。最終通過(guò)5折交叉驗(yàn)證優(yōu)化模型性能,并在訓(xùn)練數(shù)據(jù)上訓(xùn)練Stacking回歸器,以提升整體的回歸預(yù)測(cè)效果。

如果將代碼用于分類模型,主要變化如下:

模型選擇:將所有的回歸模型替換為對(duì)應(yīng)的分類模型,例如:

RandomForestRegressor→RandomForestClassifier

GradientBoostingRegressor→GradientBoostingClassifier

AdaBoostRegressor→AdaBoostClassifier

XGBRegressor→XGBClassifier

LGBMRegressor→LGBMClassifier

CatBoostRegressor→CatBoostClassifier

元學(xué)習(xí)器:將LinearRegression替換為適合分類任務(wù)的模型,如LogisticRegression或其他分類器,目標(biāo)變量(y):確保 y 是分類標(biāo)簽而非連續(xù)值,StackingClassifier:使用StackingClassifier而不是StackingRegressor。

模型性能評(píng)價(jià)

from sklearn import metrics
# 真實(shí)值
y_train_true = y_train.values
y_test_true = y_test.values

# 預(yù)測(cè)值
y_pred_train = stacking_regressor.predict(X_train)
y_pred_test = stacking_regressor.predict(X_test)

# 計(jì)算訓(xùn)練集的指標(biāo)
mse_train = metrics.mean_squared_error(y_train_true, y_pred_train)
rmse_train = np.sqrt(mse_train)
mae_train = metrics.mean_absolute_error(y_train_true, y_pred_train)
r2_train = metrics.r2_score(y_train_true, y_pred_train)

# 計(jì)算測(cè)試集的指標(biāo)
mse_test = metrics.mean_squared_error(y_test_true, y_pred_test)
rmse_test = np.sqrt(mse_test)
mae_test = metrics.mean_absolute_error(y_test_true, y_pred_test)
r2_test = metrics.r2_score(y_test_true, y_pred_test)

# 輸出結(jié)果
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)

全面評(píng)估模型在訓(xùn)練集和測(cè)試集上的回歸性能,幫助判斷模型的擬合程度和泛化能力,從結(jié)果可以看出,模型在訓(xùn)練集上的性能非常好( =0.96誤差較小),但在測(cè)試集上性能有所下降( =0.83誤差增大),這表明模型存在一定的過(guò)擬合,即在訓(xùn)練數(shù)據(jù)上表現(xiàn)很好,但在未見(jiàn)數(shù)據(jù)上泛化能力稍弱。

不過(guò),這里主要的目標(biāo)是演示 Stacking 回歸器的實(shí)現(xiàn),因此對(duì)模型的具體參數(shù)(如基學(xué)習(xí)器和元學(xué)習(xí)器的超參數(shù))未進(jìn)行調(diào)優(yōu),而是采用了默認(rèn)配置。這種實(shí)現(xiàn)方式更側(cè)重于讓讀者理解Stacking的工作機(jī)制,而不是追求最佳的模型性能。如果要進(jìn)一步改進(jìn),可以針對(duì)基學(xué)習(xí)器和元學(xué)習(xí)器的超參數(shù)進(jìn)行優(yōu)化,或引入正則化手段來(lái)減少過(guò)擬合問(wèn)題。

可視化模型預(yù)測(cè)結(jié)果

通過(guò)散點(diǎn)圖和擬合線結(jié)合置信區(qū)間、直方圖,全面可視化Stacking回歸模型在訓(xùn)練集和測(cè)試集上的預(yù)測(cè)表現(xiàn),旨在直觀展示模型的擬合質(zhì)量、預(yù)測(cè)誤差分布以及與真實(shí)值的匹配情況。

單模型預(yù)測(cè)性能評(píng)估:多算法對(duì)比分析

from sklearn.model_selection import cross_val_score
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error, explained_variance_score

# 初始化結(jié)果存儲(chǔ)列表
train_results = []
test_results = []

# 修改 evaluate_model 函數(shù),分別存儲(chǔ)訓(xùn)練集和測(cè)試集的評(píng)價(jià)指標(biāo)
def evaluate_model(model_name, model, X_train, y_train, X_test, y_test, cv=5):
# K折交叉驗(yàn)證
kf = KFold(n_splits=cv, shuffle=True, random_state=42)
cv_scores = cross_val_score(model, X_train, y_train, cv=kf, scoring='r2')
mean_cv_r2 = np.mean(cv_scores)
std_cv_r2 = np.std(cv_scores)

# 訓(xùn)練模型
model.fit(X_train, y_train)

# 測(cè)試集預(yù)測(cè)
y_pred_test = model.predict(X_test)
# 訓(xùn)練集預(yù)測(cè)
y_pred_train = model.predict(X_train)

# 測(cè)試集指標(biāo)
r2_test = r2_score(y_test, y_pred_test)
rmse_test = mean_squared_error(y_test, y_pred_test, squared=False)
mae_test = mean_absolute_error(y_test, y_pred_test)
mape_test = np.mean(np.abs((y_test - y_pred_test) / y_test)) if np.all(y_test != 0) else np.nan
ev_test = explained_variance_score(y_test, y_pred_test)
test_results.append({
"CV Mean R2": mean_cv_r2,
"CV Std R2": std_cv_r2,
"R2": r2_test,
"RMSE": rmse_test,
"MAE": mae_test,
"MAPE": mape_test,
"EV": ev_test,
"Model": model_name
})

# 訓(xùn)練集指標(biāo)
r2_train = r2_score(y_train, y_pred_train)
rmse_train = mean_squared_error(y_train, y_pred_train, squared=False)
mae_train = mean_absolute_error(y_train, y_pred_train)
mape_train = np.mean(np.abs((y_train - y_pred_train) / y_train)) if np.all(y_train != 0) else np.nan
ev_train = explained_variance_score(y_train, y_pred_train)
train_results.append({
"R2": r2_train,
"RMSE": rmse_train,
"MAE": mae_train,
"MAPE": mape_train,
"EV": ev_train,
"Model": model_name
})

# 單獨(dú)訓(xùn)練每個(gè)模型
evaluate_model("Random Forest", RandomForestRegressor(random_state=42), X_train, y_train, X_test, y_test)
evaluate_model("XGBoost", XGBRegressor(random_state=42, verbosity=0), X_train, y_train, X_test, y_test)
evaluate_model("LightGBM", LGBMRegressor(random_state=42, verbose=-1), X_train, y_train, X_test, y_test)
evaluate_model("Gradient Boosting", GradientBoostingRegressor(random_state=42), X_train, y_train, X_test, y_test)
evaluate_model("AdaBoost", AdaBoostRegressor(random_state=42), X_train, y_train, X_test, y_test)
evaluate_model("CatBoost", CatBoostRegressor(random_state=42, verbose=0), X_train, y_train, X_test, y_test)

train_results_df = pd.DataFrame(train_results)
train_results_df
test_results_df = pd.DataFrame(test_results)
test_results_df

采用與前面 Stacking 模型第一層基學(xué)習(xí)器相同的模型和默認(rèn)參數(shù)(包括 Random Forest、XGBoost、LightGBM、Gradient Boosting、AdaBoost 和 CatBoost),分別在訓(xùn)練集和測(cè)試集上評(píng)估單一模型的預(yù)測(cè)性能,通過(guò)計(jì)算 R^2、RMSE、MAE、MAPE 和解釋方差等指標(biāo),為單一模型提供基準(zhǔn)性能,用于對(duì)比 Stacking 模型是否通過(guò)融合多模型的優(yōu)勢(shì)顯著提升了預(yù)測(cè)精度和穩(wěn)定性,接下來(lái)對(duì)這些評(píng)價(jià)指標(biāo)進(jìn)行一個(gè)簡(jiǎn)單的可視化。

import seaborn as sns
def plot_model_performance(results_df, dataset_type="Train", save_path=None):
colors = sns.color_palette("Set2", len(results_df))
long_format = results_df.melt(
id_vars=["Model"],
var_name="Metric",
value_name="Value"
)

plt.figure(figsize=(12, 6))
sns.barplot(data=long_format, x="Metric", y="Value", hue="Model", palette=colors)
plt.title(f"{dataset_type} Set Performance Metrics", fontsize=16)
plt.ylabel("Value", fontsize=12)
plt.xlabel("Metrics", fontsize=12)
plt.xticks(rotation=45, ha="right")
plt.ylim(0, 1.2) # 設(shè)置Y軸范圍,確保留白
plt.legend(title="Models", bbox_to_anchor=(1.05, 1), loc='upper left', fontsize=10)
if save_path:
plt.savefig(save_path, format="pdf", bbox_inches="tight", dpi=300)
plt.tight_layout()
plt.show()

# 繪制訓(xùn)練集指標(biāo)可視化
plot_model_performance(train_results_df, dataset_type="Train", save_path="train_metrics.pdf")
# 繪制測(cè)試集指標(biāo)可視化
plot_model_performance(test_results_df.iloc[:,2::], dataset_type="Test", save_path="test_metrics.pdf")

通過(guò)繪制柱狀圖直觀對(duì)比單一模型之間在訓(xùn)練集和測(cè)試集上的性能指標(biāo),在單一模型和Stacking模型相比,特別是測(cè)試集上的評(píng)價(jià)指標(biāo)如R^2、RMSE、MAE 和 MAPE,總體來(lái)看,Stacking 模型的性能普遍優(yōu)于單一模型,尤其在R^2和 RMSE等關(guān)鍵指標(biāo)上表現(xiàn)更優(yōu),顯示出更強(qiáng)的泛化能力。然而,也有個(gè)別單一模型(如XGBoost或LightGBM)在測(cè)試集上的表現(xiàn)接近 Stacking,但Stacking依然稍勝一籌。

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

上一篇:

使用LSTM模型預(yù)測(cè)多特征變量的時(shí)間序列

下一篇:

回歸預(yù)測(cè)模型訓(xùn)練集與測(cè)試集的進(jì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)