习题5.1
题目:根据表5.1所给的训练数据集,利用信息增益比(C4.5算法)生成决策树.
习题5.2
题目:已知下表所示的训练数据,试用平方误差损失准则生成一个二叉回归树.
"""
编程实现书本89页习题5.2
算法:最小二乘回归树生成算法
准则:平方误差最小化
"""
#-*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
y = np.array([4.5, 4.75, 4.91, 5.34, 5.8, 7.05, 7.9, 8.23, 8.7, 9]) #y的值
#节点定义
class TreeNode(object):
def __init__(self, tempR, tempc):
#R存满足该节点划分条件的实例对应的yi
#最后将输入空间划分为若干个单元,对所属每个单元的所有实例xi对应的yi取平均即为该单元上的最优输出值。
self.R = tempR
#c存的是该节点对应的s为切分点划分条件时的最小平方误差
self.c = tempc
self.left = None
self.right = None
#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)
习题5.3
习题5.4
*