树回归
优点:可以对复杂和非线性的数据建模。
缺点:结果不易理解。
适用数据类型:数值型和标称型数据。
连续和离散型特征的树的构建
在树的构建过程中,需要解决多种类型数据的存储问题,可以使用一部字典来存储树的数据结构,该字典将包含以下4个元素:
(1)待切分的特征
(2)待切分的特征值
(3)右子树。当不再需要切分的时候,也可以是单个值
(4)左子树。与右子树类似
树包含左键和右键,可以存储另一棵子树或者单个值。字典还包含特征和特征值这两个键,它们给出切分算法所有的特征和特征值。 树的每个分枝还可以再包含其他树、数值型数据甚至是向量。
函数createTree()的伪代码:
找到最佳的待切分特征:
如果该节点不能再分,将该节点存为叶节点
执行二元切分
在右子树调用createTree()方法
在左子树调用createTree()方法
将 CART 算法用于回归
回归树假设叶节点是常数值,这种策略认为数据中的复杂关系可以用树结构来概括。为成功构建以分段常数为叶节点的树,需要度量出数据的一致性。 使用树进行分类,可以在给定节点时计算数据的混乱度。 首先计算所有数据的均值,然后计算每条数据的值到均值的差值。为了对正负差值同等看待,一般使用绝对值或平方值来代替上述差值。上述做法有点类似于前面介绍过的统计学中常用的方差计算。唯一的不同就是,方差是平方误差的均值(均方差),而这里需要的是平方误差的总值(总方差)。总方差可以通过均方差乘以数据集中样本点的个数来得到。
树剪枝
一棵树如果节点过多,表明该模型可能对数据进行了“过拟合”。那么,如何判断是否发生了过拟合?前面使用了测试集上某种交叉验证技术来发现过拟合,决策树亦是如此。通过降低决策树的复杂度来避免过拟合的过程称为剪枝( pruning),其实前面已经进行过剪枝处理。在函数chooseBestSplit()中的提前终止条件,实际上是在进行一种所谓的预剪枝( prepruning)操作。另一种形式的剪枝需要使用测试集和训练集,称作后剪枝( postpruning)。
模型树
用树来对数据建模,除了把叶节点简单地设定为常数值之外,还有一种方法是把叶节点设定为分段线性函数,这里所谓的分段线性( piecewise linear)是指模型由多个线性片段组成。 决策树相比于其他机器学习算法的优势之一在于结果更易理解。很显然,两条直线比很多节点组成一棵大树更容易解释。模型树的可解释性是它优于回归树的特点之一。另外,模型树也具有更高的预测准确度。
使用 Python 的 Tkinter 库创建 GUI
机器学习提供了一些强大的工具,能从未知数据中抽取出有用的信息。因此,能否将
这些信息以易于人们理解的方式呈现十分重要。再者,假如人们可以直接与算法和数据交互,将可以比较轻松地进行解释。如果仅仅只是绘制出一幅静态图像,或者只是在Python命令行中输出一些数字,那么对结果做分析和交流将非常困难。如果能让用户不需要任何指令就可以按照他们自己的方式来分析数据,就不需要对数据做出过多解释。其中一个能同时支持数据呈现和用户交互的方式就是构建一个图形用户界面( GUI, Graphical User Interface),如图所示。
- 利用GUI对回归树调优
(1) 收集数据:所提供的文本文件。
(2) 准备数据:用Python解析上述文件,得到数值型数据。
(3) 分析数据:用Tkinter构建一个GUI来展示模型和数据。
(4) 训练算法:训练一棵回归树和一棵模型树,并与数据集一起展示出来。
(5) 测试算法:这里不需要测试过程。
(6) 使用算法: GUI使得人们可以在预剪枝时测试不同参数的影响,还可以帮助我们选择模型的类型。
Tkinter的GUI由一些小部件( Widget)组成。所谓小部件,指的是文本框( Text Box)、按钮( Button)、标签( Label)和复选按钮( Check Button)等对象。在刚才的Hello World例子中,标签myLabel就是其中唯一的小部件。当调用myLabel的.grid()方法时,就等于把myLabel的位置告诉了布局管理器( Geometry Manager)。 Tkinter中提供了几种不同的布局管理器,其中的.grid()方法会把小部件安排在一个二维的表格中。用户可以设定每个小部件所在的行列位置。如果没有做任何设定, myLabel会默认显示在0行0列。
还有一些新的小部件暂时未使用到,这些小部件包括文本输入框( Entry)、 复选按钮( Checkbutton)和按钮整数值( IntVar)等。其中Entry部件是一个允许单行文本输入的文本框。Checkbutton和IntVar的功能显而易见:为了读取Checkbutton的状态需要创建一个变量,也就是IntVar。
本章小结
数据集中经常包含一些复杂的相互关系,使得输入数据和目标变量之间呈现非线性关系。对这些复杂的关系建模,一种可行的方式是使用树来对预测值分段,包括分段常数或分段直线。一般采用树结构来对这种数据建模。相应地,若叶节点使用的模型是分段常数则称为回归树,若叶节点使用的模型是线性回归方程则称为模型树。
CART算法可以用于构建二元树并处理离散型或连续型数据的切分。若使用不同的误差准则,就可以通过CART算法构建模型树和回归树。该算法构建出的树会倾向于对数据过拟合。一棵过拟合的树常常十分复杂,剪枝技术的出现就是为了解决这个问题。两种剪枝方法分别是预剪枝(在树的构建过程中就进行剪枝)和后剪枝(当树构建完毕再进行剪枝),预剪枝更有效但需要用户定义一些参数。
Tkinter是Python的一个GUI工具包。虽然并不是唯一的包,但它最常用。利用Tkinter,我们可以轻松绘制各种部件并灵活安排它们的位置。另外,可以为Tkinter构造一个特殊的部件来显示Matplotlib绘出的图。所以, Matplotlib和Tkinter的集成可以构建出更强大的GUI,用户可以以更自然的方式来探索机器学习算法的奥妙。