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)