个性化阅读
专注于IT技术分析

R开发:SuperLearner集成学习

本文概述

你是否曾经想建立一个机器学习集合, 但不知道如何开始?本教程将帮助你使用SuperLearner。这个R包为你提供了一种使用高级功能创建机器学习集合的简便方法, 方法是使用流行的R机器学习库(例如glmnet, knn, randomForest等)提供标准化包装器以适合整体。

在本教程中, 你将解决以下主题:

什么是集成?在开始处理本教程提供的实际示例之前, 请仔细阅读一下集成的定义!

为什么选择SuperLearner?此软件包实际上有什么作用?

使用SuperLearner在R中集成学习:在本节中, 你将学习如何安装所需的软件包, 准备数据并创建第一个集成模型!你还将看到如何训练模式并进行预测。在本文中, 你将介绍内核支持向量机, 贝叶斯广义线性模型和装袋。最后, 你将看到如何调整超参数以进一步改善模型的性能!

完成后, 你将适合你的第一个集成, 预测的新数据和集成的部分。

什么是集成?

所有这些都很棒, 但是什么是集成呢?

当通过平均, 加权每个模型并将它们加在一起或使用模型之间最常见的观察结果来组合多个机器模型的概率预测或数值预测时, 就会出现整体。这提供了多重投票的方案, 这很可能会将预测推向正确的类别, 或者更接近回归模型中的正确数字。当适合的模型之间存在分歧时, 集成效果最好。组合多个模型的概念在实践中似乎也表现良好, 通常高于单个算法的实现。

可以通过拟合多个模型, 对每个模型进行预测然后组合来手动创建集成。

为什么选择SuperLearner?

既然你已经了解了什么是集成, 那么你可能会问自己SuperLearner库的确切功能。简单来说, SuperLearner是一种使用交叉验证来估计多个机器学习模型或具有不同设置的相同模型的性能的算法。然后, 使用测试数据性能创建这些模型的最佳加权平均值, 也称为”整体”。

但是, 为什么要使用SuperLearner?

即使你将在整个教程中进一步了解此R包的功能, 也可以考虑以下优点:

  • SuperLearner允许你通过简单地添加算法来拟合整体模型
  • 如你之前所读, SuperLearner使用交叉验证, 该验证固有地用于估计所有模型的风险。这使SuperLearner非常适合进行模型比较!
  • SuperLearner通过自动估计集合的权重来使集合高效。通常这是一项非常繁琐的任务, 需要大量的实验。
  • SuperLearner会自动删除对整体预测能力无贡献的模型, 这使你可以自由尝试多种算法!

让我们看一下使用SuperLearner的过程。

使用SuperLearner在R中整合学习

安装SuperLearner软件包

可以使用install.packages()函数从CRAN安装SuperLearner, 然后使用library()函数将其加载到你的工作空间中:

# Install the package
install.packages("SuperLearner")

# Load the package
library("SuperLearner")

准备数据

为了说明SuperLearner, 你将使用MASS软件包中的Pima Indian Women数据集。 MASS软件包包含一个训练集和一个测试集, 一个训练集用于训练一个模型, 而测试集则用于评估该模型在看不见的数据上的性能。该数据集提供了一些有关比马印第安妇女的描述性因素, 例如怀孕次数和年龄以及她们是否患有糖尿病。数据集的目的是试图预测糖尿病。

“类型”列是表明存在糖尿病的列。它是二进制的”是”或”否”列, 这意味着它遵循二项式分布。

