1.调整模型参数来提高性能

  • 参数调整:调节模型合适的选项的过程,如股票C5.0决策树模型中的trials参数,神经网络中的调节节点、隐层数目,SVM中的核函数等等。
  • caret包自动调整参数:train函数,为分类和回归的150种不同机器学习模型自动搜寻一个最优的模型。支持的模型及相关可调节参数的详细信息可参考:http://topepo.github.io/caret/modelList.html



    自动调整不会遍历所有参数所有值,只选择参数可能值的一些子集来构建网格。caret默认对每个参数最多搜索3个可能值,假设共有p个参数,则有3^p个候选模型将被测试。

1.1 创建简单的调整模型

最简单的调整模型只需要通过mehod参数来指定模型的类型。这里仍以采用决策树C5.0对信用数据建模为例。

# load the credit dataset
credit <- read.csv("credit.csv")
library(caret) ## Creating a simple tuned model ----
# automated parameter tuning of C5.0 decision tree
set.seed(300)
m <- train(default ~ ., data = credit, method = "C5.0") # summary of tuning results
m

计算量比较大,R会重复地生成数据的随机抽样,建立决策树模型,计算性能统计量,并且对结果进行评估。



结果分为4部分:

  • 一是输入数据的情况;
  • 二是预处理和重抽样的应用情况:25个自助法抽样;
  • 三是候选模型评估列表:共12个模型被测试,基于3个参数(model\winno\trials)组合;
  • 四是最佳模型的选择:图中红框内结果。

将最佳模型进行预测:

# apply the best C5.0 candidate model to make predictions
p <- predict(m, credit)
table(p, credit$default) # obtain predicted classes
head(predict(m, credit, type = "raw")) # obtain predicted probabilities
head(predict(m, credit, type = "prob"))

有2个被错误分类,这只是重新代入误差,而不是对未来数据性能的度量。上图中自助法估计的73%才是对未来性能的估计。

2.2 定制调整参数

  • trainControl函数可创建一系列配置选项(控制对象),与train函数一起使用。method参数设置重抽样的方法。

  • 如使用Kappa优化决策树的提升(boosting)参数的过程:

①创建配置选项

## Customizing the tuning process ----
# use trainControl() to alter resampling strategy
ctrl <- trainControl(method = "cv", #重抽样方法
number = 10, #折数目
selectionFunction = "oneSE") #oneSE选择最好性能标准差之内的最简单的候选者
#默认best,即选择具有最好的某特定度量值的候选者

②创建组合数据框

#model和winnow保持不变,trials设置8个值
# use expand.grid() to create grid of tuning parameters
grid <- expand.grid(.model = "tree",
.trials = c(1, 5, 10, 15, 20, 25, 30, 35),
.winnow = FALSE)
# look at the result of expand.grid()
grid



③定制参数训练

# customize train() with the control list and grid of parameters
set.seed(300)
m <- train(default ~ ., data = credit, method = "C5.0",
metric = "Kappa",
trControl = ctrl,
tuneGrid = grid)
m

  • 和之前自助法的结果相比需要注意的地方:

    -- 10折交叉验证的样本量为900;

    -- 自定义的8个候选模型;

    -- 8个候选模型中虽然trials为35的模型准确度最高,但结果推荐的是trials为5的模型,因为这里使用了oneSE规则而非之前的best规则来选择模型。简单的模型更可取,一是具有更好的计算性能,二是减少过拟合的可能。

2.使用元学习来提高性能

  • 将多个模型合并成一个更强的组。模型互补,而非重叠。
  • 元学习适合对多个模型的预测和要求的结果之间的关系建模。

2.1 集成学习(元学习)概述

  • 元学习也称集成学习:基于结合多个很弱的学习器来创建一个很强学习器的思路。
  • 集成学习示意图:



分配函数决定每个模型接受完整的训练集还是某个抽样的样本。

组合函数用来对预测中的不一致进行调节。

