1 前向分步算法
AdaBoost算法是前向分步加法算法的特例。这时,模型是由基本分类器组成的加法模型,损失函数是指数函数。
2 GBDT
梯度提升树(Grandient Boosting)是提升树(Boosting Tree)的一种改进算法,GBDT基于决策树中的回归树,核心原因是GBDT每轮的训练是在上一轮训练模型的负梯度值基础之上训练的。这就要求每轮迭代的时候,真实标签减去弱分类器的输出结果是有意义的,即残差是有意义的。
3代码实现
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)
# X_train_data = MinMaxScaler().fit_transform(X_train_data)
y_train_data = train_data[['利润总额']]
# 测试集数据 2547条
test_data = data.loc[data.index == split_date].copy()
X_test_data = test_data.drop(['利润总额'], axis=1)
# X_test_data = MinMaxScaler().fit_transform(X_test_data)
y_test_data = test_data[['利润总额']]
from sklearn import ensemble
for i in range(0, 10):
error = 0
params = {'n_estimators': 8, 'max_depth': 8, 'min_samples_split': 2,
'learning_rate': 0.005, 'loss': 'ls'}
gbr = ensemble.GradientBoostingRegressor(**params)
# 估计器拟合训练数据
gbr.fit(X_train_data, y_train_data)
# 训练完的估计器对测试数据进行预测
y_pred = gbr.predict(X_test_data)
error += np.abs(y_pred.sum() / y_test_data.sum() - 1)
print("相对误差率:", error/10)
版权声明:本文为qq_39538545原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。