IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 《机器学习》西瓜书课后习题8.5——python实现基于决策树的Bagging算法 -> 正文阅读

[数据结构与算法]《机器学习》西瓜书课后习题8.5——python实现基于决策树的Bagging算法

《机器学习》西瓜书课后习题8.5——python实现基于决策树的Bagging算法

8.5 试编程实现Bagging,以决策树桩为基学习器,在西瓜数据集3.0a上训练一个Bagging集成,并玉图8.6相比较

写在前面:由于写者的失误错将“西瓜数据集3.0a"看成”西瓜数据集3.0“,由于这两个数据集存在较大的差别,本文所论述的完全是基于3.0a数据集的,但是算法的核心思想没有改变,仅供读者参考!!!

参考博客:

《机器学习》西瓜书课后习题4.3——python实现基于信息熵划分的决策树算法(简单、全面)

1.模型的核心思想

本文所论述的Bagging模型,主要有7个决策树学习器组成,采用自助法构造训练集,最终结果由7个学习器投票产生

鉴于本问题的关键是Bagging算法,那么决策树的构造使用了python中的sklearn库。

对于训练集的划分问题,我们使用了自助法,通过随机采样17次,形成了包括17条数据的训练集,原数据集作为测试集。

该数据集中包括了大部分的离散属性,所以对于这些数据进行编码,详细参考前文提到的参考博客!!!

2.代码实现

'''
8.5 试编程实现Bagging,以决策树桩为基学习器,在西瓜数据集3.0a上训练一个Bagging集成,并玉图8.6相比较
'''

import csv
from sklearn.feature_extraction import DictVectorizer
from sklearn import preprocessing
from sklearn import tree
import random



class Bagging:
    train_featureList = []  # 训练集数据
    train_labelList = []  # 训练集标签
    train_dummyX = []  # 训练集数据编码后
    train_dummyY = []  # 训练集标签编码

    test_featrueList = []  # 测试数据
    test_labelList = []  # 测试数据标签
    test_dummyX = []  # 测试数据编码后
    test_dummyY = []  # 测试数据标签编码后

    bagging_vote_good = []  # 记录多个学习器的投票情况(好瓜)
    bagging_vote_bad = []  # 记录多个学习器的投票情况(坏瓜)

    def __init__(self):
        filename = '西瓜数据集3.0.csv'
        self.loadData(filename)
        self.build_trainset()
        self.bagging_vote_good = [0] * 17
        self.bagging_vote_bad = [0] * 17
        for i in range(0,7):
            clf = tree.DecisionTreeClassifier(criterion='entropy')
            clf.fit(self.train_dummyX,self.train_dummyY)
            predict = clf.predict(self.test_dummyX)
            self.count_vote(predict)

        print('认为是好瓜的票数:',self.bagging_vote_good)
        print('认为是坏瓜的票数:',self.bagging_vote_bad)

        sum = 0
        for i in range(0,17):
            if (self.test_dummyY[i] == 1 and self.bagging_vote_good[i] > self.bagging_vote_bad[i]) or (self.test_dummyY[i] == 0 and self.bagging_vote_good[i] < self.bagging_vote_bad[i]):
                sum += 1

        print('准确率为:',sum/17)
    # 根据预测结果计票
    def count_vote(self,predict):
        for i in range(0,17):
            if predict[i] == 1:
                self.bagging_vote_good[i] += 1
            else:
                self.bagging_vote_bad[i] += 1


    def is_number(self,n):
        is_number = True
        try:
            num = float(n)
            # 检查 "nan"
            is_number = num == num   # 或者使用 `math.isnan(num)`
        except ValueError:
            is_number = False
        return is_number
        #  编码

    def encoder(self,featureList,labelList):
        vec = DictVectorizer()
        dummyX = vec.fit_transform(featureList).toarray()

        lb = preprocessing.LabelBinarizer()
        dummyY = lb.fit_transform(labelList)

        return dummyX, dummyY

    #  下载数据
    def loadData(self,filename):

        data=open(filename,'r',encoding='GBK')
        reader = csv.reader(data)
        headers = next(reader)

        featureList = []
        labelList = []

        for row in reader:
            labelList.append(row[len(row)-1])
            rowDict = {}
            for i in range(1,len(row)-1):
                if self.is_number(row[i]) == True:
                    rowDict[headers[i]] = float(row[i])
                else:
                    rowDict[headers[i]]=row[i]
            featureList.append(rowDict)

        self.test_featrueList = featureList
        self.test_labelList = labelList
        self.test_dummyX,self.test_dummyY = self.encoder(featureList,labelList)


    #  自助采样法17次生成训练集
    def build_trainset(self):
        for i in range(0,17):
            pos = random.randint(0, 16)
            self.train_featureList.append(self.test_featrueList[pos])
            self.train_labelList.append(self.test_labelList[pos])
        self.train_dummyX,self.train_dummyY = self.encoder(self.train_featureList,self.train_labelList)


bagging = Bagging()



在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-23 11:02:21  更:2022-04-23 11:03:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:54:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码