堆叠:使用多个模型的预测来训练一个仲裁模型的过程。

集成学习的好处:

  • 便利性:能节省寻求单一最佳模型的时间,只需要训练一批表现尚可的候选者,然后整合它们即可。
  • 普适性
  • 提升大量数据或少量数据的性能
  • 将不同领域数据合成
  • 对困难学习任务更细致的理解

2.2 bagging

  • 自助汇聚法(bagging):最好的集成学习方法之一。bagging对原始训练集使用自助法抽样产生多个训练集,再使用单一的机器学习算法产生多个模型,然后使用投票(对于分类问题)或平均(对于数值预测)的方法来组合预测值。
  • bagging对不稳定的学习器(随着数据发送很小变化产生差别很大的模型),如决策树具有很好的效果。
## Bagging ----
# Using the ipred bagged decision trees
library(ipred)
set.seed(300)
mybag <- bagging(default ~ .,
data = credit,
nbagg = 25) #用于投票的决策树的数目,默认25
credit_pred <- predict(mybag, credit)
table(credit_pred, credit$default)



模型训练得不错,再通过catet::train函数的10折交叉验证来建立bagging树,来评估未来的性能表现。

# estimate performance of ipred bagged trees
library(caret)
set.seed(300)
ctrl <- trainControl(method = "cv", number = 10)
train(default ~ ., data = credit,
method = "treebag", #bagging树函数
trControl = ctrl)

  • 基于bagging的其他机器学习模型

    caret包中包含了支持向量机svmBag,朴素贝叶斯nbBag,决策树ctreeBag,神经网络nnetBag等。
  • 以caret包中的svmBag对象为例,提供了fit,pred,aggregate三个函数来创建一个bagging控制对象:
# Using caret's more general bagging function
# create a bag control object using svmBag
str(svmBag)
svmBag$fit bagctrl <- bagControl(fit = svmBag$fit,
predict = svmBag$pred,
aggregate = svmBag$aggregate) # fit the bagged svm model
set.seed(300)
svmbag <- train(default ~ ., data = credit, "bag",
trControl = ctrl, bagControl = bagctrl) svmbag

2.3 boosting

  • boosting:另一种基于集成学习的方法,通过增加弱学习器的性能来获得强学习器的性能。
  • 类似bagging,boosting也是使用不同的重抽样数据中训练模型的集成学习,通过投票来决定最终的预测值。不同的是boosting中的重抽样数据集是专门构建用来产生互补的模型,而且选票不是同等重要,会根据性能进行加权。
  • boosting算法称为自适应boosting或AdaBoost,该算法产生弱分类器来迭代地学习训练集中很大比例的难以分类的样本,对经常分错的样本进行更多的关注(即给予更大的权重)。
  • boosting原理可用于几乎任何模型,但最常用于决策树,详见:【机器学习与R语言】4-决策树
  • 代码示例:
## Boosting ----

## Using C5.0 Decision Tree (not shown in book)
library(C50)
m_c50_bst <- C5.0(default ~ ., data = credit, trials = 100) ## Using AdaBoost.M1
library(adabag) # create a Adaboost.M1 model
set.seed(300)
m_adaboost <- boosting(default ~ ., data = credit)
p_adaboost <- predict(m_adaboost, credit)
head(p_adaboost$class)
p_adaboost$confusion # create and evaluate an Adaboost.M1 model using 10-fold-CV
set.seed(300)
adaboost_cv <- boosting.cv(default ~ ., data = credit)
adaboost_cv$confusion # calculate kappa
library(vcd)
Kappa(adaboost_cv$confusion)

2.4 随机森林

  • 随机森林(决策树森林):只关注决策树的集成学习。
  • 将bagging和随机特征选择结合起来,对决策树模型添加额外的多样性。在树的集成(森林)产生之后,该模型使用投票的方法来组合预测结果。
  • 随机森林特点:

1)训练随机森林

算法说明:

