【Machine Learning in R - Next Generation • mlr3】

本篇主要介绍mlr3包的基本使用。

一个简单的机器学习流程在mlr3中可被分解为以下几个部分:

  • 创建任务
    比如回归、分裂、生存分析、降维、密度任务等等
  • 挑选学习器(算法/模型)
    比如随机森林、决策树、SVM、KNN等等
  • 训练和预测

创建任务

本次示例将使用mtcars数据集创建一个回归任务,结果变量(或者叫因变量等等)是mpg

# 首先加载数据
data("mtcars",package = "datasets")
data <- mtcars[,1:3]
str(data)
## 'data.frame':	32 obs. of  3 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...

使用as_task_regr()创建回归任务,as_task_classif()可创建分类任务。

library(mlr3)

task_mtcars <- as_task_regr(data,target = "mpg",id="cars") # id是随便起一个名字
print(task_mtcars)
## <TaskRegr:cars> (32 x 3)
## * Target: mpg
## * Properties: -
## * Features (2):
##   - dbl (2): cyl, disp

可以看到数据以供32行,3列,target是mpg,feature是cyl和disp,都是bdl类型。

在创建模型前先探索数据:

library("mlr3viz") # 使用此包可视化数据
autoplot(task_mtcars, type = "pairs") # 基于GGally,我之前介绍过
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2

plot of chunk unnamed-chunk-3

如果你觉得每次加载1个R包很烦,可以直接使用library(mlr3verse)加载所有基础包!

如果你想使用自带数据集进行学习,此包也自带了很多流行的机器学习数据集。

查看内置数据集:

as.data.table(mlr_tasks)
##                key task_type nrow ncol properties lgl int dbl chr fct ord pxc
##  1: boston_housing      regr  506   19              0   3  13   0   2   0   0
##  2:  breast_cancer   classif  683   10   twoclass   0   0   0   0   0   9   0
##  3:  german_credit   classif 1000   21   twoclass   0   3   0   0  14   3   0
##  4:           iris   classif  150    5 multiclass   0   0   4   0   0   0   0
##  5:         mtcars      regr   32   11              0   0  10   0   0   0   0
##  6:       penguins   classif  344    8 multiclass   0   3   2   0   2   0   0
##  7:           pima   classif  768    9   twoclass   0   0   8   0   0   0   0
##  8:          sonar   classif  208   61   twoclass   0   0  60   0   0   0   0
##  9:           spam   classif 4601   58   twoclass   0   0  57   0   0   0   0
## 10:           wine   classif  178   14 multiclass   0   2  11   0   0   0   0
## 11:            zoo   classif  101   17 multiclass  15   1   0   0   0   0   0

结果很详细,给出了任务类型,行列数,变量类型等。

如果想要使用内置数据集,可使用以下代码:

task_penguin <- tsk("penguins")
print(task_penguin)
## <TaskClassif:penguins> (344 x 8)
## * Target: species
## * Properties: multiclass
## * Features (7):
##   - int (3): body_mass, flipper_length, year
##   - dbl (2): bill_depth, bill_length
##   - fct (2): island, sex

可以非常方便的取子集查看:

library("mlr3verse")
as.data.table(mlr_tasks)[, 1:4]
##                key task_type  nrow ncol
##  1:           actg      surv  1151   13
##  2:   bike_sharing      regr 17379   14
##  3: boston_housing      regr   506   19
##  4:  breast_cancer   classif   683   10
##  5:       faithful      dens   272    1
##  6:           gbcs      surv   686   10
##  7:  german_credit   classif  1000   21
##  8:          grace      surv  1000    8
##  9:           ilpd   classif   583   11
## 10:           iris   classif   150    5
## 11:     kc_housing      regr 21613   20
## 12:           lung      surv   228   10
## 13:      moneyball      regr  1232   15
## 14:         mtcars      regr    32   11
## 15:      optdigits   classif  5620   65
## 16:       penguins   classif   344    8
## 17:           pima   classif   768    9
## 18:         precip      dens    70    1
## 19:           rats      surv   300    5
## 20:          sonar   classif   208   61
## 21:           spam   classif  4601   58
## 22:        titanic   classif  1309   11
## 23:   unemployment      surv  3343    6
## 24:      usarrests     clust    50    4
## 25:           whas      surv   481   11
## 26:           wine   classif   178   14
## 27:            zoo   classif   101   17
##                key task_type  nrow ncol

支持非常多探索数据的操作:

task_penguin$ncol
## [1] 8
task_penguin$nrow
## [1] 344
task_penguin$feature_names
## [1] "bill_depth"     "bill_length"    "body_mass"      "flipper_length"
## [5] "island"         "sex"            "year"
task_penguin$feature_types
##                id    type
## 1:     bill_depth numeric
## 2:    bill_length numeric
## 3:      body_mass integer
## 4: flipper_length integer
## 5:         island  factor
## 6:            sex  factor`在这里插入代码片`
## 7:           year integer
task_penguin$target_names
## [1] "species"
task_penguin$task_type
## [1] "classif"
task_penguin$data()
##        species bill_depth bill_length body_mass flipper_length    island    sex
##   1:    Adelie       18.7        39.1      3750            181 Torgersen   male
##   2:    Adelie       17.4        39.5      3800            186 Torgersen female
##   3:    Adelie       18.0        40.3      3250            195 Torgersen female
##   4:    Adelie         NA          NA        NA             NA Torgersen   <NA>
##   5:    Adelie       19.3        36.7      3450            193 Torgersen female
##  ---                                                                           
## 340: Chinstrap       19.8        55.8      4000            207     Dream   male
## 341: Chinstrap       18.1        43.5      3400            202     Dream female
## 342: Chinstrap       18.2        49.6      3775            193     Dream   male
## 343: Chinstrap       19.0        50.8      4100            210     Dream   male
## 344: Chinstrap       18.7        50.2      3775            198     Dream female
##      year
##   1: 2007
##   2: 2007
##   3: 2007
##   4: 2007
##   5: 2007
##  ---     
## 340: 2009
## 341: 2009
## 342: 2009
## 343: 2009
## 344: 2009
task_penguin$head(3)
##    species bill_depth bill_length body_mass flipper_length    island    sex
## 1:  Adelie       18.7        39.1      3750            181 Torgersen   male
## 2:  Adelie       17.4        39.5      3800            186 Torgersen female
## 3:  Adelie       18.0        40.3      3250            195 Torgersen female
##    year
## 1: 2007
## 2: 2007
## 3: 2007
# 还有很多行列选择操作、改变变量的id(比如某个变量不参与模型训练)等多种操作

可视化数据:很多都是基于GGally包,可以看我之前的介绍

autoplot(task_penguin)
  • 1

plot of chunk unnamed-chunk-8

autoplot(task_penguin, type = "pairs")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

plot of chunk unnamed-chunk-9

autoplot(task_penguin, type = "duo")
  • 1

plot of chunk unnamed-chunk-10

创建learner

所有的学习器都通过以下2个步骤工作:
image-20220227212306631

mlr3verse只支持常见的学习器,比如随机森林、决策树、SVM、KNN等,如果想要查看所有的学习器,可以安装mlr3extralearners

查看所有的支持的learner:
All learners

# 加载R包,常见的算法
library("mlr3verse")
mlr_learners
## <DictionaryLearner> with 53 stored values
## Keys: classif.cv_glmnet, classif.debug, classif.featureless,
##   classif.glmnet, classif.kknn, classif.lda, classif.log_reg,
##   classif.multinom, classif.naive_bayes, classif.nnet, classif.qda,
##   classif.ranger, classif.rpart, classif.svm, classif.xgboost,
##   clust.agnes, clust.ap, clust.cmeans, clust.cobweb, clust.dbscan,
##   clust.diana, clust.em, clust.fanny, clust.featureless, clust.ff,
##   clust.hclust, clust.kkmeans, clust.kmeans, clust.MBatchKMeans,
##   clust.meanshift, clust.pam, clust.SimpleKMeans, clust.xmeans,
##   dens.hist, dens.kde, regr.cv_glmnet, regr.debug, regr.featureless,
##   regr.glmnet, regr.kknn, regr.km, regr.lm, regr.ranger, regr.rpart,
##   regr.svm, regr.xgboost, surv.coxph, surv.cv_glmnet, surv.glmnet,
##   surv.kaplan, surv.ranger, surv.rpart, surv.xgboost

创建learner

# 决策树
learner = lrn("classif.rpart")
print(learner)
## <LearnerClassifRpart:classif.rpart>
## * Model: -
## * Parameters: xval=0
## * Packages: mlr3, rpart
## * Predict Type: response
## * Feature types: logical, integer, numeric, factor, ordered
## * Properties: importance, missings, multiclass, selected_features,
##   twoclass, weights

查看支持的超参数

