机器学习笔记十二:分类与回归树CART

2023-10-30

更新时间:2017.11.18
简化语言,更加通俗

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

Ⅲ.实现

实现部分采用的数据集是机器学习实战中的数据集.代码则是按照自己的理解重新改写了一遍.

读取数据模块:data.py

import numpy as np
def loadData(filename):
    dataSet=np.loadtxt(fname=filename,dtype=np.float32)
    return dataSet

用numpy内置的读取txt文件的函数就行,方便快捷.这里就不多讲了.

CART核心模块:CART.py

import numpy as np
import matplotlib.pyplot as plt

#split dataSet trough featureIndex and value
def splitDataSet(dataset,featureIndex,value):
    subDataSet0=dataset[dataset[:,featureIndex]<=value,:]
    subDataSet1=dataset[dataset[:,featureIndex]>value,:]
    return subDataSet0,subDataSet1

#compute the regression Error in a data Set
def getError(dataSet):
    error=np.var(dataSet[:,-1])*dataSet.shape[0]
    return error

#choose the best featureIndex and value in dataSet
def chooseBestSplit(dataSet,leastErrorDescent,leastNumOfSplit):
    rows,cols=np.shape(dataSet)

    #error in dataSet
    Error=getError(dataSet)

    #init some important value we want get
    bestError=np.inf
    bestFeatureIndex=0
    bestValue=0

    #search process
    #every feature index
    for featureIndex in range(cols-1):
        #every value in dataSet of specific index
        for value in set(dataSet[:,featureIndex]):
            subDataSet0,subDataSet1=splitDataSet(dataSet,featureIndex,value)
            #print("sub0",subDataSet0.shape[0])
            #print("sub1", subDataSet1.shape[0])

          #  print(subDataSet0)
            if (subDataSet0.shape[0]<leastNumOfSplit) or (subDataSet1.shape[0]<leastNumOfSplit):
                continue
            #compute error
            tempError=getError(subDataSet0)+getError(subDataSet1)
            #print("tempError:",tempError)
            if tempError<bestError:
                bestError=tempError
                bestFeatureIndex=featureIndex
                bestValue=value

           # print("BestError:", bestError)
           # print("BestIndex:", bestFeatureIndex)
           # print("BestValue:", bestValue)
    if Error-bestError<leastErrorDescent:
        return None,np.mean(dataSet[:,-1])
    mat0,mat1=splitDataSet(dataSet,bestFeatureIndex,bestValue)
    if (mat0.shape[0]<leastNumOfSplit) or (mat1.shape[0]<leastNumOfSplit):
        return None,np.mean(dataSet[:,-1])

    return bestFeatureIndex,bestValue


#build tree
def buildTree(dataSet,leastErrorDescent=1,leastNumOfSplit=4):
    bestFeatureIndex,bestValue=chooseBestSplit(dataSet,leastErrorDescent,leastNumOfSplit)

    #recursion termination
    if bestFeatureIndex==None:
        return bestValue

    Tree={}
    Tree["featureIndex"]=bestFeatureIndex
    Tree["value"]=bestValue
    #get subset
    leftSet,rightSet=splitDataSet(dataSet,bestFeatureIndex,bestValue)

    #recursive function
    Tree["left"]=buildTree(leftSet,leastErrorDescent,leastNumOfSplit)
    Tree["right"] = buildTree(rightSet, leastErrorDescent, leastNumOfSplit)

    return Tree

def isTree(tree):
    return (type(tree).__name__=='dict')


def predict(tree,x):
    if x[tree["featureIndex"]]<tree["value"]:
        if isTree(tree["left"]):
            return predict(tree["left"],x)
        else:
            return tree["left"]

    else:
        if isTree(tree["right"]):
            return predict(tree["right"],x)
        else:
            return tree["right"]

这里一个一个来讲这些函数.
splitDataSet(dataset,featureIndex,value)
在理论部分已经讲到,我们要划分数据集,只需要两个值,一个就是特征,另外就是指定的阈值.
这个函数的作用就是通过传入的特征和阈值,把数据集划分为两部分.理论部分例子的图就可以形象展示这个函数的作用.

