决策树算法讲解

决策树算法: 量化选股案例

来源:Stata与风险管理

作者:首都经济贸易大学\quad金融学院\quad田文涛

邮箱:tianwentao1999@163.com


什么是决策树

  • 如何做决策
    eg:是否学习[1]? 二食、三食or华侨? If-Then算法?
  • 决策树是仿树结构来进行决策的
是否学习的决策过程

解决什么问题

  • 分类问题
  1. 训练集、测试集(7:3、6:4)\rightarrowsklearn学习训练\rightarrow生成模型\leftarrow测试集验证
  2. 评估指标:
混淆矩阵 预测为正样本 预测为负样本
实际为正样本 True Positive (TP) False Negative (FN)
实际为负样本 False Positive (FP) True Negative (TN)

准确率(ACC)
Accuracy =\frac {TP+TN}{TP+TN+FP+FN}

精确度(PPV)
Precision = \frac{TP}{TP+FP}

召回率(TPR、Recall)
Recall = \frac{TP}{TP+FN}

特异度(TNR)
Specificity = \frac{TN}{TN+FP}


有关“树”的基本概念

  • 节点
    根节点
    内部节点
    叶节点
  • 深度
决策树节点图

如何构造“树”——三要素

  1. 属性构造
  • 离散变量
    二元属性
    多元属性
  • 连续变量
    序数属性

  1. 指标度量
  • 信息熵
    Ent(D)=-\sum_{i=1}^{k} p_{i} \log \left(p_{i}\right)

Ent(D)的值越小,代表该样本集D的纯度越高。

  • 信息增益
    {Ent}(D, a)= Ent(D)-\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} Ent\left(D^{v}\right)

说明

-- 假设属性aV个可能取值,用a对样本集进行划分,就会产生V个分支节点,D^v是第v个分支所包含的样本。从而计算出用属性a对样本集D进行划分所获得的信息增益。
-- 信息增益越大,用属性a对样本进行划分的纯度越高。
--选择信息增益最大的属性进行划分。


  • 基尼系数
    Gini=1-\sum_{i=1}^{k} p_{i}^{2}

基尼系数越小,纯度越高。

举例:
label=0:5个,label=1:5个\rightarrow p(0)=0.5,p(1)=0.5
label=0:2个,label=1:8个\rightarrow p(0)=0.2,p(1)=0.8
label=0:0个,label=1:10个\rightarrow p(0)=0,p(1)=1

G_1=1-[p(0)^2+p(1)^2]=0.5

G_2=1-[p(0)^2+p(1)^2]=0.32

G_3=1-[p(0)^2+p(1)^2]=0


  1. 模型生成
  • 在第一级节点,寻求某个特征,按照该特征的标准(熵或者基尼系数)进行分组,分组后得到的纯度最大
  • 完成第一级节点,在第二级节点上按照类似的思路找特征
  • 直到最后一个节点,分类完毕

算法实现

  1. 手动造轮子
  • 导入包
  • 数据清洗
    数据集划分
  • 函数定义
    信息熵、信息增益、基尼系数
  • 结果输出

  1. 调包侠
  • 核心算法:
from sklearn.tree import DecisionTreeClassifier
tree=DecisionTreeClassifier(max_depth=2,criterion='gini')
tree.fit(X,y)
print("准确度:",tree.score(X,y))
  • 相关参数:
    max_depth
    criterion
  • 具体实例(鸢尾花数据集)
from sklearn.datasets import load_iris,load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
import pydotplus
iris = load_iris( )
clf = DecisionTreeClassifier( )
clf_iris = clf.fit(iris.data,iris.target)
dot_Data = export_graphviz(clf_iris,out_file=None)
graph_iris = pydotplus.graph_from_dot_data(dot_Data)
graph_iris.write_pdf("./load_iris.pdf")
鸢尾花数据分类结果

量化案例:股票购买投资策略[2]

  1. 数据


    数据集

说明:标黄的为测试集,标红的为模型训练结果。


  1. 代码展示:
userpath('D:\4-Project\决策树模型\DecisionTree2Demo')%设置路径为存放CSV的位置

TrainInput=readtable('TrainInput.csv');%录入训练集的输入部分

TrainOutput=readtable('TrainOutput.csv');%录入训练集的输出部分

TestInput=readtable('TestInput.csv');%录入测试集的输入部分

TestOutput=readtable('TestOutput.csv');%录入测试集的输出部分

S=fitctree(TrainInput,TrainOutput,'MinParentSize',3);%建立模型,并存入S

view(S,'Mode','Graph')%绘制决策树

InvestStrategy=S.predict(TestInput);%使用刚才建立的模型预测股票涨跌,涨就是买,跌就是卖,因此构建了一个投资策略

ActualPriceChange=table2cell(TestOutput);%转化TestOutput的数据格式(table格式)并存入变量ActualPriceChange(cell格式)

confusionmat(ActualPriceChange,InvestStrategy)%计算拟合值和真实值的混淆矩阵
  1. 结果展示:


    决策结果
混淆矩阵 预测为正样本 预测为负样本
实际为正样本 3 0
实际为负样本 1 1

总结

  • 决策树定义
  • 决策树用途
  • 决策树构造
  • 决策树量化应用

决策树前沿发展

  • 经典决策树:CLS、ID3、C4.5和CART树(李强,2006)
  • 决策树组合:RF(随机森林)、ET(极端随机树)、GBDT(梯度提升决策树)、XGB和LGB(李想,2017)
  • 神经网络:神经支持决策树(Wan A, et al,2020)
    研究发现在保留决策树可解释性的同时取得了当前神经网络才能达到的准确率,比其他基于决策树的图像分类方法高出了大约14%。

总结

  • 决策树定义
  • 决策树用途
  • 决策树构造
  • 决策树量化应用
  • 决策树前沿发展

  1. https://www.jianshu.com/p/14a9e8d1f2a3

  2. 案例来源于CSDN

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容