机器学习基础13-基于集成算法优化模型(基于印第安糖尿病 Pima Indians数据集)

这篇具有很好参考价值的文章主要介绍了机器学习基础13-基于集成算法优化模型(基于印第安糖尿病 Pima Indians数据集)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有时提升一个模型的准确度很困难。如果你曾纠结于类似的问题,那
我相信你会同意我的看法。你会尝试所有曾学习过的策略和算法,但模型正确率并没有改善。这时你会觉得无助和困顿,这也是
90%的数据科学家开始放弃的时候。不过,这才是考验真本领的时候!这也是普通的数据科学家和大师级数据科学家的差距所在。

前面介绍了一系列算法,每种算法都有不同的适用范围。在现实生活中,常常采用集体智慧来解决问题。那么在机器学习中,能否将多种机器学习算法组合在一起,使计算出来的结果更好呢?这就是集成算法的思想。

集成算法是提高算法准确度的有效方法之一,本节就介绍如何通过scikit-learn来实现集成算法。

本节将会介绍以下几种算法:

  • 装袋(Bagging)算法。
  • 提升(Boosting)算法。
  • 投票(Voting)算法。

集成的方法

下面是三种流行的集成算法的方法。

  • 装袋(Bagging)算法:先将训练集分离成多个子集,然后通过各个子集训练多个模型。
  • 提升(Boosting)算法:训练多个模型并组成一个序列,序列中的每一个模型都会修正前一个模型的错误。
  • 投票(Voting)算法:训练多个模型,并采用样本统计来提高模型的准确度。

在这里采用Pima Indians数据集,并用10折交叉验证来分离数据,再通过相应的评估矩阵来评估算法模型。

装袋算法是一种提高分类准确率的算法,通过给定组合投票的方式获得最优解。比如你生病了,去n个医院看了n个医生,每个医生都给你开了药方,最后哪个药方的出现次数多,就说明这个药方越有可能是最优解,这很好理解,这也是装袋算法的思想。

下面将介绍三种装袋模型:

  • 装袋决策树(Bagged Decision Trees)。
  • 随机森林(Random Forest)。
  • 极端随机树(Extra Trees)。

装袋决策树

装袋算法在数据具有很大的方差时非常有效,最常见的例子就是决策树的装袋算法。下面将在scikit-learn中通过BaggingClassifier实现分类与回归树算法。

本例中创建了100棵决策树,代码如下:


import pandas as pd
from sklearn.ensemble import BaggingClassifier

from sklearn.model_selection import cross_val_score, KFold
from sklearn.tree import DecisionTreeClassifier

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]

num_folds = 10
seed = 7
kflod =KFold(n_splits=num_folds, random_state=seed, shuffle=True)
#决策树
cart = DecisionTreeClassifier()

num_trees = 100

model = BaggingClassifier(base_estimator=cart, n_estimators=num_trees, random_state=seed)

result = cross_val_score(model, X, Y, cv=kflod)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))

运行结果:

算法评估结果:0.758 (0.039)

与前几节的分类与回归树的结果(0.701708817498)比较,发现结果有了很大的提升。


随机森林

顾名思义,随机森林是用随机的方式建立一个森林,森林由很多的决策树组成,而且每一棵决策树之间是没有关联的。得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行判断,看看这个样本应该属于哪一类,再看看哪一类被选择最多,就预测这个样本为哪一类。

在建立每一棵决策树的过程中,有两点需要注意:采样与完全分裂。首先是两个随机采样的过程,随机森林对输入的数据要进行行、列的采样。对于行采样采用有放回的方式,也就是在采样得到的样本集合中可能有重复的样本。

假设输入样本为N个,那么采样的样本也为 N 个。这样在训练的时候,每一棵树的输入样本都不是全部的样本,就相对不容易出现过拟合。然后进行列采样,从M个feature中选出m个(m<<M)。之后再对采样之后的数据使用完全分裂的方式建立决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么所有样本都指向同一个分类。一般很多的决策树算法都有一个重要的步骤——剪枝,但是这里不这么做,因为之前的两个随机采样过程保证了随机性,所以不剪枝也不会出现过拟合。

这种算法得到的随机森林中的每一棵决策树都是很弱的,但是将它们组合起来就会很厉害了。我觉得可以这样比喻随机森林算法:每一棵决策树就是一个精通某一个领域的专家,这样在随机森林中就有了很多个精通不同领域的专家,对于一个新的问题(新的输入数据),可以从不同的角度去看待它,最终由各个专家投票得到结果。

这种算法在scikit-learn中的实现类是RandomForestClassifier。下面的例子是实现了100棵树的随机森林

代码如下:


import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier

from sklearn.model_selection import cross_val_score, KFold


#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]

num_folds = 10
seed = 7
#
kflod =KFold(n_splits=num_folds, random_state=seed, shuffle=True)

num_tree = 100

max_features = 3

model = RandomForestClassifier(n_estimators=num_tree, max_features=max_features)

