首页 > 编程语言 >基于Python的机器学习系列(18):梯度提升分类(Gradient Boosting Classification)

基于Python的机器学习系列(18):梯度提升分类(Gradient Boosting Classification)

时间:2024-09-01 09:57:12浏览次数:7  
标签:Classification Python 梯度 self 分类 models yhat Boosting 模型

简介

        梯度提升(Gradient Boosting)是一种集成学习方法,通过逐步添加新的预测器来改进模型。在回归问题中,我们使用梯度来最小化残差。在分类问题中,我们可以利用梯度提升来进行二分类或多分类任务。与回归不同,分类问题需要使用如softmax这样的概率模型来处理类别标签。

梯度提升分类的工作原理

        梯度提升分类的基本步骤与回归类似,但在分类任务中,我们使用概率模型来处理预测结果:

  1. 初始化模型:选择一个初始预测器,这里使用DummyClassifier来作为第一个模型。
  2. 计算梯度:计算每个样本的梯度,梯度是当前预测值与真实标签之间的差异。
  3. 训练新预测器:用计算得到的梯度作为目标,训练一个新的分类器。
  4. 更新模型:将新预测器的结果加到现有模型中。
  5. 重复步骤:重复上述步骤,逐步添加更多的预测器以改进模型的分类能力。

二分类示例

        在二分类任务中,梯度提升分类器的工作流程如下:

  1. 预测概率:通过softmax将预测值转换为概率。
  2. 更新模型:利用当前的梯度来训练下一个分类器。

代码示例

        下面的代码示例展示了如何实现一个梯度提升分类器,包括支持二分类和多分类任务:

from sklearn.tree import DecisionTreeRegressor
from sklearn.dummy import DummyRegressor, DummyClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits, load_breast_cancer
import numpy as np

class GradientBoosting:
    def __init__(self, S=5, learning_rate=1, max_depth=1, 
                 min_samples_split=2, regression=True, tol=1e-4):
        self.S = S
        self.learning_rate = learning_rate
        self.max_depth = max_depth
        self.min_samples_split = min_samples_split
        self.regression = regression

        # 初始化回归树
        tree_params = {'max_depth': self.max_depth, 'min_samples_split': self.min_samples_split}
        self.models = [DecisionTreeRegressor(**tree_params) for _ in range(S)]
        
        if regression:
            # 回归模型的初始模型
            self.models.insert(0, DummyRegressor(strategy='mean'))
        else:
            # 分类模型的初始模型
            self.models.insert(0, DummyClassifier(strategy='most_frequent'))

    def grad(self, y, h):
        return y - h

    def fit(self, X, y):
        # 训练第一个模型
        self.models[0].fit(X, y)
        
        for i in range(self.S):
            # 预测
            yhat = self.predict(X, self.models[:i+1], with_argmax=False)
            # 计算梯度
            gradient = self.grad(y, yhat)
            # 训练下一个模型
            self.models[i+1].fit(X, gradient)

    def predict(self, X, models=None, with_argmax=True):
        if models is None:
            models = self.models
        h0 = models[0].predict(X)
        boosting = sum(self.learning_rate * model.predict(X) for model in models[1:])
        yhat = h0 + boosting
        if not self.regression:
            # 使用softmax转换为概率
            yhat = np.exp(yhat) / np.sum(np.exp(yhat), axis=1, keepdims=True)
            if with_argmax:
                yhat = np.argmax(yhat, axis=1)
        return yhat

# 示例:使用乳腺癌数据集进行二分类
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建和训练梯度提升分类器
gb = GradientBoosting(S=50, learning_rate=0.1, regression=False)
gb.fit(X_train, y_train)

# 预测并计算准确率
y_pred = gb.predict(X_test)
from sklearn.metrics import accuracy_score
print(f'Accuracy: {accuracy_score(y_test, y_pred)}')

