决策树是基于树结构来对实例进行决策的一种基本的分类和回归的机器学习方法。决策树由结点和有向边组成,结点分为内部结点(表示一个特征的划分)和叶子结点(表示一个类别或输出)。
决策树学习,训练数据集
𝐷
=
(
𝐱
1
,
𝑦
1
)
,
(
𝐱
2
,
𝑦
2
)
,
⋯
,
(
𝐱
𝑖
,
𝑦
𝑖
)
,
⋯
,
(
𝐱
𝑁
,
𝑦
𝑁
)
𝐷 = {(𝐱1, 𝑦1) , (𝐱2, 𝑦2) , ⋯ , (𝐱𝑖, 𝑦𝑖) , ⋯ , (𝐱𝑁, 𝑦𝑁)}
D=(x1,y1),(x2,y2),⋯,(xi,yi),⋯,(xN,yN)
其中,
x
i
xi
xi为第 个特征向量(实例),
𝐱
𝑖
=
(
𝑥
(
𝑖
1
)
,
𝑥
(
𝑖
2
)
,
…
,
𝑥
(
𝑖
𝑗
)
,
…
,
𝑥
(
𝑖
𝑛
)
)
𝑇
𝐱𝑖 = (𝑥( 𝑖1), 𝑥( 𝑖2), … , 𝑥( 𝑖𝑗), … , 𝑥( 𝑖𝑛))^𝑇
xi=(x(i1),x(i2),…,x(ij),…,x(in))T ,
y
i
yi
yi为
x
i
xi
xi的类别标记,
𝑦
𝑖
∈
1
,
2
,
⋯
,
𝐾
𝑦𝑖 ∈ {1, 2, ⋯ , 𝐾}
yi∈1,2,⋯,K。
学习的⽬标数是根据给定的训练数据集构建⼀个决策树模型,使得可对实例进⾏正确的分类或回归。
决策树学习包括3个步骤:特征选择、决策树⽣成、决策树修剪。
特征选择在于选取对于训练数据具有分类能力的特征。
熵表示随机变量不确定性的度量。(更详细的概念理解,查阅信息论、通信原理基础。)
设
X
X
X是一个取有限个值的离散随机变量,其概率分布为
P
(
X
=
x
i
)
=
p
i
,
i
=
1
,
2
,
,
.
.
.
,
n
P(X=xi)=pi,i=1,2,,...,n
P(X=xi)=pi,i=1,2,,...,n
则随机变量
X
X
X的熵
H
(
X
)
=
H
(
p
)
=
−
∑
p
i
l
o
g
𝑝
𝑖
H(X)=H(p)= − ∑pi log 𝑝𝑖
H(X)=H(p)=−∑pilogpi
H
(
p
)
H(p)
H(p)的取值范围:
0
<
H
(
p
)
<
l
o
g
n
0<H(p)<log n
0<H(p)<logn,当
p
=
0.5
p=0.5
p=0.5时,取得最大值。
信息增益算法如下图所示:
以信息增益为特征选择标准偏向取值较多的特征。当特征的取值较多时,根据此特征划分更容易得到纯度更高的子集,因此划分之后的熵更低。由于划分前的熵是一定的,因此信息增益更大。
ID3算法:
输入:训练数据集
D
D
D,特征集合
A
A
A,阈值
ϵ
\epsilon
ϵ
输出:决策树
T
T
T
C4.5算法:
输入:训练数据集
D
D
D,特征集合
A
A
A,阈值
ϵ
\epsilon
ϵ
输出:决策树
T
T
T
决策树的剪枝通过极小化决策树的整体损失函数或代价函数来实现。
设树
T
T
T的叶结点个数为|
T
T
T|,
t
t
t是树
T
T
T的叶节点,该叶结点有
N
t
N_t
Nt个,
k
=
1
,
2
,
.
.
.
,
K
k=1,2,...,K
k=1,2,...,K,
H
t
(
T
)
H_t(T)
Ht(T)为叶节点
t
t
t上的经验熵,则决策树的损失函数:
其中,
C
(
T
)
C(T)
C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,
∣
T
∣
|T|
∣T∣表示模型复杂度,参数
α
>
=
0
α>=0
α>=0控制两者之间的影响。
树的剪枝算法:
输入:决策树
T
T
T,参数
α
α
α
输出:修建后的子树
T
α
T_α
Tα
对整体树
T
0
T_0
T0任意内部结点
t
t
t,以
t
t
t为单结点树的损失函数
C
α
(
t
)
=
C
(
t
)
+
α
C_α(t) = C(t)+α
Cα(t)=C(t)+α
以
t
t
t为根结点的子树
T
t
T_t
Tt的损失函数
C
α
(
T
t
)
=
C
(
T
t
)
+
α
∣
T
t
∣
C_α(T_t) = C(T_t)+α|T_t|
Cα(Tt)=C(Tt)+α∣Tt∣
from sklearn.tree import DecisionTreeClassifier
DecisionTreeClassifier(criterion='gini',splitter='best',max_depth=None,
min_samples_split=2,min_samples_leaf=1,
min_weight_fraction_leaf=0.0,max_features=None,
random_state=None,max_leaf_nodes=None,
min_impurity_decrease=0.0,min_impurity_split=1e-07,
class_weight=None, presort=False)***
参数:
属性:
from sklearn.tree import DecisionTreeRegressor
DecisionTreeRegressor(criterion='mse',splitter='best',max_depth=None,min_samples
_split=2,min_samples_leaf=1,min_weight_fraction_leaf=0.0,max_features=None,rando
m_state=None,max_leaf_nodes=None,min_impurity_split=1e-07,presort=False)
参数:
属性:
方法:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
import graphviz
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
def creat_data():
iris = load_iris()
df = pd.DataFrame(iris.data,columns=iris.feature_names)
df['label'] = iris.target
df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
data = np.array(df.iloc[:100,[0,1,-1]])
return data[:,:2],data[:,-1]
X,y = creat_data()
X_train,X_test ,y_train,y_test = train_test_split(X,y)
clf = DecisionTreeClassifier()
clf.fit(X_train,y_train)
print(clf.score(X_test,y_test))
print(clf.feature_importances_) #k查看特征重要性程度
#其他属性均可查看
tree_pic = export_graphviz(clf,out_file='Tree.pdf')
with open("Tree.pdf") as f:
dot_graph = f.read()
graphviz.Source(dot_graph)
画出下图需要使用graphviz。安装比较麻烦!