result = cross_val_score(model, X, Y, cv=kflod)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))
算法评估结果:0.777 (0.059)

极端随机树

极端随机树是由PierreGeurts等人于2006年提出的,它与随机森林十分相似,都是由许多决策树构成。

但它与随机森林有两个主要的区别:

(1)随机森林应用的是 Bagging 模型,而极端随机树是使用所有的训练样本得到每棵决策树,也就是每棵决策树应用的是相同的全部训练样本。

(2)随机森林是在一个随机子集内得到最优分叉特征属性,而极端随机树是完全随机地选择分叉特征属性,从而实现对决策树进行分叉的。它在scikit-learn中的实现类是ExtraTreesClassifier。下面的例子是实现了100棵树和7个随机特征的极端随机树。

代码如下:


import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier

from sklearn.model_selection import cross_val_score, KFold


#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]

num_folds = 10
seed = 7
#
kflod =KFold(n_splits=num_folds, random_state=seed, shuffle=True)

num_tree = 100

max_features = 7

model = ExtraTreesClassifier(n_estimators=num_tree, max_features=max_features)

result = cross_val_score(model, X, Y, cv=kflod)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))

运行结果:

算法评估结果:0.764 (0.056)

提升算法

提升算法是一种用来提高弱分类算法准确度的方法,这种方法先构造一个预测函数系列,然后以一定的方式将它们组合成一个预测函数。提升算法也是一种提高任意给定学习算法准确度的方法,它是一种集成算法,主要通过对样本集的操作获得样本子集,然后用弱分类算法在样本子集上训练生成一系列的基分类器。

它可以用来提高其他弱分类算法的识别率,也就是将其他的弱分类算法作为基分类算法放于提升框架中,通过提升框架对训练样本集的操作,得到不同的训练样本子集,再用该样本子集去训练生成基分类器。每得到一个样本集就用该基分类算法在该样本集上产生一个基分类器,这样在给定训练轮数n后,就可产生n个基分类器,然后提升算法将这n个基分类器进行加权融合,产生最后的结果分类器。在这n个基分类器中,每个分类器的识别率不一定很高,但它们联合后的结果有很高的识别率,这样便提高了弱分类算法的识别率。下面是两个非常常见的用于机器学习的提升算法:

  • AdaBoost.
  • 随机梯度提升(Stochastic Gradient Boosting)。

AdaBoost

AdaBoost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。它将修改过权值的新数据集送给下层分类器进行训练,再将每次训练得到的分类器融合起来,作为最后的决策分类器。使用AdaBoost分类器可以排除一些不必要的训练数据特征,并放在关键的训练数据上面。

在scikit-learn中的实现类是AdaBoostClassifier

代码如下:


import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier, AdaBoostClassifier

from sklearn.model_selection import cross_val_score, KFold


#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]

num_folds = 10
seed = 7
#
kflod =KFold(n_splits=num_folds, random_state=seed, shuffle=True)

num_tree = 30

model = AdaBoostClassifier(n_estimators=num_tree, random_state=seed)

result = cross_val_score(model, X, Y, cv=kflod)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))


运行结果:

算法评估结果:0.755 (0.037)

随机梯度提升

随机梯度提升法(GBM)基于的思想是:要找到某个函数的最大值,最好的办法就是沿着该函数的梯度方向探寻。梯度算子总是指向函数值增长最快的方向。由于梯度提升算法在每次更新数据集时都需要遍历整个数据集,计算复杂度较高,于是有了一个改进算法——随机梯度提升算法,该算法一次只用一个样本点来更新回归系数,极大地改善了算法的计算复杂度。

在 scikit-learn中的实现类是 GradientBoostingClassifier

代码如下:


import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier, AdaBoostClassifier, \
    GradientBoostingClassifier

from sklearn.model_selection import cross_val_score, KFold


#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]

num_folds = 10
seed = 7
#
kflod =KFold(n_splits=num_folds, random_state=seed, shuffle=True)

num_tree = 100

model = GradientBoostingClassifier(n_estimators=num_tree, random_state=seed)

result = cross_val_score(model, X, Y, cv=kflod)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))


运行结果:

算法评估结果:0.758 (0.056)

投票算法

投票算法(Voting)是一个非常简单的多个机器学习算法的集成算
法。投票算法是通过创建两个或多个算法模型,利用投票算法将这些算法包装起来,计算各个子模型的平均预测状况。在实际的应用中,可以对每个子模型的预测结果增加权重,以提高算法的准确度。但是,在scikit-learn中不提供加权算法。下面通过一个例子来展示在scikit-learn中如何实现一个投票算法。

在scikit-learn中的实现类是VotingClassifier。

代码如下:


import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier, AdaBoostClassifier, \
    GradientBoostingClassifier, VotingClassifier
from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import cross_val_score, KFold
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]

num_folds = 10
seed = 7
#
kflod =KFold(n_splits=num_folds, random_state=seed, shuffle=True)