#创建分类器
m=randomForest(train,
class, #因子变量,训练集中的每一行的类别
ntree=500, #指定树的数目,默认500
mtry=sqrt(p)) #每次划分中随机选择的特征数目(默认sqrt(p),p是总特征数目) #预测
p=predict(m,test,
type="response") #response/prob/votes分别为预测类别/预测概率/投票数矩阵

仍然以包含16个特征的信用数据为例:

## Random Forests ----
# random forest with default settings
library(randomForest)
set.seed(300)
rf <- randomForest(default ~ ., data = credit)
rf



注意这个混淆矩阵不是重代入误差(前面提到的混淆矩阵),而是出包错误率(out-of-bag)(OOB估计错误率),它是对测试集合错误的一个无偏估计,表示对未来性能的一个合理估计。

在森林构建结束时,每个样本每次的预测值会被记录,通过投票来决定该样本最终的预测值,这种预测的总错误率就是出包错误率。

2)评估随机森林性能

randomForest函数得到了caret包的支持,允许在优化模型的同时计算出包错误率之外的性能度量指标。

①设置训练控制选项

library(caret)
ctrl <- trainControl(method = "repeatedcv",
number = 10, repeats = 10)

②对随机森林设置参数调整网格

mtry参数表每一次划分中要随机选择多少特征。默认sqrt(16)=4个特征,这里测试该数的一半,两倍及所有特征。

# auto-tune a random forest
grid_rf <- expand.grid(.mtry = c(2, 4, 8, 16))

当随机森林在每一次划分中用到所有特征时,实际上它与bagging决策树是一样的。

③train模型

set.seed(300)
m_rf <- train(default ~ ., data = credit, method = "rf",
metric = "Kappa", trControl = ctrl,
tuneGrid = grid_rf)
m_rf

以上工作非常耗时!

我们将它的结果与使用10、20、30、40次迭代来与boosting树进行比较。

# auto-tune a boosted C5.0 decision tree
grid_c50 <- expand.grid(.model = "tree",
.trials = c(10, 20, 30, 40),
.winnow = "FALSE") set.seed(300)
m_c50 <- train(default ~ ., data = credit, method = "C5.0",
metric = "Kappa", trControl = ctrl,
tuneGrid = grid_c50)
m_c50



结果表明,最好的随机森林模型比最好的C5.0决策树模型略胜一筹。


机器学习与R语言系列推文汇总:

【机器学习与R语言】1-机器学习简介

【机器学习与R语言】2-K近邻(kNN)

【机器学习与R语言】3-朴素贝叶斯(NB)

【机器学习与R语言】4-决策树

【机器学习与R语言】5-规则学习

【机器学习与R语言】6-线性回归

【机器学习与R语言】7-回归树和模型树

【机器学习与R语言】8-神经网络

【机器学习与R语言】9-支持向量机

【机器学习与R语言】10-关联规则

【机器学习与R语言】11-Kmeans聚类

【机器学习与R语言】12-如何评估模型的性能?

【机器学习与R语言】13-如何提高模型的性能?

