《机器学习实战》学习笔记第九章-树回归

本文详细介绍了树回归的概念,包括CART算法的使用、树剪枝(预剪枝和后剪枝)以及模型树的构建。通过对数据集的分析,展示了树回归与标准回归和线性回归的比较,强调了模型树在某些场景下的优势。最后,探讨了使用Tkinter库构建GUI在机器学习中的重要性,以便于用户更好地理解和交互数据。
摘要由CSDN通过智能技术生成

树回归简介

第三章使用决策树进行分类,其不断将数据切分为小数据,直到目标变量完全相同,或者数据不能再分为止,决策树是一种贪心算法,要在给定的时间内做出最佳选择,但并不关心能否达到全局最优。这种树构建算法是ID3,每次选取当前最佳的特征来分割数据,并按照该特征的所有可能值来切分。一旦按某特征切分后,该特征在之后的算法中将不会再起作用,所以有观点认为这种切分方式过于迅速。

另外一种方法是二元切分法,即每次把数据集切成2份,如果数据的某特征值等于切分所要求的值,那么这些数据就进入树的左子树,反之则进入右子树。

第八章的回归是一种全局回归模型,它设定了一个模型,不管是线性还是非线性的模型,然后拟合数据得到参数,现实中会有些数据很复杂,肉眼几乎看不出符合那种模型,因此构建全局的模型就有点不合适。这节介绍的树回归就是为了解决这类问题,它通过构建决策节点把数据数据切分成区域,然后局部区域进行回归拟合。

CART算法使用二元切分来处理连续型变量

优点:可以对复杂和非线性的数据建模

缺点:结果不易理解

一般流程

收集数据:任意方法

准备数据:采用数值型的数据,标称型的数据应该映射成二值型数据

分析数据:绘出数据的二维可视化显示结果,以字典方式生成树

训练算法:大部分时间都花费在叶节点树模型的构建上

测试算法:使用测试数据上的R**2值来分析模型的结果

使用算法:使用训练出的树做预测,还可以做很多其他事情

CART算法代码

import numpy as np

def loadDataSet(fileName):   
    dataMat = []
    fr = open(fileName)
    for line in fr.readlines():
        curLine = line.strip().split('\t')
        fltLine = list(map(float, curLine))   
        dataMat.append(fltLine)
    return dataMat
#将数据集分成两个
def binSplitDataSet(dataSet, feature, value):
    # np.nonzero(a),返回数组a中非零元素的索引值数组
    # np.nonzero(dataSet[:, feature] > value)[0]=1,
    # 下面一行代码表示mat0=dataSet[1,:]即第一行所有列
    mat0 = dataSet[np.nonzero(dataSet[:, feature] > value)[0], :]
    mat1 = dataSet[np.nonzero(dataSet[:, feature] <= value)[0], :]
    return mat0, mat1

def regLeaf(dataSet):#生成叶结点
    return np.mean(dataSet[:,-1])# 目标变量的均值

def regErr(dataSet):
    return np.var(dataSet[:,-1]) * np.shape(dataSet)[0]#目标变量的总方差

#找到数据集切分的最佳位置,生成相应的叶节点
def chooseBestSplit(dataSet, leafType = regLeaf, errType = regErr, ops = (1,4)):
    """
        dataSet - 数据集合
        leafType - 生成叶结点
        regErr - 误差估计函数
        ops - 用户定义的参数构成的元组
    Returns:
        bestIndex - 最佳切分特征
        bestValue - 最佳特征值
    """
    #tolS允许的误差下降值,tolN切分的最少样本数
    tolS = ops[0]; tolN = ops[1]
    #如果当前所有值相等,则退出。(根据set的特性)
    if len(set(dataSet[:,-1].T.tolist()[0])) == 1: #tolist()[0]变为矩阵,set()创建集合
        return None, leafType(dataSet)
    #统计数据集合的行m和列n
    m, n = np.shape(dataSet)
    #默认最后一个特征为最佳切分特征,计算其误差估计
    S = errType(dataSet)
    #分别为最佳误差,最佳特征切分的索引值,最佳特征值
    bestS = float('inf'); bestIndex = 0; bestValue = 0
    #遍历所有特征列
    for featIndex in range(n - 1):
        #遍历所有特征值
        for splitVal in set(dataSet[:,featIndex].T.A.tolist()[0]):
            #根据特征和特征值切分数据集
            mat0, mat1 = binSplitDataSet(dataSet, featIndex, splitVal)
            #如果数据少于tolN,则退出
            if (np.shape(mat0)[0] < tolN) or (np.shape(mat1)[0] < tolN): continue
            #计算误差估计
            newS = errType(mat0) + errType(mat1)
            #如果误差估计更小,则更新特征索引值和特征值
            if newS < bestS:
                bestIndex = featIndex
                bestValue = splitVal
                bestS = newS
    #如果误差减少不大则退出
    if (S - bestS) < tolS:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值