安居多伦多
  • 多市生活
    • 多市生活
    • 加国税务
    • 旅游度假
    • 生活安全
    • 行车安全
    • 窍门集锦
  • 多市书苑
    • 热门
    • 小说
    • 教育
  • 家居信息
    • 家居信息
    • 房屋保养
    • 房屋贷款
    • 房屋租赁
    • 房屋建筑
    • 房前屋后
    • 家居风水
  • 健康保健
    • 健康保健
    • 饮食起居
    • 食品安全
    • 健身锻炼
  • 书苑账户
    • 书苑登入
    • 书苑注册
    • 忘记书苑密码
    • 书苑账户信息
    • 关于我们
    • 联系我们
    • 隐私政策
多伦多书苑
在线书籍:随时阅读,随身听书。
所有书籍 | 人文 | 人物 | 人生 | 健康 | 儿童 | 医学 | 历史 | 历史 | 古典 | 哲学宗教 | 商业 | 外国 | 寓言 | 小说 | 教育 | 风水 | 管理 | 语言 |
为使本公益资源网站能继续提供免费阅读,请勿屏蔽广告。谢谢!报告弹出广告被滥用。
  1. 安居多伦多
  2. 网上书苑
  3. IT
  4. AI
  5. 机器学习实战

机器学习实战

2022-03-09 0人点赞 0条评论
点赞
x
语速1.0: 2.0
进度0:

上一页   |   返回目录   |   下一页

9.5 模型树

用树来对数据建模,除了把叶节点简单地设定为常数值之外,还有一种方法是把叶节点设定为分段线性函数,这里所谓的分段线性(piecewise linear)是指模型由多个线性片段组成。如果读者仍不清楚,下面很快就会给出样例来帮助理解。考虑图9-4中的数据,如果使用两条直线拟合是否比使用一组常数来建模好呢 ?答案显而易见。可以设计两条分别从0.0~0.3、从0.3~1.0的直线,于是就可以得到两个线性模型。因为数据集里的一部分数据(0.0~0.3)以某个线性模型建模,而另一部分数据(0.3~1.0)则以另一个线性模型建模,因此我们说采用了所谓的分段线性模型。

决策树相比于其他机器学习算法的优势之一在于结果更易理解。很显然,两条直线比很多节点组成一棵大树更容易解释。模型树的可解释性是它优于回归树的特点之一。另外,模型树也具有更高的预测准确度。

用来测试模型树构建函数的分段线性数据

图9-4 用来测试模型树构建函数的分段线性数据

前面的代码稍加修改就可以在叶节点生成线性模型而不是常数值。下面将利用树生成算法对数据进行切分,且每份切分数据都能很容易被线性模型所表示。该算法的关键在于误差的计算。

前面已经给出了树构建的代码,但是这里仍然需要给出每次切分时用于误差计算的代码。不知道读者是否还记得之前createTree()函数里有两个参数从未改变过。回归树把这两个参数固定,而此处略做修改,从而将前面的代码重用于模型树。

下一个问题就是,为了找到最佳切分,应该怎样计算误差呢?前面用于回归树的误差计算方法这里不能再用。稍加变化,对于给定的数据集,应该先用线性的模型来对它进行拟合,然后计算真实的目标值与模型预测值间的差值。最后将这些差值的平方求和就得到了所需的误差。为了解实际效果,打开regTrees.py文件并加入如下代码。

程序清单9-4 模型树的叶节点生成函数

def linearSolve(dataSet):
m,n = shape(dataSet)
# ❶(以下两行)将X与Y中的数据格式化
X = mat(ones((m,n))); Y = mat(ones((m,1)))
X[:,1:n] = dataSet[:,0:n-1]; Y = dataSet[:,-1]
xTx = X.T*X
if linalg.det(xTx) == 0.0:
raise NameError('This matrix is singular, cannot do inverse,\n\
try increasing the second value of ops')
ws = xTx.I * (X.T * Y)
return ws,X,Y
def modelLeaf(dataSet):
ws,X,Y = linearSolve(dataSet)
return ws
def modelErr(dataSet):
ws,X,Y = linearSolve(dataSet)
yHat = X * ws
return sum(power(Y - yHat, 2))

上述程序清单中的第一个函数是linearSolve(),它会被其他两个函数调用。其主要功能是将数据集格式化成目标变量Y和自变量X ❶。与第8章一样,X和Y用于执行简单的线性回归。另外在这个函数中也应当注意,如果矩阵的逆不存在也会造成程序异常。

第二个函数modelLeaf()与程序清单9-2里的函数regLeaf()类似,当数据不再需要切分的时候它负责生成叶节点的模型。该函数在数据集上调用linearSolve()并返回回归系数ws。

最后一个函数是modelErr(),可以在给定的数据集上计算误差。它与程序清单9-2的函数regErr()类似,会被chooseBestSplit()调用来找到最佳的切分。该函数在数据集上调用linearSolve(),之后返回yHat和Y之间的平方误差。

至此,使用程序清单9-1和9-2中的函数构建模型树的全部代码已经完成。为了解实际效果,保存regTrees.py文件并在Python提示符下输入:

>>> reload(regTrees)

图9-4的数据已保存在一个用tab键为分隔符的文本文件exp2.txt里。

>>> myMat2 = mat(regTrees.loadDataSet('exp2.txt'))

为了调用函数createTree()和模型树的函数,需将模型树函数作为createTree()的参数,输入下面的命令:

>>> regTrees.createTree(myMat2, regTrees.modelLeaf, regTrees.modelErr,(1,10))
{'spInd': 0, 'spVal': matrix([[ 0.285477]]), 'right': matrix([[3.46877936], [ 1.18521743]]), 'left':
[ 1.19647739e+01]])}

可以看到,该代码以0.285 477为界创建了两个模型,而图9-4的数据实际在0.3处分段。createTree()生成的这两个线性模型分别是y = 3.468 + 1.1852和y = 0.001 698 5 + 11.964 77x,与用于生成该数据的真实模型非常接近。该数据实际是由模型 y = 3.5 + 1.0x和y = 0 + 12x 再加上高斯噪声生成的。在图9-5上可以看到图9-4的数据以及生成的线性模型。

在数据集上应用模型树算法得到的结果

图9-5 在图9-4数据集上应用模型树算法得到的结果

模型树、回归树以及第8章里的其他模型,哪一种模型更好呢?一个比较客观的方法是计算相关系数,也称为R2值。该相关系数可以通过调用NumPy库中的命令corrcoef(yHat, y, rowvar=0)来求解,其中yHat是预测值,y是目标变量的实际值。

前一章使用了标准的线性回归法,本章则使用了树回归法,下面将通过实例对二者进行比较,最后用函数corrcoef()来分析哪个模型是最优的。

上一页   |   返回目录   |   下一页

类似书籍

Python机器学习手册:从数据预处理到深度学习
Python机器学习手册:从数据预处理到深度学习
Python机器学习——预测分析核心算法
Python机器学习——预测分析核心算法
Python机器学习实践指南
Python机器学习实践指南
Author:

标签: 暂无
最后更新:2022-03-09
< 上一篇

本书评论

取消回复

©2021 安居多伦多 - 版权所有

本站由 好事来 Hostlike.com 提供技术支持。