机器学习(八):树回归

算法介绍

CART (Classification And Regression Trees,分类回归树)_的树构建算法。该算法既可以用于分类还可以用于回归,因此非常值得学习。然后利用python来构建并显示CART树。代码会保持足够的灵活性以便能用于多个问题当中。接着,利用CART算法构建回归树并介绍其中的树剪枝技术(该技术的主要目的是防止树的过拟合)。之后引人了一个更高级的模型树算法。与回归树的做法(在每个叶节点上使用各自的均值做预测)不同,该算法需要在每个叶节点上都构建出一个线性模型。在这些树的构建算法中有一些需要调整的参数,所以还会介绍如何使用Python中的Tkinter模块建立图形交互界面。最后,在该界面的辅助下分析参数对回归效果的影响。

算法实现

树构建代码

from numpy import *

def loadDataSet(fileName):      #general function to parse tab -delimited floats
    dataMat = []                #assume last column is target value
    fr = open(fileName)
    for line in fr.readlines():
        curLine = line.strip().split('\t')
        fltLine = map(float,curLine) #map all elements to float()
        dataMat.append(fltLine)
    return dataMat

def binSplitDataSet(dataSet, feature, value):
    mat0 = dataSet[nonzero(dataSet[:,feature] > value)[0],:]
    mat1 = dataSet[nonzero(dataSet[:,feature] <= value)[0],:]
    return mat0,mat1

def regLeaf(dataSet):#returns the value used for each leaf
    return mean(dataSet[:,-1])

代码运行

if __name__ == '__main__':
    myDat = loadDataSet('ex00.txt')
    myMat = mat(myDat)
    print(createTree(myMat))

得到结果

{'spInd': 0, 'spVal': 0.48813, 'right': -0.044650285714285719, 'left': 1.0180967672413792}

树减枝
一棵树如果结点过多,表明该模型可能对数据进行了“过拟合”,如何判断是否过拟合,前面已经介绍了使用测试集上的某种交叉验证的方法来发现过拟合,决策树也是。

通过降低树的复杂度来避免过拟合的过程称为剪枝(pruning)。我们也已经提到,设置tolS和tolN就是一种预剪枝操作。另一种形式的剪枝需要使用测试集和训练集,称作后剪枝(postpruning)。本节将分析后剪枝的有效性,但首先来看一下预剪枝的不足之处
预剪枝

参数tolS为1时
在这里插入图片描述
将参数tolS修改为10000后
在这里插入图片描述
虽然和上图tolS对误差的数量级十分敏感。如果在选项中花费时间并对上述误差容忍度取平均值,或许也能得到仅有两个叶结点组成的树,可以看到,将参数tolS修改为10000后,构建的树就是只有两个叶结点。然而,显然这个值,需要我们经过不断测试得来,显然通过不断修改停止条件来得到合理结果并不是很好的办法。事实上,我们常常甚至不确定到底需要寻找什么样的结果。因为对于一个很多维度的数据集,你也不知道构建的树需要多少个叶结点。

可见,预剪枝有很大的局限性。接下来,我们讨论后剪枝,即利用测试集来对树进行剪枝。由于不需要用户指定参数,后剪枝是一个更理想化的剪枝方法。
后剪枝

使用后剪枝方法需要将数据集分成测试集和训练集。首先指定参数,使得构建出的树足够大、足够复杂,便于剪枝。接下来从上而下找到叶结点,用测试集来判断这些叶结点合并是否能降低测试集误差。如果是的话就合并。后剪枝可能不如预剪枝有效。一般地,为了寻求最佳模型可以同时使用两种剪枝技术。

总结

CART法可以用于构建二元树并处理离散型或連续型数据的切分。若使用不同的误差准则,
就可以通过CART算法构建模型树和回归树。该算法构建出的树会倾向于对数据过拟合。一棵过
拟合的树常常十分复杂,剪枝技术的出现就是为了解决这个问题。两种剪枝方法分别是预剪枝(在
树的构建过程中就进行剪枝)和后剪枝(当树构建完毕再进行剪枝),预剪枝更有效但需要用户
定义一些参数。

发布了44 篇原创文章 · 获赞 0 · 访问量 1035

猜你喜欢

转载自blog.csdn.net/LTC_1234/article/details/103018267