请注意, 在没有太过理论的情况下, 二项式分布是伯努利试验的集合, 它们是概率的成功或失败测试。很容易识别出二项式分布, 因为只有两种可能的答案, 在这种情况下是”是”或”否”。为什么要这么做呢?好吧, SuperLearner要求你定义模型应属于的问题系列。在本教程后面的模型中, 你将更详细地看到这一点。

    # Get the `MASS` library
    library(MASS)

    # Train and test sets
    train <- Pima.tr
    test <- Pima.te

    # Print out the first lines of `train`
    head(train)
    ##   npreg glu bp skin  bmi   ped age type
    ## 1     5  86 68   28 30.2 0.364  24   No
    ## 2     7 195 70   33 25.1 0.163  55  Yes
    ## 3     5  77 82   41 35.8 0.156  35   No
    ## 4     0 165 76   43 47.9 0.259  26   No
    ## 5     0 107 60   25 26.4 0.133  23   No
    ## 6     5  97 76   27 35.6 0.378  52  Yes
    # Get a summary of `train`
    summary(train)
    ##      npreg            glu              bp              skin      
    ##  Min.   : 0.00   Min.   : 56.0   Min.   : 38.00   Min.   : 7.00  
    ##  1st Qu.: 1.00   1st Qu.:100.0   1st Qu.: 64.00   1st Qu.:20.75  
    ##  Median : 2.00   Median :120.5   Median : 70.00   Median :29.00  
    ##  Mean   : 3.57   Mean   :124.0   Mean   : 71.26   Mean   :29.21  
    ##  3rd Qu.: 6.00   3rd Qu.:144.0   3rd Qu.: 78.00   3rd Qu.:36.00  
    ##  Max.   :14.00   Max.   :199.0   Max.   :110.00   Max.   :99.00  
    ##       bmi             ped              age         type    
    ##  Min.   :18.20   Min.   :0.0850   Min.   :21.00   No :132  
    ##  1st Qu.:27.57   1st Qu.:0.2535   1st Qu.:23.00   Yes: 68  
    ##  Median :32.80   Median :0.3725   Median :28.00            
    ##  Mean   :32.31   Mean   :0.4608   Mean   :32.11            
    ##  3rd Qu.:36.50   3rd Qu.:0.6160   3rd Qu.:39.25            
    ##  Max.   :47.90   Max.   :2.2880   Max.   :63.00

提示:如果要了解有关此数据集变量的更多信息, 请使用help()函数, 如下所示:

help(Pima.tr)

通过运行以上命令, 你可以得出type列指示糖尿病。

如果是分类问题, SuperLearner还要求对响应变量进行编码。由于你正在解决二项式分类问题, 因此将变量类型的因子编码为0-1编码:

    y <- as.numeric(train[, 8])-1
    ytest <- as.numeric(test[, 8])-1

由于类型列是一个因数, 因此R会将其编码为1和2, 但这不是你想要的:理想情况下, 你希望使用编码为0和1的类型, 即”否”和”是”。 , 分别。在上面的代码块中, 从整个集合中减去1得到0-1编码。 R也将按因子顺序对此进行编码。

该软件包还要求预测变量(X)和响应(Y)处于其自己的数据结构中。你在上方拆分了Y, 现在你需要拆分X。你还将继续拆分测试集:

    x <- data.frame(train[, 1:7])
    xtest <- data.frame(test[, 1:7])

请注意, 某些算法不仅需要数据框, 还需要将模型矩阵另存为数据框。一个例子是nnet算法。解决回归问题时, 你几乎总是会使用模型矩阵为SuperLearner存储数据。模型矩阵所做的全部工作就是将因子变量分成各自的列, 并将其重新编码为0-1值, 而不是文本值。它不影响数值列。模型矩阵将增加算法必须处理的列数, 因此可能会增加计算时间。对于这样的较小数据集, 影响最小, 但是较大数据集可能会受到严重影响。这个故事的寓意是在拟合模型之前决定要尝试的算法。对于这个简单的示例, 你将只对现有数据结构使用数据框。

SuperLearner的第一个集成模型

要开始创建第一个模型, 可以使用以下命令预览包中可用的模型:

    listWrappers()
    ## All prediction algorithm wrappers in SuperLearner:

    ##  [1] "SL.bartMachine"      "SL.bayesglm"         "SL.biglasso"        
    ##  [4] "SL.caret"            "SL.caret.rpart"      "SL.cforest"         
    ##  [7] "SL.dbarts"           "SL.earth"            "SL.extraTrees"      
    ## [10] "SL.gam"              "SL.gbm"              "SL.glm"             
    ## [13] "SL.glm.interaction"  "SL.glmnet"           "SL.ipredbagg"       
    ## [16] "SL.kernelKnn"        "SL.knn"              "SL.ksvm"            
    ## [19] "SL.lda"              "SL.leekasso"         "SL.lm"              
    ## [22] "SL.loess"            "SL.logreg"           "SL.mean"            
    ## [25] "SL.nnet"             "SL.nnls"             "SL.polymars"        
    ## [28] "SL.qda"              "SL.randomForest"     "SL.ranger"          
    ## [31] "SL.ridge"            "SL.rpart"            "SL.rpartPrune"      
    ## [34] "SL.speedglm"         "SL.speedlm"          "SL.step"            
    ## [37] "SL.step.forward"     "SL.step.interaction" "SL.stepAIC"         
    ## [40] "SL.svm"              "SL.template"         "SL.xgboost"

    ## 
    ## All screening algorithm wrappers in SuperLearner:

    ## [1] "All"
    ## [1] "screen.corP"           "screen.corRank"        "screen.glmnet"        
    ## [4] "screen.randomForest"   "screen.SIS"            "screen.template"      
    ## [7] "screen.ttest"          "write.screen.template"