learner$param_set
## <ParamSet>
##                 id    class lower upper nlevels        default value
##  1:             cp ParamDbl     0     1     Inf           0.01      
##  2:     keep_model ParamLgl    NA    NA       2          FALSE      
##  3:     maxcompete ParamInt     0   Inf     Inf              4      
##  4:       maxdepth ParamInt     1    30      30             30      
##  5:   maxsurrogate ParamInt     0   Inf     Inf              5      
##  6:      minbucket ParamInt     1   Inf     Inf <NoDefault[3]>      
##  7:       minsplit ParamInt     1   Inf     Inf             20      
##  8: surrogatestyle ParamInt     0     1       2              0      
##  9:   usesurrogate ParamInt     0     2       3              2      
## 10:           xval ParamInt     0   Inf     Inf             10     0

一目了然,方便使用,记不住了可以看看,毕竟太多了,这一点比tidymodels贴心。

设定超参数的值

learner$param_set$values = list(cp = 0.01, xval = 0)
learner
## <LearnerClassifRpart:classif.rpart>
## * Model: -
## * Parameters: cp=0.01, xval=0
## * Packages: mlr3, rpart
## * Predict Type: response
## * Feature types: logical, integer, numeric, factor, ordered
## * Properties: importance, missings, multiclass, selected_features,
##   twoclass, weights

也可以在指定learner时设定

learner = lrn("classif.rpart", xval=0, cp = 0.001)
learner$param_set$values
## $xval
## [1] 0
## 
## $cp
## [1] 0.001

训练、预测和性能评价

创建任务,选择模型

library("mlr3verse")

task = tsk("penguins") # 使用内置数据集
learner = lrn("classif.rpart") #决策树分类

划分训练集和测试集

spilt <- partition(task,ratio = 0.6, stratify = T)
spilt$train
##   [1]   2   3   4   5   7   8  10  11  12  14  15  16  17  19  23  25  26  27
##  [19]  28  30  31  33  34  36  37  40  42  45  46  48  50  51  53  56  59  60
##  [37]  61  62  64  66  67  68  69  71  73  75  78  82  83  84  88  89  91  94
##  [55]  96  97  99 100 101 102 104 107 108 113 114 115 118 120 121 123 125 126
##  [73] 127 128 129 130 131 132 133 135 136 137 138 139 142 143 145 149 150 151
##  [91] 152 154 156 157 159 160 163 169 170 171 172 173 175 176 179 180 181 182
## [109] 183 186 187 188 189 193 194 197 199 200 201 203 206 208 210 211 212 213
## [127] 214 215 216 218 219 220 222 223 224 225 226 228 229 230 233 236 237 239
## [145] 240 241 242 243 247 248 249 252 253 254 255 256 257 259 260 262 266 271
## [163] 272 273 274 277 279 280 285 288 290 291 293 294 295 296 297 299 300 301
## [181] 302 304 305 306 309 310 312 313 317 319 321 322 323 324 325 328 330 331
## [199] 332 334 337 338 339 340 341 342

训练模型

learner$train(task, row_ids = spilt$train)
print(learner$model)
## n= 206 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
## 1) root 206 115 Adelie (0.44174757 0.19902913 0.35922330)  
##   2) flipper_length< 207.5 128  39 Adelie (0.69531250 0.30468750 0.00000000)  
##     4) bill_length< 42.35 86   0 Adelie (1.00000000 0.00000000 0.00000000) *
##     5) bill_length>=42.35 42   3 Chinstrap (0.07142857 0.92857143 0.00000000) *
##   3) flipper_length>=207.5 78   4 Gentoo (0.02564103 0.02564103 0.94871795) *

预测

prediction <- learner$predict(task, row_ids = spilt$test)
print(prediction)
## <PredictionClassif> for 138 observations:
##     row_ids     truth  response
##           1    Adelie    Adelie
##           6    Adelie    Adelie
##           9    Adelie    Adelie
## ---                            
##         336 Chinstrap Chinstrap
##         343 Chinstrap    Gentoo
##         344 Chinstrap Chinstrap

混淆矩阵

prediction$confusion
##            truth
## response    Adelie Chinstrap Gentoo
##   Adelie        53         1      0
##   Chinstrap      8        24      2
##   Gentoo         0         2     48

可视化

autoplot(prediction)
  • 1

plot of chunk unnamed-chunk-21

模型评价

先查看下支持的评价指标

