首页 > 编程语言 >【Python机器学习】利用AdaBoost元算法提高分类性能——基于单层决策树构建弱分类器

【Python机器学习】利用AdaBoost元算法提高分类性能——基于单层决策树构建弱分类器

时间:2024-08-08 16:23:55浏览次数:9  
标签:dataMatrix 1.0 Python 分类器 AdaBoost 决策树 errArr 单层

单层决策树(也称决策树桩)是一种简单的决策树。它基于单个特征来做决策,由于这棵树只有一次分裂过程,因此它实际上就是一个树桩。

在构造AdaBoost代码时,首先通过一个简单数据集来确保在算法上一切就绪:

from numpy import *

def loadSimpData():
    datMat=matrix([[1.0,2.1],
                   [2.0,1.1],
                   [1.3,1.0],
                   [1.0,1.0],
                   [2.0,1.0]])
    classLabels=[1.0,1.0,-1.0,-1.0,1.0]
    return datMat,classLabels

下图为数据集的示意图:

如果要试着从某个坐标轴上选择一个值(即选择一条与坐标轴平行的直线)来将所有的圆点与方形点分开,显然是不可能的。这就是单层决策树难以处理的一个著名问题。通过多颗单层决策树,就可以构建出一个能够对该数据集完全正确分类的分类器。

构建单层决策树的伪代码:

将最小错误率minError设为正无穷

对数据集中的每一个特征(第一层循环):

    对每个步长(第二层循环):

        对每个不等号(第三层循环):

            建立一棵单层决策树并利用加权数据集对它进行测试

            如果错误率低于minError,则将当前单层决策树设为最佳单层决策树

返回最佳单层决策树

接下来为实际代码:

#通过阈值对比对数据进行分类
#所有在阈值一边的数据会分到类别-1,另一边的数据分到类别+1
#可以通过数组过滤来实现,首先将返回数组的全部元素设置为1,然后将所有不满足不等式要求的元素设置为-1
def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):
    retArray=ones((shape(dataMatrix)[0,1]))
    if threshIneq=='lt':
        retArray[dataMatrix[:,dimen] <= threshVal] = -1.0
    else:
        retArray[dataMatrix[:, dimen] > threshVal] = -1.0
    return retArray

#遍历stumpClassify()函数所有的可能输入值,并找到数据集上最佳的单层决策树
#这里的“最佳”是基于数据的权重向量D来定义的。
def builsStump(dataArr,classLabels,D):
    dataMatrix=mat(dataArr)
    labelMat=mat(classLabels).T
    m,n=shape(dataMatrix)
    numSteps=10.0
    bestStump={}
    bestClassEst=mat(zeros((m,1)))
    minError=inf
    for i in range(n):
        rangeMin=dataMatrix[:,i].min()
        rangeMax=dataMatrix[:,i].max()
        stepSize=(rangeMax-rangeMin)/numSteps
        for j in range(-1,int(numSteps)+1):
            for inequal in ['lt','gt']:
                threshVal=(rangeMin+float(j)*stepSize)
                predictedVals=stumpClassify(dataMatrix,i,threshVal,inequal)
                errArr=mat(ones((m,1)))
                errArr[predictedVals==labelMat]=0
                #计算加权错误率
                weightedError=D.T*errArr
                if weightedError<minError:
                    minError=weightedError
                    bestClassEst=predictedVals.copy()
                    bestStump['dim']=i
                    bestStump['thresh']=threshVal
                    bestStump['ineq']=inequal
    return bestStump,minError,bestClassEst

函数builsStump()将会遍历stumpClassify()函数所有的可能输入值,并找到数据集上最佳的单层决策树。这里的“最佳”是基于数据的权重向量D来定义的。在确保输入数据符合矩阵格式之后,整个函数开始执行。然后,函数将构建一个称为bestStump的空字典,用于存储给定权重向量D时所得到的最佳单层决策树的相关信息。遍历numSteps用于在特征的所有可能值上进行遍历。而变量minError则在一开始就初始化为正无穷大,之后用于寻找可能的最小错误率。

三层嵌套的for循环是程序的最主要部分。第一层for循环在数据集的所有特征上遍历。考虑到数值型的特征,我们就可以通过计算最小值和最大值来了解应该需要多大的步长。第二次for循环再在这些值上进行遍历。甚至将阈值设置为整个取值范围之外也是可以的。因此,在取值范围之外还应该有两个额外的步骤。最后一个for循环则是在大于和小于之间切换不等式。

