机器学习 - [集成学习]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天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
21天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
21天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
21天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
21天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
21天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
6月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
239 14
|
6月前
|
机器学习/深度学习 算法 数据可视化
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
117 1
|
6月前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)