生物信息统计分析与数据挖掘

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

2020-09-14  本文已影响0人  生物信息与育种

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

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会重复地生成数据的随机抽样,建立决策树模型,计算性能统计量,并且对结果进行评估。


image.png

结果分为4部分:

将最佳模型进行预测:

# 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 定制调整参数

## 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
image.png
③定制参数训练
# 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
image.png

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

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

image.png
分配函数决定每个模型接受完整的训练集还是某个抽样的样本。
组合函数用来对预测中的不一致进行调节。
堆叠:使用多个模型的预测来训练一个仲裁模型的过程。

集成学习的好处:

2.2 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)
image.png

模型训练得不错,再通过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)
image.png
# 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 ----

## 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 随机森林

image.png

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
image.png
注意这个混淆矩阵不是重代入误差(前面提到的混淆矩阵),而是出包错误率(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

以上工作非常耗时!


image.png

我们将它的结果与使用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
image.png

结果表明,最好的随机森林模型比最好的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-如何提高模型的性能?

上一篇下一篇

猜你喜欢

热点阅读