你会注意到有预测算法包装器和筛选算法包装器。这里有一些流行的库可用于分类, 回归或两者。筛选算法用于SuperLearner的自动变量选择。

如果要使用上述列表中的算法, 则需要在你的环境中安装该软件包。这是因为SuperLearner实际上是在调用这些包, 然后在使用该方法时对模型进行拟合。这也意味着, 例如, 如果你从不使用方法SL.caret, 则无需安装插入符号包。

拟合模型很简单, 但是你将通过一个模型示例逐步进行此过程。

你将适合Ranger算法, 这是著名的Random Forest的更快实现。

请记住, 随机森林是一种强大的方法, 实际上是决策树的集合。决策树通过观察数据并计算模型中每个变量之间的概率分担来工作, 从而为你提供了进行预测的途径。决策树习惯于对其数据过度拟合, 这意味着它们不能很好地推广到新数据。随机森林通过基于大量数据样本增长多个决策树来解决此问题, 然后对这些预测求平均值以找到正确的预测。它还仅为每个样本选择要素的子集, 这就是它与树袋的不同之处。这将创建一个不会过度拟合数据的模型。酷吧?

在这种情况下, 可能是你首先需要使用install.packages()函数安装Ranger库, 然后才能开始拟合模型。

如果这样做, 则可以继续使用SuperLearner()函数中的SL.ranger。

由于随机森林-游侠-在算法中包含随机抽样, 因此, 如果多次拟合, 将不会获得相同的结果。因此, 在本练习中, 你将设置种子, 以便可以重现示例并在相同的随机种子基线上比较多个模型。 R使用set.seed()设置随机种子。种子可以是任何数字, 在这种情况下, 你将使用150。

    set.seed(150)
    single.model <- SuperLearner(y, x, family=binomial(), SL.library=list("SL.ranger"))

SuperLearner需要一个Y变量(它是你想要的响应或结果), 一个X变量(这是预测变量), 要使用的族(可以是高斯或二项式)以及要以列表形式使用的库。在这种情况下就是SL.ranger。

你还记得你之前阅读过的整个二项式分布讨论吗?现在, 你明白了为什么需要知道:使用高斯模型将不会在0-1范围内产生正确的预测。

接下来, 只需打印模型即可得到系数, 该系数是算法在模型中的权重, 而风险因子是算法产生的误差。在幕后, 该软件包适合集成中使用的每种算法来产生风险因素。

    single.model
    ## 
    ## Call:  
    ## SuperLearner(Y = y, X = x, family = binomial(), SL.library = list("SL.ranger")) 
    ## 
    ## 
    ## 
    ##                    Risk Coef
    ## SL.ranger_All 0.1759541    1

在这种情况下, 你的风险因素小于0.20。当然, 这需要通过外部交叉验证和测试集中进行测试, 但这是一个好的开始。 SuperLearner的优点在于, 它试图通过使用交叉验证来自动构建整体。当然, 如果只有一个模型, 那么它将获得集成的全部重量。

因此, 这个单一模型很棒, 但是你无需SuperLearner即可做到。你如何拟合整体模型?

使用R:核支持向量机, 贝叶斯GLM和装袋法训练乐团

与SuperLearner集成非常简单, 只需选择要使用的算法即可。在这种情况下, 让我们从kernlab软件包中添加内核支持向量机(KSVM), 从arm软件包中添加贝叶斯广义线性模型(GLM), 从ipred软件包中添加装袋。

