四种方法的具体的原理可以见博文
和西瓜书
先上代码根据结果分析

鸢尾花数据

# evaluate bagging algorithm for classification
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
# 我们使用多个KNN模型作为基模型演示投票法,其中每个模型采用不同的邻居值K参数:
# get a voting ensemble of models
def base_modellist():# define the base modelsmodels = list()models.append(('DT1', DecisionTreeClassifier(max_depth=1)))models.append(('DT2',  DecisionTreeClassifier(max_depth=2)))models.append(('DT3',  DecisionTreeClassifier(max_depth=3)))# define the voting ensemblereturn models
def get_models():models = dict()models['DT1'] = DecisionTreeClassifier(max_depth=1)models['DT2'] = DecisionTreeClassifier(max_depth=2)models['DT3'] =  DecisionTreeClassifier(max_depth=3)models['DT100'] =  DecisionTreeClassifier(max_depth=100)models['bagging1'] = BaggingClassifier(base_estimator=DecisionTreeClassifier(max_depth=1),n_estimators=100,max_samples=0.3)models['bagging3'] = BaggingClassifier(base_estimator=DecisionTreeClassifier(max_depth=3),n_estimators=100,max_samples=0.3)models['hard_voting'] = VotingClassifier(estimators=base_modellist(), voting='hard')models['RF1'] = RandomForestClassifier(n_estimators=100, criterion='entropy',max_samples=0.3)return models
# 评估模型
def evaluate_model(model, X, y):cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')return scores
# define dataset
from sklearn import datasets
from sklearn.model_selection import train_test_split
#读取数据,划分训练集和测试集
iris=datasets.load_iris()
x=iris.data
y=iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=1)
# define the model
models = get_models()
# evaluate the models and store results
results, names = list(), list()
for name, model in models.items():scores = evaluate_model(model,x_train, y_train)results.append(scores)names.append(name)print('交叉验证:>%s %.3f (%.3f)' % (name, np.mean(scores), np.std(scores)))l=model.fit(x_train,y_train)s=l.score(x_test,y_test)print("测试数据分数:%.3f"%(s))
# plot model performance for comparison
pyplot.boxplot(results, labels=names, showmeans=True)
pyplot.show()

结果:

交叉验证:>DT1 0.695 (0.032)
测试数据分数:0.600
交叉验证:>DT2 0.949 (0.072)
测试数据分数:0.956
交叉验证:>DT3 0.968 (0.045)
测试数据分数:0.956
交叉验证:>DT100 0.950 (0.053)
测试数据分数:0.956
交叉验证:>bagging1 0.950 (0.059)
测试数据分数:0.956
交叉验证:>bagging3 0.950 (0.057)
测试数据分数:0.956
交叉验证:>hard_voting 0.962 (0.058)
测试数据分数:0.956
交叉验证:>RF1 0.943 (0.063)
测试数据分数:0.956

分析:

  • 可以看到深度为3时训练效果最好
  • 深度为100时训练效果逐渐下降,很有可能是过拟合的问题
  • bagging1所用到基础模型是训练效果最差的模型,但是结果反而有很高的准确率
  • bagging3用训练效果最好的模型训练,反而训练效果下降了
  • 我觉得可能是数据的复杂性不够,并不是很容易过拟合,可以看见用最大深度为100的模型 其效果也没有明显下降,bagging的优势显示不出来
  • 反而是大多数基础模型比较好的情况下vote结果会更可靠。
  • 随机森林的效果在特征比较少的情况下也没有优越性可言。

手写字母数据