mlr_measures
## <DictionaryMeasure> with 87 stored values
## Keys: aic, bic, classif.acc, classif.auc, classif.bacc, classif.bbrier,
##   classif.ce, classif.costs, classif.dor, classif.fbeta, classif.fdr,
##   classif.fn, classif.fnr, classif.fomr, classif.fp, classif.fpr,
##   classif.logloss, classif.mbrier, classif.mcc, classif.npv,
##   classif.ppv, classif.prauc, classif.precision, classif.recall,
##   classif.sensitivity, classif.specificity, classif.tn, classif.tnr,
##   classif.tp, classif.tpr, clust.ch, clust.db, clust.dunn,
##   clust.silhouette, clust.wss, debug, dens.logloss, oob_error,
##   regr.bias, regr.ktau, regr.mae, regr.mape, regr.maxae, regr.medae,
##   regr.medse, regr.mse, regr.msle, regr.pbias, regr.rae, regr.rmse,
##   regr.rmsle, regr.rrse, regr.rse, regr.rsq, regr.sae, regr.smape,
##   regr.srho, regr.sse, selected_features, sim.jaccard, sim.phi,
##   surv.brier, surv.calib_alpha, surv.calib_beta, surv.chambless_auc,
##   surv.cindex, surv.dcalib, surv.graf, surv.hung_auc, surv.intlogloss,
##   surv.logloss, surv.mae, surv.mse, surv.nagelk_r2, surv.oquigley_r2,
##   surv.rmse, surv.schmid, surv.song_auc, surv.song_tnr, surv.song_tpr,
##   surv.uno_auc, surv.uno_tnr, surv.uno_tpr, surv.xu_r2, time_both,
##   time_predict, time_train

这里我们选择accuracy

measure <- msr("classif.acc")
prediction$score(measure)
## classif.acc 
##   0.9057971

选择多个指标:

measures <- msrs(c("classif.acc","classif.auc","classif.ce"))
prediction$score(measures)
## classif.acc classif.auc  classif.ce 
##   0.9057971         NaN   0.0942029

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/149534.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创信短信API的无代码开发集成:电商平台、CRM和用户运营

无代码开发&#xff1a;集简云与创信短信API的连接 创信短信API的无代码开发集成&#xff0c;旨在为电商平台、CRM和用户运营提供便利。作为一款超级软件连接器&#xff0c;集简云可以在无需开发&#xff0c;无需代码知识的情况下&#xff0c;轻松连接创信短信与近千款软件系统…

软文营销如何正确蹭热点?媒介盒子为您解答

软文营销过程中为什么需要借助热点营销&#xff1f;热点营销的三大优势就是“传播速度快、爆发效果猛、有效时间短”&#xff0c;追热点的最终目的就是为了给产品或品牌带来关注度。 虽然蹭热点很重要&#xff0c;但是也有许多品牌在营销过程中因为没搞清楚状况就翻车&#xf…

Qt 5.15.11 源码windows编译

1.下载qt5.15.11源码 https://download.qt.io/official_releases/qt/5.15/5.15.11/single/qt-everywhere-opensource-src-5.15.11.zip 2.解码源码到桌面 3.安装cmake ,python ,perl, Visual Studio 2019 Strawberry Perl for Windows Win flex-bison download | SourceForge…

如何在Windows 10中进行屏幕截图

本文介绍如何在Windows 10中捕获屏幕截图&#xff0c;包括使用键盘组合、使用Snipping Tool、Snipp&Sketch Tool或Windows游戏栏。 使用打印屏幕在Windows 10中捕获屏幕截图 在Windows 10中捕获屏幕截图的最简单方法是按下键盘上的PrtScWindows键盘组合。你将看到屏幕短暂…

ETL数据转换工具类型与适用场景

ETL数据转换工具在企业数据管理中扮演着重要的角色&#xff0c;能够帮助企业从多个数据源中提取、转换和加载数据&#xff0c;实现数据整合和分析。以下是针对Kettle、DataX和ETLCloud这几个工具的详细介绍及其适用场景。 Kettle&#xff08;Pentaho Data Integration&#xf…

正则表达式入门教程

一、本文目标 让你明白正则表达式是什么&#xff0c;并对它有一些基本的了解&#xff0c;让你可以在自己的程序或网页里使用它。 二、如何使用本教程 文本格式约定&#xff1a;专业术语 元字符/语法格式 正则表达式 正则表达式中的一部分(用于分析) 对其进行匹配的源字符串 …

C# 使用Microsoft.Office.Interop.Excel库操作Excel

1.在NuGet管理包中搜索&#xff1a;Microsoft.Office.Interop.Excel&#xff0c;如下图红色标记处所示&#xff0c;进行安装 2. 安装完成后&#xff0c;在程序中引入命名空间如下所示&#xff1a; using Microsoft.Office.Interop.Excel; //第一步 添加excel第三方库 usi…