但是, KSVM和贝叶斯GLM是什么?

  • KSVM使用一种称为”内核技巧”的东西来计算点之间的距离。内核方法无需绘制特征图并计算坐标, 而可以计算点之间的内积。这样可以加快计算速度。然后, 使用支持向量机来学习分类中点之间的非线性边界。支持向量机尝试在通常是非线性的机器学习问题中在两类之间创建间隙。然后, 根据它们在空间中的位置对间隙两侧的新点进行分类。
  • 贝叶斯GLM模型只是逻辑回归的实现。至少在这种情况下, 你要对0-1问题进行分类。贝叶斯GLM与KSVM的不同之处在于, 它使用增强的回归算法来更新每一步的系数。套袋类似于上面的随机森林, 但没有对特征进行子设置。这意味着你将从随机样本中生长出多个决策树, 并将它们平均起来以获得预测。

现在, 让我们适合你的第一个集成!

提示:如果你还没有安装这些软件包, 请不要忘记安装它们!此外, 可能还会提示你安装其他必需的软件包。

    # Set the seed
    set.seed(150)

    # Fit the ensemble model
    model <- SuperLearner(y, x, family=binomial(), SL.library=list("SL.ranger", "SL.ksvm", "SL.ipredbagg", "SL.bayesglm"))

    # Return the model
    model
    ## 
    ## Call:  
    ## SuperLearner(Y = y, X = x, family = binomial(), SL.library = list("SL.ranger", ##     "SL.ksvm", "SL.ipredbagg", "SL.bayesglm")) 
    ## 
    ## 
    ##                       Risk     Coef
    ## SL.ranger_All    0.1756230 0.000000
    ## SL.ksvm_All      0.1838340 0.000000
    ## SL.ipredbagg_All 0.1664828 0.524182
    ## SL.bayesglm_All  0.1677593 0.475818

添加这些算法可以改善你的模型并改变环境。游骑兵和KVSM的系数为零, 这意味着它不再被加权为整体的一部分。 Bayes GLM和Bagging构成了模型的其余部分。你会注意到SuperLearner正在为你计算此风险, 并确定最佳模型组合以减少误差。

要了解每个模型对模型和变体的特定贡献, 可以使用SuperLearner的内部交叉验证函数CV.SuperLearner()。要设置折叠数, 可以使用V参数。在这种情况下, 你将其设置为5:

    # Set the seed
    set.seed(150)

    # Get V-fold cross-validated risk estimate
    cv.model <- CV.SuperLearner(y, x, V=5, SL.library=list("SL.ranger", "SL.ksvm", "SL.ipredbagg", "SL.bayesglm"))

    # Print out the summary statistics
    summary(cv.model)
    ## 
    ## Call:  
    ## CV.SuperLearner(Y = y, X = x, V = 5, SL.library = list("SL.ranger", ##     "SL.ksvm", "SL.ipredbagg", "SL.bayesglm")) 
    ## 
    ## Risk is based on: Mean Squared Error
    ## 
    ## All risk estimates are based on V =  5 
    ## 
    ##         Algorithm     Ave       se     Min     Max
    ##     Super Learner 0.17277 0.014801 0.16250 0.19557
    ##       Discrete SL 0.17964 0.014761 0.16363 0.19244
    ##     SL.ranger_All 0.17866 0.015004 0.14811 0.20518
    ##       SL.ksvm_All 0.19382 0.020301 0.15685 0.26215
    ##  SL.ipredbagg_All 0.17791 0.015858 0.15831 0.19244
    ##   SL.bayesglm_All 0.16628 0.014318 0.15322 0.18022

交叉验证的摘要显示了模型的平均风险, 模型的变化以及风险的范围。

绘制此图还会产生一个很好的使用模型及其变化的图:

    plot(cv.model)
R中的整体学习

很容易看出, 贝叶斯GLM平均表现最好, 而KSVM表现最差, 并且与其他模型相比, 包含很多变化。 SuperLearner的优点在于, 如果模型拟合得不好或贡献不大, 则它只会加权为零!除非你计划将来再训练模型, 否则无需删除它并进行训练。请记住, 适当的模型训练需要对整个模型进行交叉验证。在实际环境中, 这就是你在预测新数据之前确定模型风险的方式。

用SuperLearner进行预测

使用特定的命令Forecast.SuperLearner(), 你可以轻松地对新数据集进行预测。这意味着你不能使用普通的predict()函数!

    predictions <- predict.SuperLearner(model, newdata=xtest)