getError(dataSet)
这个函数是用来得到误差的.说是误差,倒不如说是方差.因为理论部分已经给出了式子,其中的c是可以用平均值来替代的,也就是是,刚好是数据集上面的总的方差.

chooseBestSplit(dataSet,leastErrorDescent,leastNumOfSplit)
顾名思义,就是找最好的划分罗.
leastErrorDescent这个参数表示最小的下降误差,也就是说要是在某一刻,误差的下降小于这个值,函数就会退出,leastNumOfSplit表示最小的划分数量.当要划分的集合元素小于这个阈值时候,被认为是没有什么划分的意义了,函数也不会再运行.
然后函数遍历数据集上面所有的特征,与特征上面的所有值,以找到最好的特征索引和划分点返回.

测试文件:run.py

import numpy as np
import data
import CART

dataMat1=data.loadData("../data/ex00.txt")
dataMat2=data.loadData("../data/ex0.txt")

'''
print(dataMat.shape)
print(np.shape(dataMat))
e=CART.getError(dataMat)
print(e)
print(CART.getError(mat0))
print(CART.getError(mat1))

mat0,mat1=CART.splitDataSet(dataMat,0,0.5)
print(mat0)
print(mat1)
print(mat0.shape)
'''



#bestIndex,bestValue=CART.chooseBestSplit(dataMat)
#print(bestIndex,bestValue)

#tree1
tree1=CART.buildTree(dataMat1)
print(tree1)

#tree2
tree2=CART.buildTree(dataMat2)
print(tree2)

x=[1.0,0.559009]
print(CART.predict(tree2,x))

用来测试CART回归的运行代码.

import numpy as np
import data
import CART

dataMat1=data.loadData("../data/ex00.txt")
dataMat2=data.loadData("../data/ex0.txt")

'''
print(dataMat.shape)
print(np.shape(dataMat))
e=CART.getError(dataMat)
print(e)
print(CART.getError(mat0))
print(CART.getError(mat1))

mat0,mat1=CART.splitDataSet(dataMat,0,0.5)
print(mat0)
print(mat1)
print(mat0.shape)
'''



#bestIndex,bestValue=CART.chooseBestSplit(dataMat)
#print(bestIndex,bestValue)

#tree1
tree1=CART.buildTree(dataMat1)
print(tree1)

#tree2
tree2=CART.buildTree(dataMat2)
print(tree2)

x=[1.0,0.559009]
print(CART.predict(tree2,x))

结果:
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习笔记十二:分类与回归树CART 的相关文章