# define dataset
from sklearn import datasets
from sklearn.model_selection import train_test_split
#读取数据,划分训练集和测试集
digits = datasets.load_digits()
x=digits.data
y=digits.target
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=1)
# 我们使用多个KNN模型作为基模型演示投票法,其中每个模型采用不同的邻居值K参数:
# get a voting ensemble of models
def base_modellist():# define the base modelsmodels = list()models.append(('DT1', DecisionTreeClassifier(max_depth=1)))models.append(('DT2',  DecisionTreeClassifier(max_depth=2)))models.append(('DT3',  DecisionTreeClassifier(max_depth=3)))# define the voting ensemblereturn models
def base_modellist1():# define the base modelsmodels = list()models.append(('DT5', DecisionTreeClassifier(max_depth=5)))models.append(('DT10',  DecisionTreeClassifier(max_depth=10)))models.append(('DT100',  DecisionTreeClassifier(max_depth=100)))# define the voting ensemblereturn models
def get_models():models = dict()models['DT'] = DecisionTreeClassifier(max_depth=1)models['DT5'] = DecisionTreeClassifier(max_depth=5)models['DT10'] =  DecisionTreeClassifier(max_depth=10)models['DT100'] =  DecisionTreeClassifier(max_depth=100)models['DT1000'] =  DecisionTreeClassifier(max_depth=1000)models['b1'] = BaggingClassifier(base_estimator=DecisionTreeClassifier(max_depth=3),n_estimators=100,max_samples=0.3)models['b100'] = BaggingClassifier(base_estimator=DecisionTreeClassifier(max_depth=100),n_estimators=100,max_samples=0.3)models['HV'] = VotingClassifier(estimators=base_modellist(), voting='hard')models['HV2'] = VotingClassifier(estimators=base_modellist1(), voting='hard')models['RF1'] = RandomForestClassifier(n_estimators=100,max_depth=3,criterion='entropy',max_samples=0.3)models['RF2'] = RandomForestClassifier(n_estimators=100,max_depth=100,criterion='entropy',max_samples=0.3)return models
# 评估模型
def evaluate_model(model, X, y):cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')return scores
# define the model
models = get_models()
# evaluate the models and store results
results, names = list(), list()
for name, model in models.items():scores = evaluate_model(model,x_train, y_train)results.append(scores)names.append(name)print('交叉验证:>%s %.3f (%.3f)' % (name, np.mean(scores), np.std(scores)))l=model.fit(x_train,y_train)s=l.score(x_test,y_test)print("测试数据分数:%.3f"%(s))
# plot model performance for comparison
pyplot.boxplot(results, labels=names, showmeans=True)
pyplot.show()

结果

交叉验证:>DT 0.200 (0.003)
测试数据分数:0.193
交叉验证:>DT5 0.657 (0.046)
测试数据分数:0.691
交叉验证:>DT10 0.826 (0.030)
测试数据分数:0.863
交叉验证:>DT100 0.833 (0.031)
测试数据分数:0.848
交叉验证:>DT1000 0.836 (0.029)
测试数据分数:0.856
交叉验证:>b1 0.810 (0.035)
测试数据分数:0.828
交叉验证:>b100 0.941 (0.019)
测试数据分数:0.944
交叉验证:>HV 0.325 (0.019)
测试数据分数:0.335
交叉验证:>HV2 0.831 (0.033)
测试数据分数:0.854
交叉验证:>RF1 0.886 (0.025)
测试数据分数:0.894
交叉验证:>RF2 0.962 (0.015)
测试数据分数:0.967

结果分析:

  • bagging在基础模型不好的时候,或者有一个很明显无法提升的平台的时候,泛化能力有很大的提升,优越性有所体现
  • 但是vote反而能力有限
  • 所以,如果模型训练结果比较好的几种模型集合,vote对于提升准确率会很有帮助,虽然这种一般只能得到很少的提升或者,基本没有提升
  • 使用决策树的方法下,随机森林的结果优于bagging,个人认为可能是随机森林在bagging的基础上还增加了特征的提取,这一点对于多维特征的数据很实用

