XGBoost算法分析与案例调参实例

本文介绍了XGBoost的基本原理,它是一个优化的分布式梯度增强库,广泛应用于机器学习竞赛。内容包括XGBoost与GBDT的关系、其优化特性以及在数据科学中的应用。此外,还展示了使用Python实现XGBoost进行回归预测的代码示例,涉及数据预处理、模型训练和评估。

1 XGBoost原理

XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中并取得了不错的成绩。XGBoost本质上还是一个GBDT,但是力争把速度和效率发挥到极致,所以叫X(Extreme) GBoosted,包括前面说过,两者都是boosting方法。XGBoost是一个优化的分布式梯度增强库,旨在实现高效,灵活和便携。它在Gradient Boosting框架下实现机器学习算法。 XGBoost提供了并行树提升(也称为GBDT,GBM),可以快速准确地解决许多数据科学问题。 相同的代码在主要的分布式环境(Hadoop,SGE,MPI)上运行,并且可以解决超过数十亿个样例的问题。XGBoost利用了核外计算并且能够使数据科学家在一个主机上处理数亿的样本数据。最终,将这些技术进行结合来做一个端到端的系统以最少的集群系统来扩展到更大的数据集上。Xgboost以CART决策树为子模型,通过Gradient Tree Boosting实现多棵CART树的集成学习,得到最终模型。

2 XGBoost代码实现

import pandas as pd
import matplotlib.pyplot as plt
import xgboost as xgb
import numpy as np
from xgboost import plot_importance

data = pd.read_excel('./final_data_all.xlsx', index_col=u'年份')

# 对行业这一特征使用LabelEncoder编码
from sklearn.preprocessing import LabelEncoder
X_industy = data[['行业']]
le = LabelEncoder()
le = le.fit(X_industy)
label = le.transform(X_industy)
data[['行业']] = label


data = data[['利润总额_3', '利润总额_2', '利润总额_1', '销售净利率_3', '归属母公司股东的权益/负债合计_2', '销售净利率_2', '价值变动净收益/利润总额_1',
             '扣除非经常损益后的净利润/净利润_3', '销售净利率_1', '价值变动净收益/利润总额_3', '总资产周转率_1', '总资产周转率_2', '权益乘数_3',
             '价值变动净收益/利润总额_2', '总资产收益率ROA_3', '产权比率_2', '归属母公司股东的权益/负债合计_3', '经营活动净利润/利润总额_3', '资产负债率_1',
             '营业外收支净额/利润总额_3', '扣除非经常损益后的净利润/净利润_1', '资产负债率_3', '净资产收益率ROE_2', '营业外收支净额/利润总额_2', '总资产收益率ROA_2',
             '经营活动净利润/利润总额_2', '总资产周转率_3', '经营活动净利润/利润总额_1', '资产负债率_2', '权益乘数_2', '总资产收益率ROA_1', '经营活动产生的现金流量净额/负债合计_1',
             '扣除非经常损益后的净利润/净利润_2', '净资产收益率ROE_3', '行业', '净资产收益率ROE_1', '经营活动产生的现金流量净额/负债合计_2', '营业外收支净额/利润总额_1', '产权比率_3',
             '非流动负债/负债合计_1', '非流动资产/总资产_1', '应收账款周转率_3', '产权比率_1', '流动资产周转率_1', '经营活动产生的现金流量净额/负债合计_3', '应收账款周转率_1', '流动比率_2',
             '非流动资产/总资产_3', '固定资产周转率_2', '流动资产周转率_3', '流动比率_3', '销售毛利率_3', '息税摊销前利润/负债合计_3', '非流动负债/负债合计_3', '销售毛利率_2', '固定资产周转率_1',
             '已获利息倍数_3', '归属母公司股东的权益/负债合计_1', '流动负债/负债合计_1', '流动资产/总资产_1', '利润总额']]

data['利润总额'] = (data['利润总额']-data['利润总额'].mean())/(data['利润总额'].std())

from sklearn.preprocessing import MinMaxScaler
# 测试集与训练集的划分2014-2018年为训练集 2019年数据为训练集
split_date = 2016
# 训练集数据 12735条
# !!!注一个重要的点,最大最小化之后有明显变化
train_data = data.loc[data.index < split_date].copy()
X_train_data = train_data.drop(['利润总额'], axis=1)
y_train_data = train_data[['利润总额']]
print(X_train_data.shape)

# 测试集数据 2547条
test_data = data.loc[data.index == split_date].copy()
X_test_data = test_data.drop(['利润总额'], axis=1)
y_test_data = test_data[['利润总额']]
print(X_test_data.shape)


for i in range(0, 10):
    averge_err = 0
    # xgboost模型
    xgb_reg = xgb.XGBRegressor()
    xgb_reg.fit(X_train_data, y_train_data)
    y_pred = xgb_reg.predict(X_test_data)
    averge_err += abs(y_pred.sum() / y_test_data.sum() - 1)


print("相对误差: ", averge_err/10)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值