JTS: 24 MinimumDiameter 最小矩形

文章目录 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 package pers.stu.algorithm;import org.locationtech.jts.algorithm.MinimumDiameter; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import…

口袋参谋:新品增销量,是如何做到无痕迹、不降权的?

​经常听到这样的抱怨&#xff1a;“我补销量的速度&#xff0c;还没别人新品卖的快&#xff1f;一个新链接第二天就上了1w销量&#xff1f;到底是咋做到的&#xff1f;” 其实像新品上来直接就卖爆的情况&#xff0c;在电商行业中也不算什么新鲜事&#xff0c;但是对于很多新手…

SOLIDWORKS 2024新功能之Visualize篇

SOLIDWORKS 2024新功能Visualize 增强了创建引人注目的外观的功能 SOLIDWORKS Visualize 使用 Dassault Systmes 的企业 PBR 着色模型 (DSPBR) 来准确复制金属、玻璃、塑料和其他曲面的逼真外观。 DSPBR 是材料模型&#xff0c;用于基于物理的渲染&#xff0c;受 3DEXPERIENCE…

Java追加式将内容写入yml文件

前言 最近需要使用java的jackson-dataformat-yaml写yml文件&#xff0c;但多数情况是在现有的文件内容中追加地写一部分新的内容。网上查了一下没有查到有直接追加的api&#xff0c;看源码偶然间找到了一个实现思路&#xff0c;记录一下。 追加写入到yml文件 使用的工具是jac…

python 实验7

姓名&#xff1a;轨迹 学号&#xff1a;6666 专业年级&#xff1a;2021级软件工程 班级&#xff1a; 66 实验的准备阶段 (指导教师填写) 课程名称 Python开发与应用 实验名称 文件异常应用 实验目的 &#xff08;1&#xff09;掌握基本文件读写的方式&#xff1b; …

如何使用代理IP访问YouTube?

相信大家对YouTube都很熟悉&#xff0c;但是由于网络安全管制&#xff0c;我们在看YouTube视频时经常遇到由于地理封锁或网络限制而受到限制的人吗&#xff1f;如果是这样&#xff0c;您一定听说过代理IP&#xff08;代理服务器&#xff09;以及它们如何帮助您绕过此类限制&…

iceoryx(冰羚)-Architecture

Architecture 本文概述了Eclipseiceoryx体系结构&#xff0c;并解释了它的基本原理。 Software layers Eclipse iceoryx所包含的主要包如下所示。 接下来的部分将逐一简要介绍组件及其库。 Components and libraries 下面描述了不同的库及其名称空间。 ### iceoryx hoofs …

【C++】泛型编程 ③ ( 函数模板 与 普通函数 调用规则 | 类型匹配 | 显式指定函数模板泛型类型 )

文章目录 一、普通函数 与 函数模板 的调用规则 - 类型匹配1、类型匹配2、代码示例 - 类型匹配 二、普通函数 与 函数模板 的调用规则 - 显式指定函数模板泛型类型1、显式指定函数模板泛型类型2、代码示例 - 显式指定函数模板泛型类型 一、普通函数 与 函数模板 的调用规则 - 类…

STM32F103C8T6第4天:串口实验(非中断和中断)、hc01蓝牙、esp8266WIFI、4g

1. 串口基本介绍&#xff08;332.36&#xff09; 常用函数介绍 串口发送/接收函数&#xff1a; HAL_UART_Transmit(); 串口发送数据&#xff0c;使用超时管理机制HAL_UART_Receive(); 串口接收数据&#xff0c;使用超时管理机制HAL_UART_Transmit_IT(); 串口中断模式发送HAL…

用户画像与用户分层

用户画像是重要的数据产品和运营抓手&#xff0c;指能够描述和刻画用户信息和的数据指标。通过用户画像&#xff0c;业务经营团队可以充分、深入、准确地了解用户在不同生命周期的特征&#xff0c;来制定高效的用户经营策略。用户画像&#xff0c;不论 Persona 还是 Profile &a…

java笔记(一)

一、Java的三大平台 1.Java SE (必学) java语言的标准版&#xff0c;用于桌面开发&#xff0c;是其他两个版本的基础。 桌面应用适合的语言其实是c和C合适&#xff0c;复杂动画等加载时java很慢。 2.Java ME(现在很少用) java语言的小型版本&#xff0c;适用于嵌入式电子设备或…

AI机器学习实战 | 使用 Python 和 scikit-learn 库进行情感分析

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…