随机推荐

  • 耗时一个月,React 知识点万字大总结(超全超基础)

    文章目录 React特点 React 与 Vue 对比 React 与 Angular 对比 JSX语法 state状态 props属性 refs 属性 事件处理 render函数 虚拟DOM 生命周期 脚手架工具 Redux React
  • OpenWrt系统内核设置

    系统内核设置 OpenWrt也是一个 Linux 操作系统 因此它和其他Linux 操作系统一样 可以通过一些配置文件配置 一 etc sysctl conf 配置文件 这个文件是系统启动预加载的内核配置文件 通过sysctl命令读取和设置
  • Fiddler使用技巧(过滤器、解决乱码)

    1 过滤器的使用 1 过滤只展现需要的域名请求 验收抓包效果 2 过去不需要的请求 如下图的正则表达式过滤js css google等等 REGEX js css google ico jpg png favicon mongodb 2 抓
  • platform平台总线

    目录 1 平台总线下管理的2员大将 2 平台总线体系的工作流程 platform本身注册 分析platform设备和驱动的注册过程 platdata probe函数的功能和意义 match函数的调用轨迹 相对于usb pci i2c等物理总
  • 2021-09-01 学习笔记:Python爬虫、数据可视化

    2021 09 01 学习笔记 Python爬虫 数据可视化 结于2021 09 07 内容来自 成都工业大学 数字媒体专业实训 主要内容 PyCharm开发Python脚本的基础配置 Python爬虫基础 正则匹配 re 网页获取 url
  • java 计算百分比

    计算百分比 public static String xx int x int y DecimalFormat df new DecimalFormat 0 可以设置精确几位小数 df setMaximumFractionDigits 0
  • HCIE云计算之FC升级实战操作

    HCIE云计算之FC升级实战操作 一 登录FC6 5 1的VRM管理界面 二 安装升级工具 1 安装完成后自动打开web 2 更改密码登录 三 新建工程 四 选择升级项目 五 VRM参数校验 六 更新包校验 七 VRM升级全流程 1 查看已
  • solr 6.1.0 的配置及简单使用

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 第一部分 配置部分 jdk 1 8 solr 6 1 0 php扩展 2 4 0 jdk路径 usr local solr php路径 usr local php 5 6
  • docker alpine镜像中遇到 not found

    1 问题 docker alpine镜像中遇到 sh xxx not found 例如 monerod 注 此可执行文件已放到 usr local bin sh monerod not found 2 原因 由于alpine镜像使用的是mu
  • Tomcat的简单使用

    目录 1 Tomcat 是什么 2 下载安装 3 启动Tomcat 4 部署静态页面 4 1 部署单个 HTML 4 2 部署 HTML 到单独的目录中 5 tomcat 运行和 直接 html 运行区别 1 Tomcat 是什么 Tomc
  • CppCheck代码静态检测工具

    文章目录 一 简述 二 安装 二 使用 2 1 第一个测试程序 2 2 检查文件夹中所有文件 2 3 检查部分或过滤部分文件 三 严重性 四 其他常用用法 4 1 启用其他检查 4 2 保存结果到文件 4 3 多线程检查 4 3 设置目标平
  • laravel 发布资源失败

    Unable to locate publishable resources Publishing complete php artisan vendor publish 列出所有后选择数字发布
  • Spring Boot Maven项目使用SystemPath引用第三方平台遇到的大坑

    本次与算法厂家对接 使用了他们的Jar包 最先考虑的是不使用Maven仓库 便于离线开发 首先采用了方案
  • 推荐系统介绍

    课程内容 推荐系统在电子商务领域得到普遍的运用 推荐系统本质上是销售系统的一部分 在便利店 推荐系统是导购牌 类目货架 是老板娘 在超市 推荐系统是导购牌 类目货架 是销售员 在电商 推荐系统是什么 不管是在便利店 还是超市 或者电商网站
  • 【数学建模美赛】2023数模美赛备赛指南

    二月中旬要开始美赛了 应该是准备考研这一年的唯一一次正规比赛了 希望能好好完成 在博客边分享边准备 打算开一个新坑 好好准备一下 文章目录 报名事项 赛题特点 六道赛题特点 A B C D E F 竞赛攻略 报名事项 官方网站 美赛官网 h
  • 群晖docker安装chrome

    在docker中下载oldiy chrome novnc 启动这个映像 安装完成后 启动容器 如果路由器wan口是公网ip 可以在路由器上添加5900和8083的端口映射 会更方便访问 如果没有那就可以用群晖的quickconnect 假如
  • 利用Docker 搭建 upload-labs 靶场

    Docker 搭建 upload labs 靶场 靶场搭建 获取upload labs镜像 docker search upload labs 然后下载镜像 命令 docker pull c0ny1 upload labs 如下图即为下载成
  • 样式设置 /deep/

    样式设置scoped属性带来的问题 通常我们在写样式的时候会在style标签中加上scoped属性 相信这个属性的作用大家都很清楚 Scoped CSS规范是Web组件产生不污染其他组件 也不被其他组件污染的CSS规范 但是这样有时候也会遇
  • Python爬虫从入门到精通:(34)大文件下载_Python涛哥

    还记得我们之前爬取的校花网图片吗 课程地址 爬取校花网中的图片数据 这节课我们利用scrapy的大文件下载 来下载校花网图片 http www 521609 com daxuexiaohua 创建工程 我们先来创建一个工程imgPro 创建
  • 机器学习笔记十二:分类与回归树CART

    更新时间 2017 11 18 简化语言 更加通俗 实现 实现部分采用的数据集是机器学习实战中的数据集 代码则是按照自己的理解重新改写了一遍 读取数据模块 data py import numpy as np def loadData fi