Python机器学习18——Xgboost和Lightgbm结合分位数回归(机器学习与传统统计学结合)_xgboost做分位数回归

plt.title(‘ R 2 R^2 R2 across different quantiles’)
plt.tight_layout()
plt.show()


![](https://img-blog.csdnimg.cn/0df54f417b1f4d99875de56bde1840a4.png)


可以看到在分位点为0.5附件,模型的误差都比较小。因为这个数据集没有很多的异常值。然后模型表现上,LGBM>XGB>线性QR。线性模型对于一个非线性的函数关系拟合在这里当然不行。


画出拟合图:  
  



name=[‘QR’,‘XGB-QR’,‘LGB-QR’]
plt.figure(figsize=(7, 6),dpi=128)
for k,model in enumerate([qr_pred,xgb_pred,lgb_pred]):
n=int(str(‘31’)+str(k+1))
plt.subplot(n)
plt.scatter(X_test,y_test,c=‘k’,s=2)
for i,alpha in enumerate([0.1,0.5,0.9]):
sort_order = np.argsort(X_test, axis=0).ravel()
X_test_sorted = np.array(X_test)[sort_order]
#print(np.array(model[alpha]))
predictions_sorted = np.array(model[alpha])[sort_order]
plt.plot(X_test_sorted,predictions_sorted,label=fr" τ \tau τ={alpha}",lw=0.8)
plt.legend()
plt.title(f’{name[k]}')
plt.tight_layout()
plt.show()


![](https://img-blog.csdnimg.cn/793d388430f1427eb1da1e23dae56c3c.png)


可以看到分位数回归的明显的区间特点。


还有非参数非线性方法的优势,明显XGB和LGBM拟合得更好。




---


#### 波士顿数据集


上面是人工数据,下面采用真实的数据集进行对比,就用回归最常用的波士顿房价数据集吧:



data_url = “http://lib.stat.cmu.edu/datasets/boston”
raw_df = pd.read_csv(data_url, sep=“\s+”, skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]
column_names = [‘CRIM’,‘ZN’,‘INDUS’,‘CHAS’,‘NOX’,‘RM’,‘AGE’,‘DIS’,‘RAD’,‘TAX’,‘PTRATIO’, ‘B’,‘LSTAT’, ‘MEDV’]
boston=pd.DataFrame(np.hstack([data,target.reshape(-1,1)]),columns= column_names)


取出X和y,划分测试集和训练集



X = boston.iloc[:,:-1]
y = boston.iloc[:,-1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)


拟合预测,对比



alphas = np.arange(0.1, 1, 0.1)
mse_qr, mse_xgb, mse_lgb = [], [], []
r2_qr, r2_xgb, r2_lgb = [], [], []
qr_pred,xgb_pred,lgb_pred={},{},{}

Train and evaluate

for alpha in alphas:
# Quantile Regression
model_qr = QuantReg(y_train, sm.add_constant(X_train)).fit(q=alpha)
model_pred=model_qr.predict(sm.add_constant(X_test))
mse_qr.append(mean_squared_error(y_test,model_pred ))
r2_qr.append(r2_score(y_test,model_pred))

# XGBoost
model_xgb = xgb.train({"objective": "reg:quantileerror", 'quantile_alpha': alpha}, 
                      xgb.QuantileDMatrix(X_train, y_train), num_boost_round=100)
model_pred=model_xgb.predict(xgb.DMatrix(X_test))
mse_xgb.append(mean_squared_error(y_test,model_pred ))
r2_xgb.append(r2_score(y_test,model_pred))

# LightGBM
model_lgb = lgb.train({'objective': 'quantile', 'alpha': alpha,'force_col_wise': True,}, 
                      lgb.Dataset(X_train, y_train), num_boost_round=100)

model_pred=model_lgb.predict(X_test)
mse_lgb.append(mean_squared_error(y_test,model_pred))
r2_lgb.append(r2_score(y_test,model_pred))

if alpha in [0.1,0.5,0.9]:
    qr_pred[alpha]=model_qr.predict(sm.add_constant(X_test))
    xgb_pred[alpha]=model_xgb.predict(xgb.DMatrix(X_test))
    lgb_pred[alpha]=model_lgb.predict(X_test)

画图查看不同分位点的不同模型的误差和拟合优度:



plt.figure(figsize=(8, 5),dpi=128)
plt.subplot(211)
plt.plot(alphas, mse_qr, label=‘Quantile Regression’)
plt.plot(alphas, mse_xgb, label=‘XGBoost’)
plt.plot(alphas, mse_lgb, label=‘LightGBM’)
plt.legend()
plt.xlabel(‘Quantile’)
plt.ylabel(‘MSE’)
plt.title(‘MSE across different quantiles’)

plt.subplot(212)
plt.plot(alphas, r2_qr, label=‘Quantile Regression’)
plt.plot(alphas, r2_xgb, label=‘XGBoost’)
plt.plot(alphas, r2_lgb, label=‘LightGBM’)
plt.legend()
plt.xlabel(‘Quantile’)
plt.ylabel(‘ R 2 R^2 R2’)
plt.title(‘ R 2 R^2 R2 across different quantiles’)
plt.tight_layout()
plt.show()


![](https://img-blog.csdnimg.cn/ae2bddc0b8134f229c1f665b3491f1a1.png)


可以看到在分位点为0.6附件三个模型表现效果都比较好,然后模型表现来看,XGB>LGBM>QR,还是两个机器学习模型更厉害。




---


#### 分位数损失函数和平方和损失函数对比


上面我们得到在分位点为0.6的时候,模型效果表现好,那么分位数模型和普通的MSE损失函数的效果比起来怎么样呢?我们继续对比:



定义alpha值

alpha = 0.5

分位数回归模型

model_qr = sm.regression.quantile_regression.QuantReg(y_train, sm.add_constant(X_train)).fit(q=alpha)
qr_pred = model_qr.predict(sm.add_constant(X_test))

XGBoost分位数回归

model_xgb = xgb.train({“objective”: “reg:quantileerror”, ‘quantile_alpha’: alpha},
xgb.DMatrix(X_train, label=y_train), num_boost_round=100)
xgb_q_pred = model_xgb.predict(xgb.DMatrix(X_test))

LightGBM分位数回归

model_lgb = lgb.train({‘objective’: ‘quantile’, ‘alpha’: alpha,‘force_col_wise’: True},
lgb.Dataset(X_train, label=y_train), num_boost_round=100)
lgb_q_pred = model_lgb.predict(X_test)

普通的最小二乘法线性回归

model_lr = LinearRegression()
model_lr.fit(X_train, y_train)
lr_pred = model_lr.predict(X_test)

普通的XGBoost

model_xgb_reg = xgb.train({“objective”: “reg:squarederror”}, xgb.DMatrix(X_train, label=y_train), num_boost_round=100)
xgb_pred = model_xgb_reg.predict(xgb.DMatrix(X_test))

普通的LightGBM

model_lgb_reg = lgb.train({‘objective’: ‘regression’, ‘force_col_wise’: True}, lgb.Dataset(X_train, label=y_train), num_boost_round=100)
lgb_pred = model_lgb_reg.predict(X_test)


上面是六个模型,非别是基于分位数回归的XGB,LGBM,线性分位数回归。还有三个基于最普通的MSE损失函数的普通XGB,LGBM和最小二乘线性回归。


# 计算6个模型的MSE和R^2 



models = [‘QR’, ‘XGB Quantile’, ‘LightGBM Quantile’, ‘Linear Reg’, ‘XGBoost’, ‘LightGBM’]
preds = [qr_pred, xgb_q_pred, lgb_q_pred, lr_pred, xgb_pred, lgb_pred]
mse_scores = [mean_squared_error(y_test, pred) for pred in preds]
r2_scores = [r2_score(y_test, pred) for pred in preds]


 画柱状图查看:



colors = sns.color_palette(“muted”, len(models))
fig, axs = plt.subplots(2, 1, figsize=(9,7))
axs[0].bar(models, mse_scores, color=colors)
axs[0].set_title(‘MSE Comparison’)
axs[0].set_ylabel(‘MSE’)
axs[1].bar(models, r2_scores, color=colors)
axs[1].set_title(r’ R 2 R^{2} R2 Comparison’)
axs[1].set_ylabel(r’ R 2 R^{2} R2')
plt.tight_layout()
plt.show()


![](https://img-blog.csdnimg.cn/6dbb4455147649cba8975650f9ff56ec.png)


可以看到模型效果来看,XGboost由于Lightgbm优于线性模型。但是分位数回归效果没有MSE损失好,说明在这个数据集表现上,就采用最经典的MSE损失的普通的模型效果会更好。。。


确实是这样的,很多学术创新和改进都不一定比最经典和最常见的方法的效果好。


如果是那种异常值很多的数据,具有异方差的数据 ,可能损失函数改用分位数的会更好。



### 一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。



![](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)



### 二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。



![](https://img-blog.csdnimg.cn/img_convert/8c4513c1a906b72cbf93031e6781512b.png)



### 三、入门学习视频



我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。



![](https://img-blog.csdnimg.cn/afc935d834c5452090670f48eda180e0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP5aqb56eD56eD,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值