【Python机器学习】树回归——树回归与标准回归的比较

模型树、回归树和一般的回归方法,为了测试哪个模型最好,可以设计一些函数,它们可以在树构建好的情况下对给定的输入进行预测,之后利用那个这些函数来计算三种回归模型的测试误差。这些模型将在某个数据上进行测试,该数据涉及人的智力水平和自行车的速度的关系。

这里的数据是非线性的,且均纯属虚构

下面给出在给定输入和树结构情况下进行预测的几个函数:

python 复制代码
def regTreeEval(model,inDat):
    return float(model)

def modelTreeEval(model,inDat):
    n=shape(inDat)[1]
    X=mat(ones((1,n+1)))
    X[:,1:n+1]=inDat
    return float(X*model)

def treeForeCast(tree,inData,modelEval=regTreeEval):
    if not isTree(tree):
        return modelEval(tree,inData)
    if inData[tree['spInd']]>tree['spVal']:
        if isTree(tree['left']):
            return treeForeCast(tree['left'],inData,modelEval)
        else:
            return modelEval(tree['left'],inData)
    else:
        if isTree(tree['right']):
            return treeForeCast(tree['right'], inData, modelEval)
        else:
            return modelEval(tree['right'],inData)

def createForeCase(tree,testData,modelEval=regTreeEval):
    m=len(testData)
    yHat=mat(zeros((m,1)))
    for i in range(m):
        yHat[i,0]=treeForeCast(tree,mat(testData[i]),modelEval)
    return yHat

上述代码有4个函数,对于输入的单个数据点或者行向量,函数treeForeCast()会返回一个浮点值。在给定树结构的情况下,对于单个数据点,该函数会给出一个预测值。调用函数treeForeCast()时需要指定树的类型,以便在叶节点上能够调用合适的模型。参数modelEval是对叶节点数据进行预测的函数的引用。函数treeForeCast()自顶向下遍历整棵树,直到命中叶节点为止。一旦到达叶节点,它就会在输入数据上调用modelEval()函数,而该函数的默认值是regTreeEval()。

要对回归树叶节点进行预测,就要调用regTreeEval();要对模型树节点进行预测时,就调用modelTreeEval()函数,它们会对输入数据进行格式化处理,在原数据矩阵上增加第0列,然后计算并返回预测值。为了与函数modelTreeEval()保持一致,尽管regTreeEval()只使用一个输入,但仍保留了两个输入参数。

最后一个函数是createForeCase(),它会多次调用treeForeCast()函数。由于它能够以向量形式返回一组预测值,因此该函数在对整个测试集进行预测时非常有用。

上图中给出的是骑自行车速度和人智商之间的关系,下面将基于该数据集建立多个模型并在另一个测试集上进行测试。

下面为上图数据构建三个模型,首先创建一棵回归树:

python 复制代码
trainMat=mat(loadDataSet('test/bikeSpeedVsIq_train.txt'))
testMat=mat(loadDataSet('test/bikeSpeedVsIq_test.txt'))
myTree=createTree(trainMat,ops=(1,20))
yHat=createForeCase(myTree,testMat[:,0])
print(corrcoef(yHat,testMat[:,1],rowvar=0)[0,1])

同样的,再创建一棵模型树:

python 复制代码
myTree=createTree(trainMat,modelLeaf,modelErr,(1,20))
yHat=createForeCase(myTree,testMat[:,0],modelTreeEval)
print(corrcoef(yHat,testMat[:,1],rowvar=0)[0,1])

我们知道,值越接近1.0越好,所以从上面的结果来看,这里模型树的结果比回归树好。下面看标准的线性回归效果:

python 复制代码
ws,X,Y=linearSolve(trainMat)
print(ws)

为了得到测试集上所有的yHat预测值,在测试数据上循环执行:

python 复制代码
for i in range(shape(testMat)[0]):
    yHat[i]=testMat[i,0]*ws[1,0]+ws[0,0]
print(corrcoef(yHat,testMat[:,1],rowvar=0)[0,1])

可以看到,该方法在值上的表现不如上面两种树回归方法。所以,树回归方法在预测复杂数据时会比简单的线性模型更有效。

相关推荐
大数据魔法师3 小时前
Streamlit(二十三)- 教程(二)- 动态导航
python·web
HackTorjan4 小时前
2026年5月29日:全球首个通用人工智能操作系统正式发布,开启人机协同新纪元
人工智能
刘大猫.5 小时前
智造短剧新引擎:火山引擎上线「火山剧创 1.0」,制作效率提升 80%
人工智能·ai·chatgpt·机器人·大模型·火山引擎·短剧新引擎
红尘散仙5 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
雅菲奥朗5 小时前
企业级 AI 自动化|OpenClaw 龙虾实战与认证
运维·人工智能·自动化·openclaw
HIT_Weston5 小时前
99、【Agent】【OpenCode】task 工具提示词(Slash command)(一)
人工智能·agent·opencode
25 Hz5 小时前
Mind 爱好者时空表征刊 第24期 | 时间结构学习、空间对时间表征的补偿、事件内部的时间扭曲……
人工智能
心中有国也有家5 小时前
GE图引擎深度解析——CANN的计算图优化与执行引擎
人工智能·pytorch·python·学习·numpy
海兰6 小时前
【文字三国志:第一篇】天命重构,大语言模型(LLM)动态生成文言风格的叙事文本的文字游戏
人工智能·游戏·语言模型
cxr8286 小时前
高分子复合材料 AI 逆向设计合——验证闭环、决策优化与中试放大
人工智能·材料逆向设计合成