【Python机器学习】树回归——模型树

用树来对数据建模,除了把叶节点简单地设定为常数值之外,还有一种方法是把叶节点设定为分段线性函数,这类所谓的分段线性是指模型由多个线性片段组成。

如上图的数据,如果使用两条直线拟合是比一组常数来建模好的,可以设计两条分别从0.0-0.3、从0.3-1.0的直线,于是就得到两个线性模型,因为数据集里的一部分数据(0.0-0.3)以某个线性模型,而另一部分数据(0.3-1.0)则以另一个线性模型建模,因此就被称为分段线性模型。

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

下面利用树生成算法对数据进行切分,且每份切分数据都很容易被线性模型所表示。该算法的关键在于误差的计算。

模型树的叶节点生成函数:

python 复制代码
def linearSolve(dataSet):
    m,n=shape(dataSet)
    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。X和Y用于执行简单的线性回归。另外在这个函数中也应当注意,如果矩阵的逆不存在也会造成程序异常。

第二个函数modelLeaf(),当数据不再需要切分的时候它负责生成叶节点的模型。该函数在数据集上调用linearSolve()并返回回归系数ws。

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

运行:

python 复制代码
mymat2=mat(loadDataSet('test/exp2.txt'))
print(createTree(mymat2,modelLeaf,modelErr))

可以看到,代码以0.285477为分界创建了两个模型。而数据实际在0.3处分段。

createTree()生成的这两个线性模型分别是y=3.468+1.1852x和y=0.0016985+11.96477x,与用于生成该数据的真实模型非常接近。该数据实际是用模型y=3.5+1.0x和y=0+12x再加上高斯噪声生成的。

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

相关推荐
策案案案1 分钟前
YOLO: 将AI Agents嵌入到IntelliJ IDEA
java·大数据·人工智能·笔记·yolo·microsoft·intellij-idea
思录Echo2 分钟前
自助易AI数字人外挂技术剖析|如何解决政企智能客服的多端适配难题?
人工智能·华为·harmonyos
IT_陈寒14 分钟前
Python的切片赋值把我坑惨了,这不是bug是特性
前端·人工智能·后端
掘金酱17 分钟前
【社区公告】致每一位掘友:关于这次调整, 想再说几句
前端·人工智能
半个落月18 分钟前
别再让 AI 一上来就写代码:用 SDD 规划 Chrome 翻译插件
人工智能
CoderLiu18 分钟前
程序化工具调用(PTC)与动态工作流引擎:深入大模型工具调用的架构演进与实践
前端·人工智能·后端
m0_3807438722 分钟前
给 OpenAI API 调用加上模型切换:GPT-5.1 和 Codex 的配置实践
人工智能·python·gpt
超级架构师27 分钟前
先在“可能世界”中测试自治系统:PEIRAVELA 的实验控制平面
人工智能·架构·ai编程
a1879272183128 分钟前
【算法】动态规划第四篇:背包收官——min 哨兵、计数世界与组合排列分水岭
算法·leetcode·动态规划·dp·01背包·算法讲解·决策合并