总结

        梯度提升分类器通过逐步减少分类错误来提高模型的性能。这种方法在处理分类任务时,能够有效提高预测准确率。与回归任务类似,分类任务中的梯度提升也能通过逐步添加预测器来优化模型。通过调整学习率和模型参数,我们可以进一步提高模型的表现。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

标签:Classification,Python,梯度,self,分类,models,yhat,Boosting,模型
From: https://blog.csdn.net/ljd939952281/article/details/141691344

相关文章

  • 基于Python的机器学习系列(19):K均值聚类(K-Means Clustering)
    简介        K均值聚类(K-MeansClustering)是一种常用的无监督学习算法,用于将数据样本划分为若干个“簇”,使得同一簇内的数据点彼此相似,而不同簇的数据点之间差异较大。由于K均值不依赖于标签,因此它是一种无监督学习方法。常见的应用包括客户细分、图像分割和数据可视......
  • 基于Python的机器学习系列(14):随机森林(Random Forests)
    简介        在上一节中,我们探讨了Bagging方法,并了解到通过构建多个树模型来减少方差是有效的。然而,Bagging方法中树与树之间仍然可能存在一定的相关性,降低了方差减少的效果。为了解决这个问题,我们引入了随机森林(RandomForests),这是一种基于Bagging的增强技术,通过在每......
  • 网络自动化:利用Python和Ansible实现网络配置管理
    利用Python和Ansible实现网络配置管理是现代网络自动化中的一个关键领域。这个组合使得可以更有效地管理网络设备、减少人为错误、提高网络的可扩展性和一致性。以下是如何利用Python和Ansible实现网络配置管理的详细指南:一、使用Python进行网络自动化Python提......
  • 基于Python的医疗诊断系统 基于Falsk的医院挂号系统 (附源码 LW PPT 包调试)
    博主介绍:✌专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、机器学习等设计与开发。主要内容:免费功能设计、开题报告、任务书、中期......
  • python学习之路 - PySpark快速入门
    目录一、PySpark实战1、前言介绍2、基础准备a、pySpark库的安装b、构建pySpark执行环境入口对象c、pySpark编程模型3、数据输入a、python数据容器转RDD对象b、读取文件内容转RDD对象4、数据计算a、map算子b、flatMap算子c、reduceByKey算子d、综合案例e、filter算子f......
  • Python入门
    #1.输出:Python是一种跨平台、开源、免费的高级编程语言。print("Python是一种跨平台、开源、免费的高级编程语言。")foriinrange(1,10):print(str(i)*i)foriinrange(1,10):j=1whilej<=i:print("*",end='')j+=1print()......
  • 基于Python的顾客购物数据可视化分析
    数据可视化分析实验数据集简介        本文在实验中考虑到实验使用设备的性能和环境的局限性,采用了kaggle官网上的的消费者购物数据集,数据地址:https://www.kaggle.com/datasets/iamsouravbanerjee/customer-shopping-trends-dataset。此数据包含了3900条记录,每条......
  • # yyds干货盘点 # 盘点一个Python正则表达式问题
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【大锤子】问了一个Python正则表达式处理的问题,这里拿出来给大家分享下。下图是代码:二、实现过程这个问题确看上去是正则表达式的问题,这里【杯酒】提出问题并给出建议:使用+号,就能匹配所有符合条件的文字,而不是第一段。不过后......
  • python和c语言有什么不同
    1、语言类型Python是一种基于解释器的语言,解释器会逐行读取代码;首先将Python编译为字节码,然后由大型C程序解释。C是一种编译语言,完整的源代码将直接编译为机器代码,由CPU直接执行。2、内存管理Python使用自动垃圾收集器进行内存管理。在C语言中,程序员必须自己进行内存管......
  • python浮点数怎么写
    python提供了三种浮点值:内置的float与complex类型,以及标准库的decimal.Decimal类型。float类型存放双精度的浮点数,具体取值范围依赖于构建python的c编译器,由于精度受限,进行相等性比较不可靠。如果需要高精度,可使用decimal模块的decimal.Decimal,这种类型可以准确的表示循环......