不同于分类决策树,回归决策树返回预测值
以CART决策树为例,ID3,C4.5的决策树是不能用于回归的,只能用于分类。
决策树回归的原理:
M S E = 1 m ∑ i = 1 n ( y i − y ^ i ) 2 MSE=\frac{1}{m}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2 MSE=m1∑i=1n(yi−y^i)2(mean square error)损失函数采用这个,通过不断计算每个分类下的相应分类结果后,实际值与预测值的相差平方的平均
最终结果树
参数细节
参数设置:
dtree2 = tree.DecisionTreeRegressor(max_depth=4,# 最大的挖掘深度
min_samples_leaf=200, # 最小叶子数目
min_samples_split=20 # 决策树划分前,父节点最小样本个数
)
对应上图的结果,mse为损失函数,samples为样本数,value为最后的预测值。
上述代码告诉计算机,当分层数达到4层,或者叶子中的样本数小于200,最小的父节点的样本分层前小于20,决策树都会停止生长,是前剪枝的过程。
参数调整对比
参数调整设置对比:
dtree2 = tree.DecisionTreeRegressor(max_depth=5,# 最大的挖掘深度
min_samples_leaf=400, # 最小叶子数目
min_samples_split=600 # 决策树划分前,父节点最小样本个数
)
叶子生长5层,停止的生长的叶子节点要根据min_samples_leaf,min_samples_split来决定,实际这两个效果是相同的,叶子节点数目和父节点的分裂样本数这个参数都可以应用于一个叶子。导致参数停止。
import toad
import pandas as pd
import numpy as np
import pydotplus
from IPython.display import Image
from sklearn.externals.six import StringIO
import os
from sklearn import tree
import pydot
pd.set_option('display.max_columns', None)
c = pd.read_csv(path)
anlysis = c[['ever0', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7']]
anlysis.columns = ['target', 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8']
dtree2 = tree.DecisionTreeRegressor(max_depth=5,# 最大的挖掘深度
min_samples_leaf=400, # 最小叶子数目
min_samples_split=600 # 决策树划分前,父节点最小样本个数
)
# 选定x和y变量
anlysisx = anlysis.drop('target', axis=1)
anlysisy = anlysis['target']
combiner2 = toad.transform.Combiner() # 分箱操作
combiner2.fit(anlysisx, anlysisy, method='chi', min_samples=0.05) # 设定方差,分箱中的数目占比
anlysisx_bin = combiner2.transform(anlysisx)
from toad.plot import bin_plot
bin_plot(anlysisxdf_bin,x='col1',target='target')
toad为厚本金融团队内部孵化的制作评分卡的一个金融包
dtree2 = dtree2.fit(anlysisx_bin, anlysisy)
#
anlysisxdf_bin = anlysisx_bin.copy()
anlysisxdf_bin['target'] = anlysisy
with open("./anlysisxdf.dot", 'w') as f:
tree.export_graphviz(dtree2, out_file=f)
dot_data2 = StringIO()
tree.export_graphviz(dtree2, out_file=dot_data2,
feature_names=anlysisx_bin.columns,
class_names=['target'],
filled=True, rounded=True,
special_characters=True)
graph2 = pydotplus.graph_from_dot_data(dot_data2.getvalue())
graph2 = graph2.create_png()
Image(graph2)
数据地址:数据集
提取码:zqme
注意点:提前安装Graphviz图形工具,并且调取pydot包进行图形修饰
CART决策树在GBDT(梯度提升迭代决策树)应用
CART决策树是GBDT的基本组成单元,
GBDT在做变量筛选时,每个特征j在单棵决策树的重要性
J
j
2
^
(
T
)
=
∑
t
=
1
L
−
1
i
t
2
^
1
(
v
t
=
j
)
\hat{J_j^2}(T)=\sum_{t=1}^{L-1}\hat{i_t^2}1(v_t=j)
Jj2^(T)=∑t=1L−1it2^1(vt=j)
其中L是单棵决策树每个分支的深度,即每个分支叶子结点的个数,L-1是非叶子几点的结点数,T的意思是决策树。
变量在M棵决策树的重要性,
J
j
2
^
=
1
M
∑
m
=
1
M
J
j
2
^
(
T
m
)
r
\hat{J_j^2}=\frac{1}{M}\sum_{m=1}^{M}\hat{J_j^2}(T_m)r
Jj2^=M1∑m=1MJj2^(Tm)r
T
m
T_m
Tm代表第
m
m
m棵树r代表调参系数