函数predict.SuperLearner()接受模型参数(SuperLearner拟合模型)和新数据进行预测。预测将首先返回整体的整体预测:

    head(predictions$pred)
    ##            [, 1]
    ## [1, ] 0.79322181
    ## [2, ] 0.11895658
    ## [3, ] 0.04612200
    ## [4, ] 0.05928159
    ## [5, ] 0.68824522
    ## [6, ] 0.54373451

它还将返回各个库的预测:

    head(predictions$library.predict)
    ##      SL.ranger_All SL.ksvm_All SL.ipredbagg_All SL.bayesglm_All
    ## [1, ]         0.796   0.8089502       0.82086658      0.76276712
    ## [2, ]         0.129   0.1580203       0.18586049      0.04525230
    ## [3, ]         0.016   0.1579566       0.06255427      0.02801949
    ## [4, ]         0.102   0.1885473       0.07238268      0.04484885
    ## [5, ]         0.638   0.7108875       0.58791672      0.79877149
    ## [6, ]         0.550   0.6898737       0.37488066      0.72975132

这使你可以查看每个模型如何对每个观察进行分类。这在调试模型或一次拟合多个模型以查看进一步使用时可能很有用。

你可能已经注意到返回的预测数量。它们是概率形式。这意味着你将需要一个截止阈值来确定是否应将一个或零个分类。仅在二项式分类情况下才需要这样做, 而无需回归。

通常, 你将在交叉验证的训练中确定这一点, 但是为简单起见, 你将使用0.50的临界值。由于这是一个简单的二项式问题, 因此你将使用dplyr的ifelse()函数来重新编码概率:

    # Load the package
    library(dplyr)

    # Recode probabilities
    conv.preds <- ifelse(predictions$pred>=0.5, 1, 0)

现在, 你可以使用插入符号构建混淆矩阵以查看结果:

    # Load in `caret`
    library(caret)

    # Create the confusion matrix
    cm <- confusionMatrix(conv.preds, ytest)

    # Return the confusion matrix
    cm
    ## Confusion Matrix and Statistics
    ## 
    ##           Reference
    ## Prediction   0   1
    ##          0 199  45
    ##          1  24  64
    ##                                           
    ##                Accuracy : 0.7922          
    ##                  95% CI : (0.7445, 0.8345)
    ##     No Information Rate : 0.6717          
    ##     P-Value [Acc > NIR] : 8.166e-07       
    ##                                           
    ##                   Kappa : 0.5044          
    ##  Mcnemar's Test P-Value : 0.01605         
    ##                                           
    ##             Sensitivity : 0.8924          
    ##             Specificity : 0.5872          
    ##          Pos Pred Value : 0.8156          
    ##          Neg Pred Value : 0.7273          
    ##              Prevalence : 0.6717          
    ##          Detection Rate : 0.5994          
    ##    Detection Prevalence : 0.7349          
    ##       Balanced Accuracy : 0.7398          
    ##                                           
    ##        'Positive' Class : 0               
    ##

你在该数据集上获得的准确度为0.7921687, 对于该数据集而言, 这是很好的性能。许多算法的得分更高, 但这对于快速集成很有用。通过交叉验证的适当培训并尝试一些不同的模型, 很容易看出如何快速提高该分数。

调整超参数

虽然模型的性能并不糟糕, 但是你可以尝试通过调整集合中某些模型的一些超参数来提高性能。在你的模型中, Ranger的权重并不高, 但这也许是因为你需要更多的树并且需要调整mtry参数。也许你也可以通过将nbagg参数从默认值25增加到250来改善装袋。

有两种方法可以执行此操作:你可以定义一个调用学习者并修改参数的函数, 也可以使用create.Learner()函数。在下一部分中, 你将了解有关这些选项的更多信息。

定义功能

第一个是在function()的帮助下。在这里, 你将定义一个调用学习者并修改参数的函数。函数调用使用省略号…将其他参数传递给函数。这三个小点允许对公式进行修改, 而不必在函数中指定这些修改是什么。这意味着, 如果要更改10个参数, 则函数中不需要10个对象即可在函数内进行映射。这是编写函数的通用方法。

    SL.ranger.tune <- function(...){
      SL.ranger(..., num.trees=1000, mtry=2)
    }

    SL.ipredbagg.tune <- function(...){
      SL.ipredbagg(..., nbagg=250)
    }