在嵌套的三层for循环之内,我们在数据集及三个循环变量上调用stumpClassify()函数。基于这些循环变量,该函数将会返回分类预测结果。接下来构建一个列向量errArr,如果predictedVals中的值不等于labelMat中的真正类别标签值,那么errArr的相应位置为1。将错误向量errArr和权重向量D的相应元素相乘并求和,就得到了数值weightedError。这就是AdaBoost和分类器交互的地方。这里,我们是基于权重向量D而不是其他错误计算指标来评价分类器的。如果需要使用其他分类器的话,就需要考虑D上最佳分类器所定义的计算过程。

程序接下来输出所有值。最后,将当前的凑无虑与已有的最小错误率进行对比,如果当前的值较小,那么就在词典bestStump中保存该单层决策树。字典、错误率和类别估计值都会返回给AdaBoost算法。

实际运行:

dataMat,classLabels=loadSimpData()
D=mat(ones((5,1))/5)
print(builsStump(dataMat,classLabels,D))

上述单层决策树的生成函数是决策树的一个简化版本,它就是所谓的弱学习器,即弱分类算法。

标签:dataMatrix,1.0,Python,分类器,AdaBoost,决策树,errArr,单层
From: https://blog.csdn.net/weixin_39407597/article/details/140925278

相关文章

  • python代码混淆与编译
    python代码混淆、编译与打包考虑到生产环境部署,而python作为解释性语言,对源码没有任何保护。此文记录探索如何保护源码的过程。代码混淆代码混淆基本上就是把代码编译为字节码。工具有两种:py_compilepyarmorpy_compile示例:py_compile.compile(src_pyfile,dst_pyfile......
  • 在python中将二维数组转换为彩色图像
    我有像这样的2d整数列表:list1=[[1,30,50],[21,45,9],[97,321,100]]下一步我要将其转换为numpy数组:myarr=np.asarray(list1)下一步我将使用PIL将其转换为图像,如下所示:img=Image.fromarray(myarr,"I")img.save("my.png")问题是我不想要灰......
  • Python 汉字区位码、字符串 相互转换
    Python汉字区位码、字符串相互转换区位码简介GB2312所有字符放在一张94x94的矩阵中,矩阵中的每个位置对应一个字符(有的位置是空的,没有字符)。区位码为十进制四位数,前后两位分别代表该字符在矩阵中的行、列坐标(均从1算起),如4528“图”字,为45行、28列上的字符。能通过对区位码进......
  • python3如何使用‘pexpect’自动与串口交互?
    如何在Windows中使用python'pexpect'自动与串口(例如:COM3)交互并在开机时通过串口登录嵌入式开发板时输入用户密码?ser=serial.Serial(port=serial_port,baudrate=baudrate,bytesize=bytesize,parity=parity,stopbits=stopbits,timeout=timeout)channel=pexpect.fdpexp......
  • Python 熊猫迭代
    代码:#Importcarsdataimportpandasaspdcars=pd.read_csv('cars.csv',index_col=0)#Adaptforloopforlab,rowincars.iterrows():print(f"{[lab]}:{row['cars_per_cap']}")输出:['US']:809['A......
  • 【第九节】python中xml解析和json编解码
    目录一、PythonXML解析1.1什么是XML1.2Python对XML的解析方法1.3SAX解析xml1.4xml.dom解析xml1.6ElementTree解析XML二、Python编解码json2.1什么是json2.2使用json库2.3使用第三方库Demjson一、PythonXML解析1.1什么是XML        XML,......
  • 从 python 设置运算符符号到方法名称的映射是什么?它们与文档不匹配
    我创建了自己的Customset类,它实现了python集合的几乎所有方法。当我使用此自定义集的实例时,许多集合运算符都会失败。它们会失败,并显示类似以下内容的内容:TypeError:unsupportedoperandtype(s)for-:'Customset'andCustomset'orTypeError:'<='......
  • 21.python函数(return)
    return一、return语句1、return是指定一个返回值2、在python中创建一个函数,可以用return语句指定返回的的值,这个返回值可以是任意的类型3、return语句在同一个函数中可以出现多次,但是只有有一个得到执行,就会直接结束函数的执行。return后面的语句不执行了4、return的格式re......
  • 【Python代码】如何根据出生日期计算出年龄?
    哈喽,大家好,木易巷来啦!假设我们有一个包含出生日期的Excel文件,需要计算每个人的年龄,你会怎么做呢?具体情况如下图:今天木易巷分享通过Python及其强大的pandas库,来实现从Excel文件中读取日期数据,计算年龄,并将结果存储回Excel文件中的过程。话不多说,开干!▍1、环境准备在开......
  • python 无法解密重音字符(如 è),我该怎么办?
    我正在解决这个ctf,您必须使用PyCryptodome模块通过DES加密消息。消息是“Launghezzadiquestafrasenonèdivisibileper8”(意大利语)。我无法将此消息转换为字节,因为重音字符不包含在utf-8中(我认为这就是解释)。有人可以帮我加密消息吗?fromCrypto.Util.Paddingimp......