【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是目标变量的实际值。

相关推荐
做萤石二次开发的哈哈4 小时前
连锁门店、园区、交通枢纽的视频如何统一汇集?应用模板的接入与分权管理详解
人工智能·物联网·音视频·二次开发·视频监控·蓝海aiot一站式工作台·萤石云开放平台
高级程序源4 小时前
django校园寻物通失物招领平台32261-计算机课程设计、毕业设计
vue.js·python·mysql·小程序·django·flask·课程设计
老金带你玩AI4 小时前
全程拿着手机,我让dot准备了一场AI分享
人工智能
WeiXin_DZbishe4 小时前
基于springboot宠物领养系统-计算机毕设 附源码【课程设计】94217
vue.js·spring boot·python·django·php·课程设计
nvd114 小时前
Flink 批处理驱动的湖仓 AI 财务研报流水线:从双流广播汇聚到 Agent 智能决策与原生 Iceberg 落盘全景实战
大数据·人工智能·flink
码爸4 小时前
线性回归算法
算法·机器学习·线性回归
kimnoic5 小时前
Python数据库学习心得:SQLite、MySQL、PostgreSQL优缺点
开发语言·python
snhna5 小时前
向量数据库深度实战:从 HNSW 到 pgvector、Milvus 选型与 RAG 落地
数据库·人工智能·python·postgresql·milvus
架构技术专栏5 小时前
Agent 工具调用:从工具声明到执行反馈
前端·人工智能·后端
Coder-magician5 小时前
《代码随想录》刷题打卡day51:图论-part09(dijistra堆优化,Bellman_ford算法)
算法·图论