SL.ranger.tune是修改后的Ranger方法的名称, 而SL.ipredbagg.tune是修改后的ipredbagg方法的名称。现在, 你已经创建了一些新的学习器功能, 你可以将它们传递给交叉验证公式, 以查看性能是否有所提高。

请注意, 你将原始SL.ranger和SL.ipredbagg函数保留在算法中, 以查看性能在你调整后的版本上是否有所改善。

    # Set the seed
    set.seed(150)

    # Tune the model
    cv.model.tune <- CV.SuperLearner(y, x, V=5, SL.library=list("SL.ranger", "SL.ksvm", "SL.ipredbagg", "SL.bayesglm", "SL.ranger.tune", "SL.ipredbagg.tune"))

    # Get summary statistics
    summary(cv.model.tune)
    ## 
    ## Call:  
    ## CV.SuperLearner(Y = y, X = x, V = 5, SL.library = list("SL.ranger", ##     "SL.ksvm", "SL.ipredbagg", "SL.bayesglm", "SL.ranger.tune", "SL.ipredbagg.tune")) 
    ## 
    ## 
    ## Risk is based on: Mean Squared Error
    ## 
    ## All risk estimates are based on V =  5 
    ## 
    ##              Algorithm     Ave       se     Min     Max
    ##          Super Learner 0.17272 0.014969 0.15849 0.19844
    ##            Discrete SL 0.17250 0.014989 0.15645 0.18430
    ##          SL.ranger_All 0.17897 0.015084 0.15388 0.19920
    ##            SL.ksvm_All 0.19573 0.020278 0.16095 0.26304
    ##       SL.ipredbagg_All 0.17667 0.015629 0.16473 0.18898
    ##        SL.bayesglm_All 0.16628 0.014318 0.15322 0.18022
    ##     SL.ranger.tune_All 0.17637 0.014882 0.15218 0.19793
    ##  SL.ipredbagg.tune_All 0.17813 0.015869 0.16455 0.19260
    # Plot the tuned model
    plot(cv.model.tune)
一起R

从该图中可以看出, 随着SL.ipredbagg.tune中增加nbagg参数, ipredbagg似乎有所改善。调整参数似乎会使Ranger变得更糟, 但让我们将其保留下来, 看看SuperLearner是否发现它是相关的。

再次强调, 如果没有意义, SuperLearner只会将其设置为零。请记住, 最好的集成不是由性能最好的算法组成, 而是由最能互补的算法对预测进行分类。

让我们用调整后的参数拟合新模型, 看看它们如何加权:

    # Set the seed
    set.seed(150)

    # Create the tuned model
    model.tune <- SuperLearner(y, x, SL.library=list("SL.ranger", "SL.ksvm", "SL.ipredbagg", "SL.bayesglm", "SL.ranger.tune", "SL.ipredbagg.tune"))

    # Return the tuned model
    model.tune
    ## 
    ## Call:  
    ## SuperLearner(Y = y, X = x, SL.library = list("SL.ranger", "SL.ksvm", ##     "SL.ipredbagg", "SL.bayesglm", "SL.ranger.tune", "SL.ipredbagg.tune")) 
    ## 
    ## 
    ## 
    ##                            Risk      Coef
    ## SL.ranger_All         0.1748247 0.0000000
    ## SL.ksvm_All           0.1974033 0.0000000
    ## SL.ipredbagg_All      0.1745503 0.0000000
    ## SL.bayesglm_All       0.1634855 0.7162423
    ## SL.ranger.tune_All    0.1725514 0.0000000
    ## SL.ipredbagg.tune_All 0.1711161 0.2837577

