机器学习 - [集成学习]Bagging算法的编程实现

简介: 机器学习 - [集成学习]Bagging算法的编程实现

机器学习 - [集成学习]
Bagging算法的编程实现


【导读】本文主要介绍如何实现Bagging算法,作为一种集成算法我们假设其基分类器已经写好。本文代码中,直接使用sklearn中的决策树分类器等基分类器。


1. 回顾知识点

从训练集中均匀随机有放回地采样不同的子集且训练不同的基础模型

给定集合 D

通过从D中均匀随机的有放回采样m个样本构建 Di

(drawn with replacement, 取出放回, 有放回采样)

希望 Di 会 遗漏掉 D 中的某些样本

步骤:

  • 每轮随机抽出一个训练集(漏掉一些样本)
  • 通过这些样本训练一个子分类器(只用同一种弱学习器为基分类器)
  • 一共T(参数)轮
  • 等权重投票,票多的分类标签获胜
for i in [1, 2, …, T]:      
    从S中拔靴采样产生 Dt      
    在 Dt 上训练一个分类器H t    
    分类一个新的样本x∈X 时,通过对 H t  多数投票(等权重)

2. 代码实现

from sklearn.tree import DecisionTreeClassifier        # 用作 基分类器的 决策树分类器
from sklearn.svm import LinearSVC                      # 用作 基分类器的 线性支持向量机分类器
from sklearn.calibration import CalibratedClassifierCV # 将base_estimator拟合到交叉验证生成器的训练集上,并使用测试集进行校准。
                                                        # 然后将每个折叠的概率取平均值进行预测。
                                                        # 概率校准能
                                                        # 将非概率分类模型的输出转化为概率、
                                                        # 对概率分类模型的结果进行进一步修正
import copy
import numpy as np
from collections import Counter
import scipy
import sklearn
from sklearn.feature_extraction.text import TfidfVectorizer
word_model = TfidfVectorizer(stop_words='english')
train_X = word_model.fit_transform(train_df['reviewText'])
test_X = word_model.transform(test_df['reviewText']) 
train_X = scipy.sparse.hstack([train_X, train_df['overall'].values.reshape((-1, 1)) / 5])
test_X = scipy.sparse.hstack([test_X, test_df['overall'].values.reshape((-1, 1)) / 5])
X_train = train_X.tocsr()
Y_train = train_df['label']
X_test = test_X.tocsr()
def majority(nparray):
    """
    选取一个数组中出现次数最多的元素及其索引并返回
    """
    return Counter(nparray).most_common()[0]