基于鸢尾花数据和手写数字,决策树,随机森林,voting,bagging法的比较相关推荐

  1. 手写数字识别 随机森林 代码

    数据来源:https://github.com/Janly238/Digit_Recognizer/tree/master/data #!/usr/bin/env python3 # -*- codi ...

  2. 基于支持向量机的Digits手写数字识别

    基于支持向量机的Digits手写数字识别 描述 支持向量机(Support Vector Machine,简称SVM)模型既可以用于分类也可以用于回归.手写数字识别是一个多分类问题(判断一张手写数字图 ...

  3. Python,OpenCV基于支持向量机SVM的手写数字OCR

    Python,OpenCV基于支持向量机SVM的手写数字OCR 1. 效果图 2. SVM及原理 2. 源码 2.1 SVM的手写数字OCR 2.2 非线性SVM 参考 上一节介绍了基于KNN的手写数 ...

  4. DL之NN:基于(sklearn自带手写数字图片识别数据集)+自定义NN类(三层64→100→10)实现97.5%准确率

    DL之NN:基于(sklearn自带手写数字图片识别数据集)+自定义NN类(三层64→100→10)实现97.5%准确率 目录 输出结果 核心代码 输出结果 核心代码 #DL之NN:基于sklearn ...

  5. 基于深度学习的手写数字识别、python实现

    基于深度学习的手写数字识别.python实现 一.what is 深度学习 二.加深层可以减少网络的参数数量 三.深度学习的手写数字识别 一.what is 深度学习 深度学习是加深了层的深度神经网络 ...

  6. 基于K210的MNIST手写数字识别

    基于K210的MNIST手写数字识别 项目已开源链接: Github. 硬件平台 采用Maixduino开发板 在sipeed官方有售 软件平台 使用MaixPy环境进行单片机的编程 官方资源可在这里 ...

  7. 基于深度学习的手写数字识别Matlab实现

    基于深度学习的手写数字识别Matlab实现 1.网络设计 2. 训练方法 3.实验结果 4.实验结果分析 5.结论 1.网络设计 1.1 CNN(特征提取网络+分类网络) 随着深度学习的迅猛发展,其应 ...

  8. MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试

    文章目录 MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试 一.题目要求 二.完整的目录结构说明 三.Mnist数据集及数据格式转换 四.BP神经网络相关知识 4.1 ...

  9. 基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明)

    基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明) 配置环境 1.前言 2.问题描述 3.解决方案 4.实现步骤 4.1数据集选择 4.2构建网络 4.3训练网络 4.4测试网络 4.5图 ...

最新文章

  1. 面试:InnoDB 中一棵 B+ 树可以存放多少行数据?
  2. Emai乱码——解决的“迂回”战术
  3. Flink从入门到精通100篇(十)-双亲委派模型与 Flink 的类加载策略
  4. nsga2多目标优化之核心知识点(快速非支配排序、拥挤距离、精英选择策略)详解(python实现)
  5. html表格以pdf格式导出到本地
  6. 计算机组成原理r型指令logisim实现_第一章 计算机体系结构
  7. [蓝桥杯][2019年第十届真题c/c++B组]迷宫(寻找路径bfs及文件输入输出)
  8. 系统分析师视频教程-张友生
  9. Hilbert变换简要剖析
  10. web前端数据可视化框架汇总
  11. 网络编程学习路线计划
  12. 基于VB2008的winsocket控件网络编程
  13. 爱情在患得患失时最美丽
  14. 华为分布式存储FusionStorage知识点总结【面试篇】
  15. 南电转债上市价格预测
  16. 蓝桥杯真题 数列求值(超范围)(好好审题啊喂)
  17. 佩戴骨传导耳机对耳朵有损害?不仅无损相比传统耳机优点有很多
  18. Ubuntu16.04安装K8s步骤和踩坑记录
  19. JavaScript:二维码生成与解析
  20. 使用uniapp+unicloud部署微信小程序

热门文章

  1. Bert模型学习之句向量的简单应用
  2. CSS设置元素叠加显示
  3. ic芯片方案设计流程你知道多少?
  4. asp.net (C#) RTX(腾讯通) 接口应用 能实现与OA接口
  5. POW证明代码实现demo[区块链]
  6. Android系统固件定制方式
  7. 微信小程序删除文件Page剩余
  8. 虚拟机下安装UEFI+GPT+win7x64
  9. apoint.exe
  10. ABAP 内表修改 MODIFY 和 MODIFY table 的区别