前向分步算法与梯度提升决策树

  • Post author:
  • Post category:其他




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 版权协议,转载请附上原文出处链接和本声明。