【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 分钟前
LeekCode第3767题选择K个任务的最大总分:详细思考过程幽默解析 专门为小白准备
算法·leetcode·贪心算法·编程·小白专用教程
KG_LLM图谱增强大模型2 分钟前
AgentRxiv:迈向协作式自主科学研究新范式
人工智能·知识图谱
人工智能培训6 分钟前
超级人工智能(AGI)是否是大模型的必然发展方向?
人工智能·深度学习·逻辑回归·agi·具身智能·大模型应用工程师·企业ai培训
小白菜又菜10 分钟前
Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
python·算法·leetcode
Omigeq12 分钟前
1.2.2 - 采样搜索算法(以RRT和RRT*为例) - Python运动规划库教程(Python Motion Planning)
开发语言·人工智能·python·机器人
凌云拓界15 分钟前
TypeWell全攻略(二):热力图渲染引擎,让键盘发光
前端·后端·python·计算机外设·交互·pyqt·数据可视化
mantch17 分钟前
教程:Nano-Banana Pro,谷歌官方指南
人工智能·aigc
We་ct19 分钟前
LeetCode 222. 完全二叉树的节点个数:两种解法详解(BFS + 二分查找优化)
数据结构·算法·leetcode·typescript
小白菜又菜20 分钟前
Leetcode 234. Palindrome Linked List
python·算法·leetcode