cart = DecisionTreeClassifier()

models= []

model_logistic = LogisticRegression()
models.append(('logistic', model_logistic))

model_cart = DecisionTreeClassifier()
models.append(('cart', model_cart))

model_svm = SVC()
models.append(('svm', model_svm))

ensemble_model = VotingClassifier(estimators=models)

result = cross_val_score(ensemble_model, X, Y, cv=kflod)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))

运行结果:

算法评估结果:0.767 (0.047)

本节介绍了三种提高算法准确度的集成算法,下一节将会介绍另外一种提升算法准确度的方法——算法调参。文章来源地址https://www.toymoban.com/news/detail-679520.html

到了这里,关于机器学习基础13-基于集成算法优化模型(基于印第安糖尿病 Pima Indians数据集)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 探索人工智能 | 模型训练 使用算法和数据对机器学习模型进行参数调整和优化

    模型训练是指 使用算法和数据对机器学习模型进行参数调整和优化 的过程。模型训练一般包含以下步骤:数据收集、数据预处理、模型选择、模型训练、模型评估、超参数调优、模型部署、持续优化。 数据收集是指为机器学习或数据分析任务收集和获取用于训练或分析的数

    2024年02月12日
    浏览(45)
  • Educode--机器学习基础模型与算法测试闯关实验

    # -*- coding: utf-8 -*- \\\'\\\'\\\' 油气藏的储量密度Y与生油门限以下平均地温梯度X1、 生油门限以下总有机碳百分比X2、生油岩体积与沉积岩体积百分比X3、砂泥岩厚度百分比X4、 有机转化率X5有关,数据文件为“1.xlsx”,字段如下: 样本ID    X1    X2    X3    X4    X5    Y

    2024年02月06日
    浏览(29)
  • 强化学习路径优化:基于Q-learning算法的机器人路径优化(MATLAB)

    Q-learning算法是强化学习算法中的一种,该算法主要包含:Agent、状态、动作、环境、回报和惩罚。Q-learning算法通过机器人与环境不断地交换信息,来实现自我学习。Q-learning算法中的Q表是机器人与环境交互后的结果,因此在Q-learning算法中更新Q表就是机器人与环境的交互过程

    2024年02月14日
    浏览(42)
  • 机器学习基础之《分类算法(3)—模型选择与调优》

    作用是如何选择出最好的K值 一、什么是交叉验证(cross validation) 1、定义 交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成5份,其中一份作为验证集。然后经过5次(组)的测试,每次都更换不同的验证集。即得到5组模型的结果,取平均值作为最终

    2024年02月12日
    浏览(30)
  • 基于传统机器学习模型算法的项目开发详细过程

    描述开发项目模型的一系列情境和因素,包括问题、需求、机会、市场环境、竞争情况等 传统机器学习在解决实际问题中主要分为两类: 有监督学习 :已知输入、输出之间的关系而进行的学习,从而产生一个能够对已知输入给出合适输出的模型。这些算法在图像分类、语音

    2024年01月20日
    浏览(33)
  • 机器学习:基于AdaBoost算法模型对信用卡是否违约进行识别

    作者:i阿极 作者简介:数据分析领域优质创作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍 📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪 大家

    2024年02月08日
    浏览(28)
  • [学习笔记] [机器学习] 13. 集成学习进阶(XGBoost、OTTO案例实现、LightGBM、PUBG玩家排名预测)

    视频链接 数据集下载地址:无需下载 学习目标: 知道 XGBoost 算法原理 知道 otto 案例通过 XGBoost 实现流程 知道 LightGBM 算法原理 知道 PUBG 案例通过 LightGBM 实现流程 知道 Stacking 算法原理 知道住房月租金预测通过 Stacking 实现流程 学习目标: 了解 XGBoost 的目标函数推导过程 知

    2024年02月09日
    浏览(33)
  • 机器学习:基于AdaBoost算法对信用卡精准营销建立模型(附案例实战)

    作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍 📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪 订阅专栏案

    2023年04月09日
    浏览(26)
  • 机器学习基础10-审查回归算法(基于波士顿房价的数据集)

    上一节介绍了如何审查分类算法,并介绍了六种不同的分类算法,还 用同一个数据集按照相同的方式对它们做了审查,本章将用相同的方式对回归算法进行审查。 在本节将学到: 如何审查机器学习的回归算法。 如何审查四种线性分类算法。 如何审查三种非线性分类算法。

    2024年02月11日
    浏览(26)
  • 机器学习基础14-算法调参(基于印第安糖尿病Pima数据集)

    机器学习的模型都是参数化的,可以通过调参来提高模型的准确度。 模型有很多参数,如何找到最佳的参数组合,可以把它当作一个查询问题来处理,但是调整参数到何时为止呢?应该遵循偏差和方差协调的原则。 接下来将介绍在 scikit-learn 中设置机器学习模型最佳参数的方

    2024年02月10日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包