在大学的数学建模比赛中能明显提分的模型融合算法,本文介绍集成算法中的一种Stacking模型融合。通过PPT解释了Stacking回归算法进行模型融合的基本原理,并且结合mlxtend库中的源代码做出了基础解释。下方给出了示例代码可供直接调用
StackingRegressor源码解析:
StackingCVRegressor源码解析:
上述过程就是Stacking回归算法的基本原理,实际上的过程十分简单,但是可创造性很强,可以根据自己的需求对这种思想做创新。
知道了原理,mlxtend库给我们封装好了完整的Stacking回归的算法,接下来我们就给出一个交叉验证方式的示例代码:
import numpy as np
import pandas as pd
# 导入catboost
from catboost import CatBoostRegressor
# 随机森林库
from sklearn.ensemble import RandomForestRegressor
# 导入lightGBM
import lightgbm as lgb
# 引入stacking模型融合(cv)
from mlxtend.regressor import StackingCVRegressor
from sklearn.linear_model import LinearRegression
# 用于保存和提取模型
import joblib
import matplotlib.pyplot as plt
# 解决画图中文字体显示的问题
plt.rcParams['font.sans-serif'] = ['KaiTi', 'SimHei', 'Times New Roman'] # 汉字字体集
plt.rcParams['font.size'] = 12 # 字体大小
plt.rcParams['axes.unicode_minus'] = False
# 加载数据集并将其拆分为训练集和测试集
#读取数据
traindf=pd.read_csv('./train.csv',encoding='gbk')#这里的训练集包括目标特征
testdf=pd.read_csv('./test.csv',encoding='gbk')#测试集不包括
# 目标变量
y = traindf['Label']
del traindf['Label']
# 特征
X = traindf
# 读取模型
# 基模型1
LGBMR_BEST_PARAMS = lgb.LGBMRegressor(bagging_fraction=0.8,
bagging_freq=1,
feature_fraction=0.9000000000000001,
lambda_l1=0,
lambda_l2=15,
learning_rate=0.29352291475392334,
max_bin=205,
max_depth=10,
min_data_in_leaf=98,
min_gain_to_split=0.003127047743666289,
n_estimators=645,
num_leaves=70)
# 基模型2
cat_params= {'iterations': 992,
'learning_rate': 0.2462181777526843,
'depth': 11,
'l2_leaf_reg': 0.006126980082076129,
'rsm': 0.42416637312752437,
'border_count': 173,
'leaf_estimation_method': 'Simple',
'boosting_type': 'Ordered',
'bootstrap_type': 'MVS',
'sampling_unit': 'Object'}
CATBOOST_BEST_PARAMS = CatBoostRegressor(**cat_params)
# 基模型3
RF = RandomForestRegressor()
# 元回归器, 这个可以理解为第二层的那个模型,即将前面回归器结果合起来的那个回归器,这里我使用lr,因为第二层的模型不要太复杂
lr=LinearRegression()
# 基模型列表
regressorModels = [ LGBMR_BEST_PARAMS,CATBOOST_BEST_PARAMS, RF]
# 使用stackingCV融合
STACKING=StackingCVRegressor(regressors=regressorModels,meta_regressor=lr,cv = 5,shuffle = True,use_features_in_secondary = False,n_jobs=-1)
# 模型训练
# 注意模型的训练需要使用完整的训练集
STACKING.fit(X,y)
# # 保存模型
# joblib.dump(STACKING, './STACKING.pkl')
# # 读取模型
# STACKING = joblib.load('./STACKING.pkl')
# 模型预测
# 用模型对测试集预测
y_pred = STACKING.predict(testdf)
# # 预测结果进行逆log运行
# y_pred=np.expm1(y_pred)
# 读取真实集---shape=(n,1)
label=pd.read_csv('./true.csv',encoding='gbk')
# 模型评估
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# 计算均方误差(MSE)
mse = mean_squared_error(label, y_pred)
print("均方误差(MSE):", mse)
# 计算均方根误差(RMSE)
rmse = np.sqrt(mse)
print("均方根误差(RMSE):", rmse)
# 计算平均绝对误差(MAE)
mae = mean_absolute_error(label, y_pred)
print("平均绝对误差(MAE):", mae)
# 计算决定系数(R²)
r2 = r2_score(label, y_pred)
print("决定系数(R²):", r2)
在这个示例需要根据实际情况修改某些路径和特征名称。
个人拙见,有错误可留言我修改,需要原PPT的可以点击方链接:
PPT:https://pan.baidu.com/s/13fC8epQdK0wMFvydutDUDw 提取码:xbjt