【机器学习与R语言】13- 如何提高模型的性能?的更多相关文章

  1. 【机器学习与R语言】12- 如何评估模型的性能?

    目录 1.评估分类方法的性能 1.1 混淆矩阵 1.2 其他评价指标 1)Kappa统计量 2)灵敏度与特异性 3)精确度与回溯精确度 4)F度量 1.3 性能权衡可视化(ROC曲线) 2.评估未来的 ...

  2. 【机器学习与R语言】7-回归树和模型树

    目录 1.理解回归树和模型树 2.回归树和模型树应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理解回归树和模型树 决策树用于数值预测: 回归树:基于到达 ...

  3. 【机器学习与R语言】11- Kmeans聚类

    目录 1.理解Kmeans聚类 1)基本概念 2)kmeans运作的基本原理 2.Kmeans聚类应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解Km ...

  4. R语言解读多元线性回归模型

    转载:http://blog.fens.me/r-multi-linear-regression/ 前言 本文接上一篇R语言解读一元线性回归模型.在许多生活和工作的实际问题中,影响因变量的因素可能不止 ...

  5. 机器学习与R语言

    此书网上有英文电子版:Machine Learning with R - Second Edition [eBook].pdf(附带源码) 评价本书:入门级的好书,介绍了多种机器学习方法,全部用R相关 ...

  6. 【机器学习与R语言】10- 关联规则

    目录 1.理解关联规则 1)基本认识 2)Apriori算法 2.关联规则应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解关联规则 1)基本认识 购物 ...

  7. 【机器学习与R语言】9- 支持向量机

    目录 1.理解支持向量机(SVM) 1)SVM特点 2)用超平面分类 3)对非线性空间使用核函数 2. 支持向量机应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高性能 ...

  8. 【机器学习与R语言】8- 神经网络

    目录 1.理解神经网络 1)基本概念 2)激活函数 3)网络拓扑 4)训练算法 2.神经网络应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高性能 1.理解神经网络 1) ...

  9. 【机器学习与R语言】6-线性回归

    目录 1.理解回归 1)简单线性回归 2)普通最小二乘估计 3)相关系数 4)多元线性回归 2.线性回归应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理 ...

随机推荐

  1. 整理一下在 npmjs.com 上面发布资源包踩过的坑

    正常流程就不说了,网上有很多,比如写代码.打包.注册.登录.发布等. 邮箱要激活 在 npmjs.com 上面注册账号的时候需要填写邮箱,然后登录网址的时候并没有强制要求你去邮箱激活. 但是到了发布资 ...

  2. BUAA 2020 软件工程 软件分析案例作业

    Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件分析案例 我在这个课程的目标是 学习软件 ...

  3. 升级MySQL8.0的历险记

    最近忙于Fighting的项目,所以笔耕有些松懈,实为不该. 刚好遇到需要从MySQL5.7.33升级到MySQL8.0.x的需求,于是记录一下整个升级过程,踩坑而过. 背景梗概:本地docker容器 ...

  4. CODING 助力江苏高速信息实现组织敏捷与研发敏捷,领跑智慧交通新基建

    疫情之下的高速公路管控重任 江苏高速公路信息工程有限公司(以下简称:江苏高速信息)成立于 2002 年,是江苏交通控股旗下,专业从事高速公路领域机电系统集成.智能交通软硬件研发.大数据分析运营的高新技 ...

  5. 2019.03.27【GDOI2019】模拟 T3

    题目大意 给出$n$, $p$, 求有多少长度为$n$的排列可以被分成三个上升子序列, 数量对$p$取模, 数据范围 $3 \leq n \leq 500$. 思路 首先让我们考虑如果有一个排列,如何 ...

  6. 模拟赛18 T1 施工 题解

    前言: 真的是不容易啊.这个题在考场上想到了最关键的性质,但是没写出来. 后来写出来,一直调,小错不断. 没想到改的最后一个错误是两个int 乘起来爆了int 其实最后我还是觉得复杂度很假.\(n^2 ...

  7. stm32直流电机驱动与测速学习总结

    通过实验发现,定时器的一个通道控制一个pwm信号. 在正式开始之前也可以参考这个视频学习资料 (stm32直流电机驱动) http://www.makeru.com.cn/live/1392_1218 ...

  8. spring-cloud-square开发实战(三种类型全覆盖)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 前文<五分钟搞懂spring-clou ...

  9. CSS学习笔记:display属性

    目录 一.display属性概述 1. 块级元素和行内元素的区别 2.常见的块级元素和行内元素 3. display属性常见的属性值 二.测试display取各属性值的效果 1. 测试inline和b ...

  10. spark搭建

    1.上传解压,配置环境变量 配置bin目录 2.修改配置文件 conf cp spark-env.sh.template spark-env.sh 增加配置 export SPARK_MASTER_I ...