class BaggingClassifier(object):
    """
    a Bagging Classifier
    """
    def __init__(self, 
                 base_estimator="DCT", 
                 n_estimators=10,
                 dct_parameters=None):
        """
        Parameters
        ----------
        base_estimator : str, default="DCT"
            用于在一个随机抽取的子训练集上分类的分类器类型。
            如果为"DCT",则程序将实例化一个`sklearn.tree.DecisionTreeClassifier`;
            如果为"SVM",则程序将实例化一个`sklearn.svm.LinearSVC`
            默认为`DecisionTreeClassifier`(决策树分类器).
        n_estimators : int, default=10
            继承的基分类器的个数。
        dct_parameters: 当基分类器为决策树时的参数.
        """
        self.base_estimator = base_estimator
        self.n_estimators = n_estimators
        if dct_parameters == None:
            self.dct_parameters={"max_depth":10,"min_samples_split":2}
        else:
            self.dct_parameters=dct_parameters
        self.instance_base_estimator()
        self.sub_estimators = []
        infos = "------\nBaggingClassifier Parameters:\n 基分类器:"+str(base_estimator)+";\n 基分类器数量:"+str(n_estimators)+".\n------"
        print(infos)
    def instance_base_estimator(self):
        """
        实例化基分类器
        """
        if self.base_estimator=="DCT":
            clf = DecisionTreeClassifier(
                max_depth=self.dct_parameters["max_depth"],
                min_samples_split=self.dct_parameters["min_samples_split"],
                class_weight='balanced')
        elif self.base_estimator=="SVM":
            clf = LinearSVC()
        self.classifier = CalibratedClassifierCV(clf, cv=2, method='sigmoid')
    def sub_dataset(self,X_train,Y_train):
        """
        从当前dataset中随机取一部分返回
        用作某一个子分类器(单独的基分类器)的训练集数据
        """
        data_size = len(Y_train)
        index=np.random.choice(np.arange(data_size), data_size, replace=True)
        return X_train[index],Y_train[index]
    def fit(self,X_train,Y_train):
        """
        训练 T=self.n_estimators 个基分类器
        """
        for t in range(self.n_estimators):
            print("正在训练第 i =",t+1,"个基分类器...")
            sub_train_X,sub_train_Y = self.sub_dataset(X_train,Y_train)  # 抽取一个随机子数据集
            classifier = copy.copy(self.classifier)
            classifier.fit(sub_train_X, sub_train_Y)                     # 随机子数据集上训练基分类器
            self.sub_estimators.append(classifier)                       # 保存基分类器
    def predict(self, X_test):
        """
        为X_test中的每条评论数据预测分类类别
        """ 
        return [majority(one)[0] for one in np.array([clf.predict(X_test) for clf in self.sub_estimators]).T]
    def predict_proba(self, X_test):
        """
        为X_test中的每条数据预测为高质量的概率
        基分类器的predict_proba()方法,第i行第j列上的数值是模型预测第i个预测样本的标签为j的概率
        """
        proba = np.zeros(X_test.shape[0])                       # 以评论的数目生成一个全0一维向量,用于累加各基分类器对各评论预测为高质量概率和
        for clf in self.sub_estimators:                         # 对于每个基分类器
            proba = proba + clf.predict_proba(X_test)[:, 1]     # 逐个累加所有基分类器在同一条评论预测为高质量的概率和
        average_proba = proba / self.n_estimators               # 按个数算平均概率,作为整体预测为高质量的概率
        return average_proba
目录
相关文章
|
21天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
37 2
|
2月前
|
测试技术
软件质量保护与测试(第2版)学习总结第十三章 集成测试
本文是《软件质量保护与测试》(第2版)第十三章的学习总结,介绍了集成测试的概念、主要任务、测试层次与原则,以及集成测试的不同策略,包括非渐增式集成和渐增式集成(自顶向下和自底向上),并通过图示详细解释了集成测试的过程。
64 1
软件质量保护与测试(第2版)学习总结第十三章 集成测试
|
2月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
116 1
|
2月前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
37 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
2月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
105 0
|
2月前
|
机器学习/深度学习 算法 前端开发
集成学习任务七和八、投票法与bagging学习
集成学习任务七和八、投票法与bagging学习
22 0
|
2月前
|
机器学习/深度学习 算法
【机器学习】迅速了解什么是集成学习
【机器学习】迅速了解什么是集成学习
|
2月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
27 0
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】机器学习、深度学习、强化学习和迁移学习简介、相互对比、区别与联系。
机器学习、深度学习、强化学习和迁移学习都是人工智能领域的子领域,它们之间有一定的联系和区别。下面分别对这四个概念进行解析,并给出相互对比、区别与联系以及应用场景案例分析。
114 1
|
4月前
|
机器学习/深度学习 开发者 Python
Python 与 R 在机器学习入门中的学习曲线差异
【8月更文第6天】在机器学习领域,Python 和 R 是两种非常流行的编程语言。Python 以其简洁的语法和广泛的社区支持著称,而 R 则以其强大的统计功能和数据分析能力受到青睐。本文将探讨这两种语言在机器学习入门阶段的学习曲线差异,并通过构建一个简单的线性回归模型来比较它们的体验。
69 7

热门文章

最新文章