机器学习 - [集成学习]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
目录
打赏
0
0
1
0
332
分享
相关文章
云上玩转DeepSeek系列之三:PAI-RAG集成联网搜索,构建企业级智能助手
本文将为您带来“基于 PAI-RAG 构建 DeepSeek 联网搜索+企业级知识库助手服务”解决方案,PAI-RAG 提供全面的生态能力,支持一键部署至企业微信、微信公众号、钉钉群聊机器人等,助力打造多场景的AI助理,全面提升业务效率与用户体验。
如何让你的Uno Platform应用秒变AI大神?从零开始,轻松集成机器学习功能,让应用智能起来,用户惊呼太神奇!
【9月更文挑战第8天】随着技术的发展,人工智能与机器学习已融入日常生活,特别是在移动应用开发中。Uno Platform 是一个强大的框架,支持使用 C# 和 XAML 开发跨平台应用(涵盖 Windows、macOS、iOS、Android 和 Web)。本文探讨如何在 Uno Platform 中集成机器学习功能,通过示例代码展示从模型选择、训练到应用集成的全过程,并介绍如何利用 Onnx Runtime 等库实现在 Uno 平台上的模型运行,最终提升应用智能化水平和用户体验。
127 1
Elasticsearch 与机器学习的集成
【9月更文第3天】Elasticsearch 不仅仅是一个强大的分布式搜索和分析引擎,它还是一个完整的数据平台,通过与 Kibana、Logstash 等工具结合使用,能够提供从数据采集、存储到分析的一站式解决方案。特别是,Elasticsearch 集成了机器学习(ML)功能,使得在实时数据流中进行异常检测和趋势预测成为可能。本文将详细介绍如何利用 Elasticsearch 的 ML 功能来检测异常行为或预测趋势。
268 4
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
124 0
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
144 0
全面解析TensorFlow Lite:从模型转换到Android应用集成,教你如何在移动设备上轻松部署轻量级机器学习模型,实现高效本地推理
【8月更文挑战第31天】本文通过技术综述介绍了如何使用TensorFlow Lite将机器学习模型部署至移动设备。从创建、训练模型开始,详细演示了模型向TensorFlow Lite格式的转换过程,并指导如何在Android应用中集成该模型以实现预测功能,突显了TensorFlow Lite在资源受限环境中的优势及灵活性。
736 0
基于生物地理算法的MLP多层感知机优化matlab仿真
本程序基于生物地理算法(BBO)优化MLP多层感知机,通过MATLAB2022A实现随机数据点的趋势预测,并输出优化收敛曲线。BBO模拟物种在地理空间上的迁移、竞争与适应过程,以优化MLP的权重和偏置参数,提升预测性能。完整程序无水印,适用于机器学习和数据预测任务。
基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF
本项目基于MATLAB2022A实现IEKF迭代扩展卡尔曼滤波算法的数据跟踪仿真,对比EKF和UKF的性能。通过仿真输出误差收敛曲线和误差协方差收敛曲线,展示三种滤波器的精度差异。核心程序包括数据处理、误差计算及可视化展示。IEKF通过多次迭代线性化过程,增强非线性处理能力;UKF避免线性化,使用sigma点直接处理非线性问题;EKF则通过一次线性化简化处理。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等