题目:根据表5.1所给的训练数据集,利用信息增益比(C4.5算法)生成决策树.
答:
先计算每个特征的信息增益比,信息增益比 g R ( D , A ) = g ( D , A ) H A ( D ) g_{R}(D,A)=\frac{g(D,A)}{H_{A}(D)} gR(D,A)=HA(D)g(D,A)。其中D关于特征A的熵 H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ log 2 ∣ D i ∣ ∣ D ∣ H_{A}(D)=-\sum_{i=1}^{n}\frac{|D_{i}|}{|D|}\log_{2}\frac{|D_{i}|}{|D|} HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣(n为A特征的取值个数),信息增益 g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
分别以 A 1 , A 2 , A 3 , A 4 A_{1},A_{2},A_{3},A_{4} A1,A2,A3,A4表示年龄、有工作、有自己的房子和信贷情况4个特征。
经验熵 H A ( D ) H_{A}(D) HA(D):
H A 1 ( D ) = − 5 15 log 2 5 15 − 5 15 log 2 5 15 − 5 15 log 2 5 15 = 1.584 H_{A_{1}}(D)=-\frac{5}{15}\log_{2}\frac{5}{15}-\frac{5}{15}\log_{2}\frac{5}{15}-\frac{5}{15}\log_{2}\frac{5}{15}=1.584 HA1(D)=−155log2155−155log2155−155log2155=1.584
H A 2 ( D ) = − 5 15 log 2 5 15 − 10 15 log 2 10 15 = 0.918 H_{A_{2}}(D)=-\frac{5}{15}\log_{2}\frac{5}{15}-\frac{10}{15}\log_{2}\frac{10}{15}=0.918 HA2(D)=−155log2155−1510log21510=0.918
H A 3 ( D ) = − 9 15 log 2 9 15 − 6 15 log 2 6 15 = 0.971 H_{A_{3}}(D)=-\frac{9}{15}\log_{2}\frac{9}{15}-\frac{6}{15}\log_{2}\frac{6}{15}=0.971 HA3(D)=−159log2159−156log2156=0.971
H A 4 ( D ) = − 4 15 log 2 4 15 − 6 15 log 2 6 15 − 5 15 log 2 5 15 = 1.566 H_{A_{4}}(D)=-\frac{4}{15}\log_{2}\frac{4}{15}-\frac{6}{15}\log_{2}\frac{6}{15}-\frac{5}{15}\log_{2}\frac{5}{15}=1.566 HA4(D)=−154log2154−156log2156−155log2155=1.566
例题5.2已经计算了各个特征的信息增益:
g ( D , A 1 ) = 0.083 g(D,A_{1})=0.083 g(D,A1)=0.083
g ( D , A 2 ) = 0.324 g(D,A_{2})=0.324 g(D,A2)=0.324
g ( D , A 3 ) = 0.420 g(D,A_{3})=0.420 g(D,A3)=0.420
g ( D , A 4 ) = 0.363 g(D,A_{4})=0.363 g(D,A4)=0.363
得信息增益比:
g R ( D , A 1 ) = 0.052 g_{R}(D,A_{1})=0.052 gR(D,A1)=0.052
g R ( D , A 2 ) = 0.353 g_{R}(D,A_{2})=0.353 gR(D,A2)=0.353
g R ( D , A 3 ) = 0.433 g_{R}(D,A_{3})=0.433 gR(D,A3)=0.433
g R ( D , A 4 ) = 0.232 g_{R}(D,A_{4})=0.232 gR(D,A4)=0.232
选择信息增益比最大的特征 A 3 A_{3} A3作为根节点特征,将训练集分为两个子集 D 1 ( A 3 = ′ 是 ′ ) D_{1}(A_{3}='是') D1(A3=′是′)和 D 2 ( A 3 = ′ 否 ′ ) D_{2}(A_{3}='否') D2(A3=′否′),由于 D 1 D_{1} D1中只有同一类样本点,所以它是一个叶节点,标记为“是”
对 D 2 D_{2} D2从 A 1 , A 2 , A 4 A_{1},A_{2},A_{4} A1,A2,A4中选择新的特征, D 2 D_{2} D2中的元素有:
重新计算各个特征的信息增益比
经验熵:
H ( D 2 ) = − 3 9 log 2 3 9 − 6 9 log 2 6 9 = 0.918 H(D_{2})=-\frac{3}{9}\log_{2}\frac{3}{9}-\frac{6}{9}\log_{2}\frac{6}{9}=0.918 H(D2)=−93log293−96log296=0.918
信息增益:
g ( D 2 , A 1 ) = H ( D 2 ) − [ 4 9 H ( D 21 ) + 2 9 H ( D 22 ) + 3 9 H ( D 23 ) ] = 0.918 − [ 4 9 ( − 1 4 log 2 1 4 − 3 4 log 2 3 4 ) + 2 9 ( − 2 2 log 2 2 2 ) + 3 9 ( − 2 3 log 2 2 3 − 1 3 log 2 1 3 ) ] = 0.918 − 0.667 = 0.251 \begin{aligned}g(D_{2},A_{1})&=H(D_{2})-[\frac{4}{9}H(D_{21})+\frac{2}{9}H(D_{22})+\frac{3}{9}H(D_{23})] \\&=0.918-[\frac{4}{9}(-\frac{1}{4}\log_{2}\frac{1}{4}-\frac{3}{4}\log_{2}\frac{3}{4})+\frac{2}{9}(-\frac{2}{2}\log_{2}\frac{2}{2})+\frac{3}{9}(-\frac{2}{3}\log_{2}\frac{2}{3}-\frac{1}{3}\log_{2}\frac{1}{3})]\\&=0.918-0.667\\&=0.251\end{aligned} g(D2,A1)=H(D2)−[94H(D21)+92H(D22)+93H(D23)]=0.918−[94(−41log241−43log243)+92(−22log222)+93(−32log232−31log231)]=0.918−0.667=0.251
其中 D 21 , D 22 , D 23 D_{21},D_{22},D_{23} D21,D22,D23分别表示 D 2 D_{2} D2中 A 1 A_{1} A1取值为青年,中年,老年的样本子集。
g ( D 2 , A 2 ) = H ( D 2 ) − [ 6 9 H ( D 21 ) + 3 9 H ( D 22 ) ] = 0.918 − [ 6 9 ( − 6 6 log 2 6 6 ) + 3 9 ( − 3 3 log 2 3 3 ) ] = 0.918 \begin{aligned}g(D_{2},A_{2})&=H(D_{2})-[\frac{6}{9}H(D_{21})+\frac{3}{9}H(D_{22})]\\&=0.918-[\frac{6}{9}(-\frac{6}{6}\log_{2}\frac{6}{6})+\frac{3}{9}(-\frac{3}{3}\log_{2}\frac{3}{3})]\\&=0.918\end{aligned} g(D2,A2)=H(D2)−[96H(D21)+93H(D22)]=0.918−[96(−66log266)+93(−33log233)]=0.918
其中 D 21 , D 22 D_{21},D_{22} D21,D22分别表示 D 2 D_{2} D2中 A 2 A_{2} A2取值为否,是的样本子集。
g ( D 2 , A 4 ) = H ( D 2 ) − [ 4 9 H ( D 21 ) + 4 9 H ( D 22 ) + 1 9 H ( D 23 ) ] = 0.918 − [ 4 9 ( − 4 4 log 2 4 4 ) + 4 9 ( − 2 4 log 2 2 4 − 2 4 log 2 2 4 ) + 1 9 ( − 1 1 log 2 1 1 ) ] = 0.918 − 0.444 = 0.474 \begin{aligned}g(D_{2},A_{4})&=H(D_{2})-[\frac{4}{9}H(D_{21})+\frac{4}{9}H(D_{22})+\frac{1}{9}H(D_{23})]\\&=0.918-[\frac{4}{9}(-\frac{4}{4}\log_{2}\frac{4}{4})+\frac{4}{9}(-\frac{2}{4}\log_{2}\frac{2}{4}-\frac{2}{4}\log_{2}\frac{2}{4})+\frac{1}{9}(-\frac{1}{1}\log_{2}\frac{1}{1})]\\&=0.918-0.444\\&=0.474\end{aligned} g(D2,A4)=H(D2)−[94H(D21)+94H(D22)+91H(D23)]=0.918−[94(−44log244)+94(−42log242−42log242)+91(−11log211)]=0.918−0.444=0.474
其中 D 21 , D 22 , D 23 D_{21},D_{22},D_{23} D21,D22,D23分别表示 D 2 D_{2} D2中 A 4 A_{4} A4取值为一般,好,非常好的样本子集。
信息增益比:
g R ( D 2 , A 1 ) = g ( D 2 , A 1 ) H A 1 ( D 2 ) = 0.251 − 4 9 log 2 4 9 − 2 9 log 2 2 9 − 3 9 log 2 3 9 = 0.251 1.530 = 0.164 \begin{aligned}g_{R}(D_{2},A_{1})&=\frac{g(D_{2},A_{1})}{H_{A_{1}}(D_{2})}\\&=\frac{0.251}{-\frac{4}{9}\log_{2}\frac{4}{9}-\frac{2}{9}\log_{2}\frac{2}{9}-\frac{3}{9}\log_{2}\frac{3}{9}}\\&=\frac{0.251}{1.530}\\&=0.164\end{aligned} gR(D2,A1)=HA1(D2)g(D2,A1)=−94log294−92log292−93log2930.251=1.5300.251=0.164
g R ( D 2 , A 2 ) = g ( D 2 , A 2 ) H A 2 ( D 2 ) = 0.918 − 6 9 log 2 6 9 − 3 9 log 2 3 9 = 0.918 0.918 = 1 \begin{aligned}g_{R}(D_{2},A_{2})&=\frac{g(D_{2},A_{2})}{H_{A_{2}}(D_{2})}\\&=\frac{0.918}{-\frac{6}{9}\log_{2}\frac{6}{9}-\frac{3}{9}\log_{2}\frac{3}{9}}\\&=\frac{0.918}{0.918}\\&=1\end{aligned} gR(D2,A2)=HA2(D2)g(D2,A2)=−96log296−93log2930.918=0.9180.918=1
g R ( D 2 , A 4 ) = g ( D 2 , A 4 ) H A 4 ( D 2 ) = 0.474 − 4 9 log 2 4 9 − 4 9 log 2 4 9 − 1 9 log 2 1 9 = 0.474 1.392 = 0.340 \begin{aligned}g_{R}(D_{2},A_{4})&=\frac{g(D_{2},A_{4})}{H_{A_{4}}(D_{2})}\\&=\frac{0.474}{-\frac{4}{9}\log_{2}\frac{4}{9}-\frac{4}{9}\log_{2}\frac{4}{9}-\frac{1}{9}\log_{2}\frac{1}{9}}\\&=\frac{0.474}{1.392}\\&=0.340\end{aligned} gR(D2,A4)=HA4(D2)g(D2,A4)=−94log294−94log294−91log2910.474=1.3920.474=0.340
选择信息增益比最大的特征 A 2 A_{2} A2作为节点的特征,从这一结点引出两个子结点:一个对应“是”(有工作)的子结点,包含3个样本,它们属于同一类,所以这是一个叶结点,类标记为“是”;另一个是对应“否”(无工作)的子结点,包含6个样本,它们也属于同一类,所以这也是一个叶结点,类标记为“否”。
最终的决策树如图:
贴个代码验算下:
首先是书中例题5.3用ID3算法生成决策树
import numpy as np
from math import log
def loadData():
datasets = [['青年', '否', '否', '一般', '否'],
['青年', '否', '否', '好', '否'],
['青年', '是', '否', '好', '是'],
['青年', '是', '是', '一般', '是'],
['青年', '否', '否', '一般', '否'],
['中年', '否', '否', '一般', '否'],
['中年', '否', '否', '好', '否'],
['中年', '是', '是', '好', '是'],
['中年', '否', '是', '非常好', '是'],
['中年', '否', '是', '非常好', '是'],
['老年', '否', '是', '非常好', '是'],
['老年', '否', '是', '好', '是'],
['老年', '是', '否', '好', '是'],
['老年', '是', '否', '非常好', '是'],
['老年', '否', '否', '一般', '否'],
]
labels = [u'年龄', u'有工作', u'有自己的房子', u'信贷情况', u'类别']
# 返回数据集和每个维度的名称
return datasets, labels
def calc_entropy(datasets):
label_count = {}
for dataset in datasets:
label = dataset[-1]
if label not in label_count:
label_count[label] = 0
label_count[label] += 1
entropy = -sum([(p/len(datasets))*log(p/len(datasets),2) for p in label_count.values()])
return entropy
def calc_conditional_entropy(datasets, index = 0):
feature_data = {}
for dataset in datasets:
feature = dataset[index]
if feature not in feature_data:
feature_data[feature] = []
feature_data[feature].append(dataset)
condEntropy = sum([(len(p)/len(datasets))*calc_entropy(p) for p in feature_data.values()])
return condEntropy
def info_gain(entropy, condEntropy):
return entropy - condEntropy
def info_gain_train_childTree(datasets, labels):
entropy = calc_entropy(datasets)
features = []
for index in range(len(datasets[0])-1):
condEntropy = calc_conditional_entropy(datasets, index)
c_info_gain = info_gain(entropy, condEntropy)
features.append((index, c_info_gain))
print("特征({})的信息增益为{:.3f}".format(labels[index], c_info_gain))
best_feature = max(features, key=lambda x: x[-1])
print("特征({})的信息增益最大,选择为当前节点特征".format(labels[best_feature[0]]))
return best_feature
def info_gain_train(datasets, labels):
label_count = {}
for dataset in datasets:
label = dataset[-1]
if label not in label_count:
label_count[label] = 0
label_count[label] += 1
if len(label_count.keys()) == 1:
key = list(label_count.keys())[0]
print("此时类别均为{}".format(key))
return
best_feature = info_gain_train_childTree(datasets, labels)
feature_data = {}
for dataset in datasets:
feature = dataset[best_feature[0]]
if feature not in feature_data:
feature_data[feature] = []
feature_data[feature].append(dataset)
for data in zip(feature_data.keys(), feature_data.values()):
print("当{}为{}".format(labels[best_feature[0]], data[0]))
info_gain_train(data[1], labels)
if __name__ == "__main__":
datasets, labels = loadData()
info_gain_train(datasets, labels)
运行结果
特征(年龄)的信息增益为0.083
特征(有工作)的信息增益为0.324
特征(有自己的房子)的信息增益为0.420
特征(信贷情况)的信息增益为0.363
特征(有自己的房子)的信息增益最大,选择为当前节点特征
当有自己的房子为否
特征(年龄)的信息增益为0.252
特征(有工作)的信息增益为0.918
特征(有自己的房子)的信息增益为0.000
特征(信贷情况)的信息增益为0.474
特征(有工作)的信息增益最大,选择为当前节点特征
当有工作为否
此时类别均为否
当有工作为是
此时类别均为是
当有自己的房子为是
此时类别均为是
C4.5算法
import numpy as np
from math import log
def loadData():
datasets = [['青年', '否', '否', '一般', '否'],
['青年', '否', '否', '好', '否'],
['青年', '是', '否', '好', '是'],
['青年', '是', '是', '一般', '是'],
['青年', '否', '否', '一般', '否'],
['中年', '否', '否', '一般', '否'],
['中年', '否', '否', '好', '否'],
['中年', '是', '是', '好', '是'],
['中年', '否', '是', '非常好', '是'],
['中年', '否', '是', '非常好', '是'],
['老年', '否', '是', '非常好', '是'],
['老年', '否', '是', '好', '是'],
['老年', '是', '否', '好', '是'],
['老年', '是', '否', '非常好', '是'],
['老年', '否', '否', '一般', '否'],
]
labels = [u'年龄', u'有工作', u'有自己的房子', u'信贷情况', u'类别']
# 返回数据集和每个维度的名称
return datasets, labels
def calc_entropy(datasets, index=-1):
label_count = {}
for dataset in datasets:
label = dataset[index]
if label not in label_count:
label_count[label] = 0
label_count[label] += 1
entropy = -sum([(p/len(datasets))*log(p/len(datasets),2) for p in label_count.values()])
return entropy
def calc_conditional_entropy(datasets, index = 0):
feature_data = {}
for dataset in datasets:
feature = dataset[index]
if feature not in feature_data:
feature_data[feature] = []
feature_data[feature].append(dataset)
condEntropy = sum([(len(p)/len(datasets))*calc_entropy(p) for p in feature_data.values()])
return condEntropy
def info_gain(entropy, condEntropy):
return entropy - condEntropy
def info_gain_ratio(c_info_gain, c_entropy):
return 0 if c_info_gain == 0 else c_info_gain/c_entropy
def info_gain_train_childTree(datasets, labels):
entropy = calc_entropy(datasets)
features = []
for index in range(len(datasets[0])-1):
condEntropy = calc_conditional_entropy(datasets, index)
c_info_gain = info_gain(entropy, condEntropy)
c_entropy = calc_entropy(datasets, index)
c_info_gain_ratio = info_gain_ratio(c_info_gain, c_entropy)
features.append((index, c_info_gain_ratio))
print("特征({})的信息增益比为{:.3f}".format(labels[index], c_info_gain_ratio))
best_feature = max(features, key=lambda x: x[-1])
print("特征({})的信息增益比最大,选择为当前节点特征".format(labels[best_feature[0]]))
return best_feature
def info_gain_train(datasets, labels):
label_count = {}
for dataset in datasets:
label = dataset[-1]
if label not in label_count:
label_count[label] = 0
label_count[label] += 1
if len(label_count.keys()) == 1:
key = list(label_count.keys())[0]
print("此时类别均为{}".format(key))
return
best_feature = info_gain_train_childTree(datasets, labels)
feature_data = {}
for dataset in datasets:
feature = dataset[best_feature[0]]
if feature not in feature_data:
feature_data[feature] = []
feature_data[feature].append(dataset)
for data in zip(feature_data.keys(), feature_data.values()):
print("当{}为{}".format(labels[best_feature[0]], data[0]))
info_gain_train(data[1], labels)
if __name__ == "__main__":
datasets, labels = loadData()
info_gain_train(datasets, labels)
运行结果
特征(年龄)的信息增益比为0.052
特征(有工作)的信息增益比为0.352
特征(有自己的房子)的信息增益比为0.433
特征(信贷情况)的信息增益比为0.232
特征(有自己的房子)的信息增益比最大,选择为当前节点特征
当有自己的房子为否
特征(年龄)的信息增益比为0.164
特征(有工作)的信息增益比为1.000
特征(有自己的房子)的信息增益比为0.000
特征(信贷情况)的信息增益比为0.340
特征(有工作)的信息增益比最大,选择为当前节点特征
当有工作为否
此时类别均为否
当有工作为是
此时类别均为是
当有自己的房子为是
此时类别均为是
题目:已知下表所示的训练数据,试用平方误差损失准则生成一个二叉回归树.
x i x_{i} xi | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
y i y_{i} yi | 4.50 | 4.75 | 4.91 | 5.34 | 5.80 | 7.05 | 7.70 | 8.23 | 8.70 | 9.00 |
回归树的建立算法:
本题的计算量有点大,直接用Python实现,具体代码和结果如下。
#环境Python3.7
#-*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
#节点定义
class TreeNode(object):
def __init__(self, tempR, tempc):
self.R = tempR
self.c = tempc
self.left = None
self.right = None
y = np.array([4.5, 4.75, 4.91, 5.34, 5.8, 7.05, 7.9, 8.23, 8.7, 9]) #y的值
#CART算法建立回归树
def CART(start, end):
# 切点s的选择表示R1为x值小于等于s的点,R2为大于s的点
if(end - start >= 1):
result = []
for s in range(start+1, end+1):#s在(start, end]之间取值
y1 = y[start : s] #y1取索引为[start, s]之间的值
y2 = y[s: end+1] #y2 取索引为[s+1, end]之间的值
result.append((y1.std()**2)*y1.size + (y2.std()**2)*y2.size)
#std即标准差函数,求标准差的时候默认除以元素的个数,因此平方后乘以元素个数才是要求的平方差
index1 = result.index(min(result)) + start#取平方差误差最小的索引值
root = TreeNode(y[start:end+1], min(result))
#索引值为0-9,x值为1-10,即s的值比求的索引值多1
print("节点元素值为",y[start:end+1], " s =",index1+1, " 最小平方误差为",min(result))#输出s值和最小平方误差
root.left = CART(start, index1) #对列表的左侧生成左子树
root.right = CART(index1+1, end) #对列表的右侧生成右子树
else:
root = None
return root
if __name__ == "__main__":
root = CART(0, 9)
运行结果:
节点元素值为 [4.5 4.75 4.91 5.34 5.8 7.05 7.9 8.23 8.7 9. ] s = 5 最小平方误差为 3.3587199999999986
节点元素值为 [4.5 4.75 4.91 5.34 5.8 ] s = 3 最小平方误差为 0.1912
节点元素值为 [4.5 4.75 4.91] s = 1 最小平方误差为 0.012800000000000023
节点元素值为 [4.75 4.91] s = 2 最小平方误差为 0.0
节点元素值为 [5.34 5.8 ] s = 4 最小平方误差为 0.0
节点元素值为 [7.05 7.9 8.23 8.7 9. ] s = 7 最小平方误差为 0.6625166666666665
节点元素值为 [7.05 7.9 ] s = 6 最小平方误差为 0.0
节点元素值为 [8.23 8.7 9. ] s = 8 最小平方误差为 0.04500000000000021
节点元素值为 [8.7 9. ] s = 9 最小平方误差为 0.0
原本是打算再用matplotlib可视化决策树,有、麻烦,后期有时间再优化一下。向大家说声抱歉。
另外简单说明一下计算的过程,以根节点为例,变换切分点 s s s,选择使得平方误差最小的切分点
s = 1 s=1 s=1:
即 y 1 = [ 4.5 ] , y 2 = [ 4.75 , 4.91 , 5.34 , 5.8 , 7.05 , 7.9 , 8.23 , 8.7 , 9. ] y_{1} = [4.5], y_{2} = [4.75 ,4.91, 5.34, 5.8 , 7.05 ,7.9, 8.23, 8.7, 9.] y1=[4.5],y2=[4.75,4.91,5.34,5.8,7.05,7.9,8.23,8.7,9.]
此时有 c 1 = 4.5 , c 2 = a v g ( y 2 ) = 6.85 c_{1} = 4.5, c{2} = avg(y{2}) = 6.85 c1=4.5,c2=avg(y2)=6.85, ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 = 22.45 \sum_{x_{i} \in R_{1}(j, s)}\left(y_{i}-c_{1}\right)^{2}+\sum_{x_{i} \in R_{2}(j, s)}\left(y_{i}-c_{2}\right)^{2}=22.45 ∑xi∈R1(j,s)(yi−c1)2+∑xi∈R2(j,s)(yi−c2)2=22.45
然后依次将 s s s从2取值到10,计算平方误差,选其中平方误差最小的s为根节点s,将元素分为左右子树后,再对左右子树进行相同的处理。
题目:证明 CART 剪枝算法中,当 α \alpha α确定时,存在唯一的最小子树 T α T_{\alpha} Tα使损失函数 C α ( T ) C_{\alpha}(T) Cα(T)最小
答:
(1)存在性
当 α \alpha α确定时,可以生成多种子树,每个子树对应一个损失函数,一定存在一个最小的损失函数。
(2)唯一性
假设损失函数为最小的损失函数有两个子树 T α , T β T_{\alpha}, T_{\beta} Tα,Tβ,剪枝的本质是对每个节点依次向上递归,若减去该节点后的子树的损失函数更小,则进行剪枝,否则结束该节点的递归。
若子树的 T α , T β T_{\alpha}, T_{\beta} Tα,Tβ某处不相同有两种情况
其一: T α T_{\alpha} Tα某处节点剪枝后得到 T β T_{\beta} Tβ
这种情况即该处是否剪枝不影响最终的损失函数大小,此时虽然二者的损失函数一致,但是右侧的子树更小,即最小子树仍为1个。
其二:
此时不难得出,若 T α T_{\alpha} Tα对2号节点进行剪枝,则 T a l p h a T_{alpha} Talpha的损失函数比原来小,所以最终结果也需要对2号节点进行剪枝,同理若 T β T_{\beta} Tβ对3号节点进行剪枝,则 T b e t a T_{beta} Tbeta的损失函数比原来小,所以最终结果也需要对3号节点进行剪枝,因此 T α , T β T_{\alpha}, T_{\beta} Tα,Tβ均不是最小子树。
题目:证明 CART 剪枝算法中求出的子树序列 { T 0 , T 1 , ⋯ , T n } \left\{T_{0}, T_{1}, \cdots, T_{n}\right\} {T0,T1,⋯,Tn}分别是区间 α ∈ [ α i , α i + 1 ) \alpha \in\left[\alpha_{i}, \alpha_{i+1}\right) α∈[αi,αi+1)的最优子树 T α T_{\alpha} Tα,这里 i = 0 , 1 , ⋯ , n , 0 = α 0 < α 1 < ⋯ < α n < + ∞ i=0,1, \cdots, n, \quad 0=\alpha_{0}<\alpha_{1}<\cdots<\alpha_{n}<+\infty i=0,1,⋯,n,0=α0<α1<⋯<αn<+∞
在子树序列中,每棵子树 { T 0 , T 1 , ⋯ , T n } \left\{T_{0}, T_{1}, \cdots, T_{n}\right\} {T0,T1,⋯,Tn}都对应于一个参数 α 0 , α 1 , α 2 . . . α n \alpha_0,\alpha_1,\alpha_2...\alpha_n α0,α1,α2...αn。所以,当最优子树 T k T_k Tk确定时,对应的 α k \alpha_k αk也确定了,即得到最优决策树 T α T_\alpha Tα。
CART算法详解
决策树详解
决策树可视化
CART剪枝