XGBoost Regressor --- 论文实战

一、前言

       在《机器学习论文复现实战---linear regression》中通过Pearson 相关性分析,去除了2个高相关性特征 "PN" 和 "AN" ,数据维度变为890*25(数据集地址

       这里我们不做任何前期处理,直接就将数据放入 XGBRegressor 模型中进行训练了。

二、模型训练过程

2.1  导入Python库

'''====================导入Python库===================='''
import pandas as pd               #python科学计算库
import numpy as np                #Python的一个开源数据分析处理库。
import matplotlib.pyplot as plt   #常用Python画图工具
from xgboost import XGBRegressor  # 导入 XGBRegressor 模型
from sklearn.model_selection import train_test_split # 数据划分模块
from sklearn.preprocessing import StandardScaler   # 标准化模块
from sklearn.metrics import mean_squared_error, r2_score   #误差函数MSE,误差函数R^2,
from sklearn.model_selection import GridSearchCV     #超参数网格搜索

 2.2  导入数据 

'''========================导入数据========================'''
data = pd.read_excel('D:/复现/trainset_loop6.xlsx')  #读取xlsx格式数据
# date = pd.read_csv('D:/复现/trainset_loop6.csv')   #读取csv格式数据
print(data.isnull().sum())   #检查数据中是否存在缺失值
print(data.shape)   #检查维度
print(data.columns) #数据的标签
data = data.drop(["PN","AN"], axis = 1) #axis = 1表示对列进行处理,0表示对行
Y, X = data['Eads'] , data.drop(['Eads'] , axis = 1) #对Y、X分别赋值

 2.3  标准化

'''=========================标准化========================'''
#利用StandardScaler函数对X进行标准化处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
'''====================划分训练集与测试集==================='''
X_train,X_test,y_train,y_test = train_test_split(X , Y , test_size=0.2 , random_state=42)

 2.4  模型训练

'''=======================模型训练========================'''
#模型训练
model = XGBRegressor()   # 模型实例化。
'''========================超参数========================='''

# booster: 默认值为 ‘gbtree’,基于树模型。 ‘gblinear’ 基于线性模型。
# silent: 默认为0;当这个参数值为1时,静默模式开启,不会输出任何信息。
# nthread:默认值为最大可能的线程数。
# eta: 权重递减参数,典型值为0.01-0.2。
# min_child_weight:决定最小叶子节点样本权重和。
# max_depth:这个值为树的最大深度。
# max_leaf_nodes:树上最大的节点或叶子的数量。
# gamma:Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。
# max_delta_step:每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。
# reg_alpha:权重的L1正则化项。 可以应用在很高维度的情况下,使得算法的速度更快。默认为1。
# reg_lambda:权重的L2正则化项。默认为1。
# colsample_bytree:  # 对特征随机采样的比例;如本文有25个特征,colsample_bytree=0.8,则为25*0.8=20。
# objective: 'reg:linear'线性回归,'reg:logistic'逻辑回归,'binary:logistic'二分类问题,'multi:softmax'多分类,用num_class指定类别数
# eval_metric: 评估指标,‘rmse’回归;‘mlogloss’多分类;‘error’二分类;‘auc’二分类任务。

# 定义超参数网格。
n_estimators = [50,100,150]
max_depth = [2,3,4]
reg_alpha = [0.1,0.5,1.0]
reg_lambda = [0.1,0.5,1.0]

# min_samples_leaf = [1,3,5,7,9,11]  #有点费时间就没加这个超参数,想加的可以加,(不加可能会有点过拟合)。
# learning_rate = [0.1,0.5,1]  # 每棵树对最终预测的贡献,大的 learning_rate 能加快收敛速度,默认为0.1。
# 网格搜索,cv = 5 表示进行5折交叉验证
grid_search = GridSearchCV(estimator = model,cv = 5, param_grid={'max_depth': max_depth,"n_estimators":n_estimators,"reg_alpha":reg_alpha,"reg_lambda":reg_lambda}, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)
# 最佳模型
best_model = grid_search.best_estimator_
# 最佳超参数
best_max_depth = grid_search.best_params_['max_depth']
# best_min_samples_leaf = grid_search.best_params_['min_samples_leaf']
best_n_estimators = grid_search.best_params_['n_estimators']
best_reg_alpha = grid_search.best_params_['reg_alpha']
best_reg_lambda = grid_search.best_params_['reg_lambda']
print(f'Best max_depth:{best_max_depth:.3f}',"\n",f'Best n_estimators:{best_n_estimators:.3f}',  # ,"\n",用于换行
      "\n",f'Best reg_alpha:{best_reg_alpha:.3f}',"\n",f'Best reg_lambda:{best_reg_lambda:.3f}')

通过 GridSearchCV 搜索最优的 Best alpha:(由于XGBoost是并行计算速度较快,超参数搜索比较方便,省时间)

Best max_depth:3.000 
Best n_estimators:100.000 
Best reg_alpha:0.500 
Best reg_lambda:0.500

2.5  模型预测与评估

'''=======================模型预测========================'''
# best_model模型预测
y_pred_train = best_model.predict(X_train)
y_pred_test = best_model.predict(X_test)
#评估
mse_train=mean_squared_error(y_train,y_pred_train)  #均方误差越小模型越好
mse_test=mean_squared_error(y_test,y_pred_test)     #R2 表示模型对因变量的解释能力,取值范围从 0 ~ 1,越接近 1 表示模型对数据的拟合程度越好。
r2_train=r2_score(y_train,y_pred_train)
r2_test=r2_score(y_test,y_pred_test)
print(f'MSE(Train):{mse_train:.3f}')  #保留2位小数
print(f'MSE(Test):{mse_test:.3f}')
print(f'R^2(Train):{r2_train:.3f}')
print(f'R^2(Test):{r2_test:.3f}')

MSE 与R^{2}结果:

MSE(Train):0.015
MSE(Test):0.046
R^2(Train):0.928
R^2(Test):0.750    #稍微过拟合

 2.6  可视化

'''======================结果可视化======================='''
plt.figure(figsize=(8,8))
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
colors = ['b', 'r']  # 设置颜色
markers = ["*","o"]  # 设置点的形状
Y_train_picture = [y_train,y_test]          #可视化图的x轴数据
Y_pred_picture = [y_pred_train,y_pred_test] #可视化图的y轴数据
for i in range(0,2):
    plt.scatter(Y_train_picture[i],
                Y_pred_picture[i],
                s = 20,  # 表示点的大小
                c = colors[i],  # 颜色
                marker = markers[i],  # 点的形状
                edgecolors='b',  # 散点边框颜色
                alpha=0.6)  # 透明度
plt.plot([-1.0,1.0],[-1.0,1.0],'r--')  #可视化图数据范围
plt.xlabel('Actual')     #x轴标签
plt.ylabel('Predicted')  #y轴标签
plt.legend(['train', 'test'], loc='upper right',frameon=False) #图例,位置位于右上方,去掉图例边框
plt.title('Actual vs Predicted',fontsize=15, c='r')
# 将图保存为*.jpg图
plt.savefig('./XGBT_可视化.jpg',dpi = 1200) #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()

 此图表示,数据点越靠近中间红线模型越好。 

 三、代码全部注释 

'''====================导入Python库===================='''
import pandas as pd               #python科学计算库
import numpy as np                #Python的一个开源数据分析处理库。
import matplotlib.pyplot as plt   #常用Python画图工具
from xgboost import XGBRegressor  # 导入 XGBRegressor 模型
from sklearn.model_selection import train_test_split # 数据划分模块
from sklearn.preprocessing import StandardScaler   # 标准化模块
from sklearn.metrics import mean_squared_error, r2_score   #误差函数MSE,误差函数R^2,
from sklearn.model_selection import GridSearchCV     #超参数网格搜索

'''========================导入数据========================'''
data = pd.read_excel('D:/复现/trainset_loop6.xlsx')  #读取xlsx格式数据
# date = pd.read_csv('D:/复现/trainset_loop6.csv')   #读取csv格式数据
print(data.isnull().sum())   #检查数据中是否存在缺失值
print(data.shape)   #检查维度
print(data.columns) #数据的标签
data = data.drop(["PN","AN"], axis = 1) #axis = 1表示对列进行处理,0表示对行
Y, X = data['Eads'] , data.drop(['Eads'] , axis = 1) #对Y、X分别赋值


'''=========================标准化========================'''
#利用StandardScaler函数对X进行标准化处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
'''====================划分训练集与测试集==================='''
X_train,X_test,y_train,y_test = train_test_split(X , Y , test_size=0.2 , random_state=42)



'''=======================模型训练========================'''
#模型训练
model = XGBRegressor()   # 模型实例化。
'''========================超参数========================='''

# booster: 默认值为 ‘gbtree’,基于树模型。 ‘gblinear’ 基于线性模型。
# silent: 默认为0;当这个参数值为1时,静默模式开启,不会输出任何信息。
# nthread:默认值为最大可能的线程数。
# eta: 权重递减参数,典型值为0.01-0.2。
# min_child_weight:决定最小叶子节点样本权重和。
# max_depth:这个值为树的最大深度。
# max_leaf_nodes:树上最大的节点或叶子的数量。
# gamma:Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。
# max_delta_step:每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。
# reg_alpha:权重的L1正则化项。 可以应用在很高维度的情况下,使得算法的速度更快。默认为1。
# reg_lambda:权重的L2正则化项。默认为1。
# colsample_bytree:  # 对特征随机采样的比例;如本文有25个特征,colsample_bytree=0.8,则为25*0.8=20。
# objective: 'reg:linear'线性回归,'reg:logistic'逻辑回归,'binary:logistic'二分类问题,'multi:softmax'多分类,用num_class指定类别数
# eval_metric: 评估指标,‘rmse’回归;‘mlogloss’多分类;‘error’二分类;‘auc’二分类任务。

# 定义超参数网格。
n_estimators = [50,100,150]
max_depth = [2,3,4]
reg_alpha = [0.1,0.5,1.0]
reg_lambda = [0.1,0.5,1.0]

# min_samples_leaf = [1,3,5,7,9,11]  #有点费时间就没加这个超参数,想加的可以加,(不加可能会有点过拟合)。
# learning_rate = [0.1,0.5,1]  # 每棵树对最终预测的贡献,大的 learning_rate 能加快收敛速度,默认为0.1。
# 网格搜索,cv = 5 表示进行5折交叉验证
grid_search = GridSearchCV(estimator = model,cv = 5, param_grid={'max_depth': max_depth,"n_estimators":n_estimators,"reg_alpha":reg_alpha,"reg_lambda":reg_lambda}, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)
# 最佳模型
best_model = grid_search.best_estimator_
# 最佳超参数
best_max_depth = grid_search.best_params_['max_depth']
# best_min_samples_leaf = grid_search.best_params_['min_samples_leaf']
best_n_estimators = grid_search.best_params_['n_estimators']
best_reg_alpha = grid_search.best_params_['reg_alpha']
best_reg_lambda = grid_search.best_params_['reg_lambda']
print(f'Best max_depth:{best_max_depth:.3f}',"\n",f'Best n_estimators:{best_n_estimators:.3f}',  # ,"\n",用于换行
      "\n",f'Best reg_alpha:{best_reg_alpha:.3f}',"\n",f'Best reg_lambda:{best_reg_lambda:.3f}')

'''=======================模型预测========================'''
# best_model模型预测
y_pred_train = best_model.predict(X_train)
y_pred_test = best_model.predict(X_test)
#评估
mse_train=mean_squared_error(y_train,y_pred_train)  #均方误差越小模型越好
mse_test=mean_squared_error(y_test,y_pred_test)     #R2 表示模型对因变量的解释能力,取值范围从 0 ~ 1,越接近 1 表示模型对数据的拟合程度越好。
r2_train=r2_score(y_train,y_pred_train)
r2_test=r2_score(y_test,y_pred_test)
print(f'MSE(Train):{mse_train:.3f}')  #保留2位小数
print(f'MSE(Test):{mse_test:.3f}')
print(f'R^2(Train):{r2_train:.3f}')
print(f'R^2(Test):{r2_test:.3f}')


'''======================结果可视化======================='''
plt.figure(figsize=(8,8))
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
colors = ['b', 'r']  # 设置颜色
markers = ["*","o"]  # 设置点的形状
Y_train_picture = [y_train,y_test]          #可视化图的x轴数据
Y_pred_picture = [y_pred_train,y_pred_test] #可视化图的y轴数据
for i in range(0,2):
    plt.scatter(Y_train_picture[i],
                Y_pred_picture[i],
                s = 20,  # 表示点的大小
                c = colors[i],  # 颜色
                marker = markers[i],  # 点的形状
                edgecolors='b',  # 散点边框颜色
                alpha=0.6)  # 透明度
plt.plot([-1.0,1.0],[-1.0,1.0],'r--')  #可视化图数据范围
plt.xlabel('Actual')     #x轴标签
plt.ylabel('Predicted')  #y轴标签
plt.legend(['train', 'test'], loc='upper right',frameon=False) #图例,位置位于右上方,去掉图例边框
plt.title('Actual vs Predicted',fontsize=15, c='r')
# 将图保存为*.jpg图
plt.savefig('./XGBT_可视化.jpg',dpi = 1200) #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()

其中,有几个点,需要大家注意下~

  • 优点:计算效率高(支持并行和分布式);加入正则化防止过拟合;支持自动处理缺失值;灵活性高,适合多种任务。

  • 缺点:模型参数较多,调参复杂;占用内存较大,特别是在处理超大规模数据集时。

  持续更新中。。。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码贾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值