现在, SL.bayesglm和SL.ipredbagg.tune是唯一加权的算法。对测试集进行预测将得出以下结果:

    # Gather predictions for the tuned model
    predictions.tune <- predict.SuperLearner(model.tune, newdata=xtest)

    # Recode predictions
    conv.preds.tune <- ifelse(predictions.tune$pred>=0.5, 1, 0)

    # Return the confusion matrix
    confusionMatrix(conv.preds.tune, ytest)
    ## Confusion Matrix and Statistics
    ## 
    ##           Reference
    ## Prediction   0   1
    ##          0 200  43
    ##          1  23  66
    ##                                           
    ##                Accuracy : 0.8012          
    ##                  95% CI : (0.7542, 0.8428)
    ##     No Information Rate : 0.6717          
    ##     P-Value [Acc > NIR] : 1.116e-07       
    ##                                           
    ##                   Kappa : 0.5271          
    ##  Mcnemar's Test P-Value : 0.01935         
    ##                                           
    ##             Sensitivity : 0.8969          
    ##             Specificity : 0.6055          
    ##          Pos Pred Value : 0.8230          
    ##          Neg Pred Value : 0.7416          
    ##              Prevalence : 0.6717          
    ##          Detection Rate : 0.6024          
    ##    Detection Prevalence : 0.7319          
    ##       Balanced Accuracy : 0.7512          
    ##                                           
    ##        'Positive' Class : 0               
    ##

这使你对测试集有所改善, 并说明了使用SuperLearner进行模型调整的概念。

create.Learner()

调整超参数的第二种方法是使用create.Learner()函数。这使你可以自定义现有的SuperLearner:

    learner <- create.Learner("SL.ranger", params=list(num.trees=1000, mtry=2))
    learner2 <- create.Learner("SL.ipredbagg", params=list(nbagg=250))

学习者字符串是create.Learner()函数的第一个参数。然后, 你传递要修改的参数列表。这将创建一个对象:

    learner
    ## $grid
    ## NULL
    ## 
    ## $names
    ## [1] "SL.ranger_1"
    ## 
    ## $base_learner
    ## [1] "SL.ranger"
    ## 
    ## $params
    ## $params$num.trees
    ## [1] 1000
    ## 
    ## $params$mtry
    ## [1] 2

现在, 将学习者传递给SuperLearner时, 可以在学习者对象中使用名称对象:

    # Set the seed
    set.seed(150)

    # Create a second tuned model
    cv.model.tune2 <- CV.SuperLearner(y, x, V=5, SL.library=list("SL.ranger", "SL.ksvm", "SL.ipredbagg", "SL.bayesglm", learner$names, learner2$names))

    # Get summary statistics
    summary(cv.model.tune2)
    ## 
    ## Call:  
    ## CV.SuperLearner(Y = y, X = x, V = 5, SL.library = list("SL.ranger", ##     "SL.ksvm", "SL.ipredbagg", "SL.bayesglm", learner$names, learner2$names)) 
    ## 
    ## 
    ## Risk is based on: Mean Squared Error
    ## 
    ## All risk estimates are based on V =  5 
    ## 
    ##           Algorithm     Ave       se     Min     Max
    ##       Super Learner 0.17272 0.014969 0.15849 0.19844
    ##         Discrete SL 0.17250 0.014989 0.15645 0.18430
    ##       SL.ranger_All 0.17897 0.015084 0.15388 0.19920
    ##         SL.ksvm_All 0.19573 0.020278 0.16095 0.26304
    ##    SL.ipredbagg_All 0.17667 0.015629 0.16473 0.18898
    ##     SL.bayesglm_All 0.16628 0.014318 0.15322 0.18022
    ##     SL.ranger_1_All 0.17637 0.014882 0.15218 0.19793
    ##  SL.ipredbagg_1_All 0.17813 0.015869 0.16455 0.19260
    # Plot `cv.model.tune2`
    plot(cv.model.tune2)
集成机器学习R

最终结果与使用第一种方法相同。你可以使用所需的任何方法。

R中的更多集成模型和机器学习

哇, 你覆盖了很多领域!到目前为止, 你应该已经对SuperLearner有了很好的了解, 并且应该已经成功地将你的第一套产品与SuperLearner结合在一起。该软件包使快速添加模型变得非常容易。方法和使用的数据格式有些细微差别。但是, 如果有疑问, 保存为数据框的模型矩阵几乎总是可以工作。

提醒一下, 你安装并加载了SuperLearner, 设置了数据集的格式, 拟合了单个模型, 拟合了第一个集合, 并用集合进行了预测并调整了一些超参数!

下一步将是使用此软件包来解决一些更高级的主题, 例如并行化, 特征选择和筛选, 使用模型矩阵, 编写自己的SuperLearner和集成交叉验证。

赞(8)
未经允许不得转载:srcmini » R开发:SuperLearner集成学习

评论 抢沙发

评论前必须登录!