d2m-3-决策树
基本流程
输入:训练集 D = { ( x 1 , y 1 ) , . . . , ( x n , y n ) } D=\{(x_1, y_1), ..., (x_n, y_n)\} D={(x1,y1),...,(xn,yn)}, 特征集 A = { a 1 , . . , a m } A=\{a_1, .., a_m\} A={ a1,..,am}
过程:函数TreeGenerate(D, A)
- 生成节点node
- if D中样本完全属于同一类别C,then 将node标记为C类叶节点;return end if
- if A空 or D中样本在A上取值相同 then 将node标记为D中样本数最多的类的叶节点;return end if
- 从A中选择最优划分属性 a ∗ a_* a∗,怎么选呢,如下
- 遍历A,计算划分准则来选择
- for a ∗ a_* a∗的每一个值 a ∗ v a_*^v a∗v do
- 为node生成一个分支,令 D v D_v Dv表示D中在 a ∗ a_* a∗上取值为 a ∗ v a_*^v a∗v的样本子集
- if D v D_v Dv为空,then 将node标记为D中样本数最多的类的叶节点;return
- else 以TreeGenerate( D v D_v Dv, A-{a_*})为分支节点 end if
end for
输出:以node为根节点的一颗决策树
理论部分
ID3
算法步骤
1. 初始化信息增益阈值$\epsilon$
2. 判断样本是否为同一类输出$D_i$
1. 如果是,则输出单节点树$T$,输出类别为$D_i$
2. 如果不是,则判断特征集$A$是否为空
1. 如果是空,则输出单节点树$T$, 输出类别为类别众数对应那个类别
2. 如果不是,则从特征集$A$中遍历每个特征$A_i$,计算$H(D)-H(D|A)$,选取信息增益最大的那个特征$A_g$作为分裂点
1. 如果信息增益小与$\epsilon$,则输出当前树$T_i$,输出类别为类别众数对应那个类别
2. 如果不是,则将其分裂,并遍历所有子节点,令$D=D_i, A=A-\{A_g\}$,重复上述步骤,直到得到树
信息增益的计算方式
- 熵, 假定当前样本集合D中第k类样本所占的比例为 p k ( k = 1 , 2 , . . . , ∣ y ∣ ) p_k(k = 1, 2, ..., |y|) pk(k=1,2,...,∣y∣)
E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k Ent(D) = -\sum_{k=1}^{|y|}{p_klog_2p_k} Ent(D)=−k=1∑∣y∣pklog2pk
其中 x x x是特征 X X X的各个属性值
- 信息增益
G a i n ( D , a ) = E n t ( D ) − ∑ v ∈ v a l u e ( a ) n u m ( D v ) n u m ( D ) E n t ( D v ) Gain(D,a) = Ent(D) - \sum_{v \in value(a)}{\frac{num(D_v)}{num(D)}Ent(D_v)} Gain(D,