使用step_naomit进行预测并使用tidymodels保留ID

2023-12-20

在使用随机森林模型进行预测以合并回原始数据帧时,我尝试在行上保留 ID。我在配方中使用了step_naomit,它在烘焙训练数据时删除了缺少数据的行,同时也删除了测试数据上缺少数据的记录。不幸的是,我没有 ID 来轻松知道哪些记录被删除,因此我可以准确地合并回预测。

我尝试向原始数据添加 ID 列,但烘焙会删除公式中未包含的任何变量(并且我不想在公式中包含 ID)。我还认为我也许能够保留原始表中的 row.names 进行合并,但看起来 row.name 在烘焙时也会重置。

我意识到我可以在配方之前删除 NA 值来解决这个问题,但是配方中的 step_naomit 有什么意义呢?我还在step_naomit中尝试了skip=TRUE,但随后在拟合模型时出现丢失数据的错误(仅适用于随机森林)。我觉得我在 tidymodels 中缺少一些东西,可以让我在烘烤之前保留所有行?

参见示例:


## R 3.6.1 ON WINDOWS 10 MACHINE

require(tidyverse)
require(tidymodels)
require(ranger)

set.seed(123)

temp <- iris %>%
    dplyr::mutate(Petal.Width = case_when(
        round(Sepal.Width) %% 2 == 0 ~ NA_real_, ## INTRODUCE NA VALUES
        TRUE ~ Petal.Width))

mySplit <- rsample::initial_split(temp, prop = 0.8)

myRecipe <- function(dataFrame) {
    recipes::recipe(Petal.Width ~ ., data = dataFrame) %>%
        step_naomit(all_numeric()) %>%
        prep(data = dataFrame)
}

myPred <- function(mySplit,myRecipe) {

    train_set <- training(mySplit)
    test_set <- testing(mySplit)

    train_prep <- myRecipe(train_set)

    analysis_processed <- bake(train_prep, new_data = train_set)

    model <- rand_forest(
            mode = "regression",
            mtry = 3,
            trees = 50) %>%
        set_engine("ranger", importance = 'impurity') %>%
        fit(Sepal.Width ~ ., data=analysis_processed)

    test_processed <- bake(train_prep, new_data = test_set)

    test_processed %>%
        bind_cols(myPrediction = unlist(predict(model,new_data=test_processed))) 

}

getPredictions <- myPred(mySplit,myRecipe)

nrow(getPredictions)

##  21 ROWS

max(as.numeric(row.names(getPredictions)))

##  21

nrow(testing(mySplit))

##  29 ROWS

max(as.numeric(row.names(testing(mySplit))))

##  150

为了能够跟踪哪些观察被删除,我们需要给原始数据集一个id多变的。

temp <- iris %>%
    dplyr::mutate(Petal.Width = case_when(
        round(Sepal.Width) %% 2 == 0 ~ NA_real_, ## INTRODUCE NA VALUES
        TRUE ~ Petal.Width),
        id = row_number()) #<<<<

然后我们使用update_role()首先将其指定为“id 变量”,然后将其作为预测变量删除,这样它就不会成为建模过程的一部分。就是这样。其他一切都应该像以前一样工作。下面是完全更新的代码,用 #

require(tidyverse)
#> Loading required package: tidyverse
require(tidymodels)
#> Loading required package: tidymodels
#> Registered S3 method overwritten by 'xts':
#>   method     from
#>   as.zoo.xts zoo
#> ── Attaching packages ───────────────────── tidymodels 0.0.3 ──
#> ✔ broom     0.5.2     ✔ recipes   0.1.7
#> ✔ dials     0.0.3     ✔ rsample   0.0.5
#> ✔ infer     0.5.0     ✔ yardstick 0.0.4
#> ✔ parsnip   0.0.4
#> ── Conflicts ──────────────────────── tidymodels_conflicts() ──
#> ✖ scales::discard() masks purrr::discard()
#> ✖ dplyr::filter()   masks stats::filter()
#> ✖ recipes::fixed()  masks stringr::fixed()
#> ✖ dplyr::lag()      masks stats::lag()
#> ✖ dials::margin()   masks ggplot2::margin()
#> ✖ dials::offset()   masks stats::offset()
#> ✖ yardstick::spec() masks readr::spec()
#> ✖ recipes::step()   masks stats::step()
require(ranger)
#> Loading required package: ranger

set.seed(1234)

temp <- iris %>%
    dplyr::mutate(Petal.Width = case_when(
        round(Sepal.Width) %% 2 == 0 ~ NA_real_, ## INTRODUCE NA VALUES
        TRUE ~ Petal.Width),
        id = row_number()) #<<<<

mySplit <- rsample::initial_split(temp, prop = 0.8)

myRecipe <- function(dataFrame) {
    recipes::recipe(Petal.Width ~ ., data = dataFrame) %>%
        update_role(id, new_role = "id variable") %>%  #<<<<
        update_role(-id, new_role = 'predictor') %>%   #<<<<
        step_naomit(all_numeric()) %>%
        prep(data = dataFrame)
}

myPred <- function(mySplit,myRecipe) {

    train_set <- training(mySplit)
    test_set <- testing(mySplit)

    train_prep <- myRecipe(train_set)

    analysis_processed <- bake(train_prep, new_data = train_set)

    model <- rand_forest(
            mode = "regression",
            mtry = 3,
            trees = 50) %>%
        set_engine("ranger", importance = 'impurity') %>%
        fit(Sepal.Width ~ ., data=analysis_processed)

    test_processed <- bake(train_prep, new_data = test_set)

    test_processed %>%
        bind_cols(myPrediction = unlist(predict(model,new_data=test_processed))) 

}

getPredictions <- myPred(mySplit, myRecipe)

getPredictions
#> # A tibble: 23 x 7
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species     id myPrediction
#>           <dbl>       <dbl>        <dbl>       <dbl> <fct>    <int>        <dbl>
#>  1          4.6         3.1          1.5         0.2 setosa       4         3.24
#>  2          4.3         3            1.1         0.1 setosa      14         3.04
#>  3          5.1         3.4          1.5         0.2 setosa      40         3.22
#>  4          5.9         3            4.2         1.5 versico…    62         2.98
#>  5          6.7         3.1          4.4         1.4 versico…    66         2.92
#>  6          6           2.9          4.5         1.5 versico…    79         3.03
#>  7          5.7         2.6          3.5         1   versico…    80         2.79
#>  8          6           2.7          5.1         1.6 versico…    84         3.12
#>  9          5.8         2.6          4           1.2 versico…    93         2.79
#> 10          6.2         2.9          4.3         1.3 versico…    98         2.88
#> # … with 13 more rows

# removed ids
setdiff(testing(mySplit)$id, getPredictions$id)
#> [1]   5  28  47  70  90 132

Created on 2019-11-26 by the reprex package https://reprex.tidyverse.org (v0.3.0)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用step_naomit进行预测并使用tidymodels保留ID 的相关文章

  • 即使设置了语言环境,data.frames中的藏文字符也无法在R控制台中显示(中文可以,矩阵中的藏文可以)

    在 R 中 藏文字符位于 data frames 中时无法正确显示 gt Sys setlocale LC CTYPE Tibetan 1 Tibetan China 950 gt data frame a a 1
  • 如何按物种矩阵显示站点内植物物种生物量?

    我之前问过 如何将两列显示为二进制 存在 不存在 矩阵 这个问题得到了两个很好的答案 我现在想更进一步 在原始站点按物种列添加第三列 该列反映每个地块中每个物种的生物量 第 1 列 地块 指定约 200 个地块的代码 第 2 列 物种 指定
  • (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : 参数暗示不同的行数: 1, 4, 5, 2

    我是 R 的初学者 我希望你能帮助我解决我的问题 我的数据集中的文件名包含大量信息 我必须提取这些信息来创建单独的变量 首先我使用 splits lt t as data frame strsplit as character rawdat
  • 如何在R中用随机数填充矩阵?

    expand grid i rexp 5 rate 0 1 它只创建一列 但有什么方法可以轻松地将其乘以 5 列吗 我的意思是 matlab 的做事方式 比如rand exp 0 1 10 20 创建一个指数分布随机数的矩阵 平均值为 0
  • 无法使用 R 中的 Quantmod 从雅虎财经下载数据

    我正在尝试使用以下代码从雅虎下载数据 library quantmod getSymbols WOW auto assign F 过去 这对我来说在任何场合都有效 除了现在 在我的小组作业到期前 5 天 但现在我收到此错误 Error in
  • 调整 R 图的边距

    我对调整 R 图的边距很感兴趣 我在 MacOS 上使用 R Studio 在 2013 intel CPU Macbook pro 上运行 这是我用于生成绘图的数据 spins lt runif 50 min 0 max 50 这是我用来
  • 绘制由 R 中的 caret 包训练的 SVM 线性模型

    Purpose 我试图通过可视化 SVM 线性分类模型plot 我正在使用中提供的示例代码和数据kernlab包注意到了caret实际上通过训练 svmksvm函数 参考这里的src代码 https github com topepo ca
  • data.table 对数字和文本变量分别进行分组

    我正在尝试简化这个data table作用于数字变量和字符变量的两阶段过程 例如 取第一个元素textvar and sum每个数值变量 考虑这个小例子 library data table dt lt data table grpvar
  • 提取数据框中值前后的 n 行

    我有一个数据框 其中包含某些值Mark柱子 我想提取n标记出现之前和之后的值 包括带有标记的行 我通过使用找到我需要的值indices lt which df Mark 1 where 1是我正在寻找的价值 现在我需要例如之前 5 行和之后
  • 如何在 R 中创建没有情节的图例?

    这是一个艺术项目 我创建了一个包含 5 种不同颜色的许多点的散点图 我想创建一个与绘图完全分开的图例 因为它不在绘图上 也不在绘图旁边 而是在它自己的窗口中 因此我可以将图例保存为它自己的 pdf 文件 这样我就可以将我的情节和图例分开打印
  • 如何更改 ggplot2 中轴标签上的小数位数?

    具体来说 这是在facet grid 中 在谷歌上广泛搜索了类似的问题 但不清楚语法或它的去向 我想要的是 y 轴上的每个数字在小数点后都有两位数 即使尾随一位是 0 这是scale y continuous 或 element text
  • 嵌套循环中的索引

    我是 R 和这个网站的新手 我的目标是创建一个 R 函数 在 ggplot2 中生成特殊类型的箱线图 这肯定是不必要的晦涩难懂的代码 我首先需要通过计算稍后希望绘制的变量来处理其中的潜在输入 我首先生成一些随机数据 称为datos c1 r
  • 如何使用 R markdown 和 bookdown 将图形列表和表格列表添加到目录中

    我有一份报告 pdf 输出 我想在附录中添加参考书目 图表列表和表格列表 我希望这三个元素出现在目录中 我添加参考书目通过增加bibliography bibliography bib到我的 yaml 标头 我直接用 LaTex 添加的图形
  • 将 R 中的 arules 生成的规则应用于新交易

    我的目标是使用 R 包生成的规则arules来预测topic每个事务 每个事务有 1 个主题 其中每个事务是文档中的一组单词 我有一个训练集trans train 用于创建规则 和测试集trans test 我想预测它的 主题 我还希望能够
  • 修改 GGplot2 对象

    然而 我很好奇 是否可以添加任何特定的图例或将哪个物种对应于观察到的预期绘图中 以分别知道它是哪个圆圈 我目前使用的是一个名为 finches 的假数据集 该包称为 cooccurr 它创建一个 ggplot 对象 我很好奇如何实际编辑它以
  • sapply 函数从命名向量中的值填充数据帧的列,需要很长时间。有更快的方法吗?

    这是我正在做的一个例子 x lt c a 2 b 4 c 2 d 9 df lt data frame names c d c a b x是一个命名向量 其值的顺序与它们在中出现的顺序不同df names 我需要在数据框中形成一个新列 该列
  • 按行重塑矩阵

    我有一个大小为 18000 x 54 的矩阵 我想将其重塑为大小为 54000 x 18 的矩阵 其中初始矩阵的每一行都变成一个有 3 行的矩阵 让我们举个例子 我有一个矩阵如下 a matrix 1 18 nrow 2 ncol 9 by
  • R strsplit 问题(容易解决吗?)

    这应该是一件很容易做到的事情 我在这里读到的类似示例有点复杂 而且这些技术对我来说并不真正有效 我有一个名为 id string 的变量 gt typeof id string 1 character and gt id string 1
  • 添加带有错误的弹出窗口,警告闪亮

    有什么办法可以添加一个popup 可关闭的窗口 其中包含警告或其他消息Shiny 我用来构建 Web 应用程序的 R 包 我已经寻找了一段时间但没有任何结果 虽然我不认为有任何本地可用的东西shiny 你可以尝试添加jQueryUI到您的应
  • rmarkdown 中的内部链接不起作用

    我使用 rmarkdown 来渲染 pdf 文档 现在我想在文本中添加内部链接 在帮助页面中降价 http rmarkdown rstudio com authoring pandoc markdown html links 它说内部链接定

随机推荐

  • 如何在asp.net mvc中回发后清除字段?

    我想知道如何在 ASP NET MVC 回发后清除字段 就像现在 当发生验证错误时 字段会保留用户输入的内容 不过 这很好 当没有发生验证错误时 我希望清除所有字段并显示一条消息 所以现在我使用 ViewData 成功显示 但不确定如何清除
  • Kotlin 多平台:JobCancellationException:父作业已完成

    我尝试编写一个使用 ktor 的 kotlin 多平台库 android 和 ios 因此 我在 kotlins 协程方面遇到了一些问题 When writing tests I always get kotlinx coroutines
  • 通过构建管道将 ASP.NET 应用程序部署到 Azure 应用服务

    我继承了一个 ASP NET 4 7 2 应用程序 它在我的计算机上成功运行和启动 我现在尝试通过 Azure DevOps Pipeline 将其部署到 Azure 应用服务 为了尝试做到这一点 我创建了一个 Azure 构建管道 其中包
  • mod_rewrite 在 URL 中带有尾随句点

    我的 Apache 上有一个 RewriteRule 以使 URL 变得友好 RewriteRule log script php u 1 QSA 这使得http example com log 用户名 http example com l
  • gzipped Parquet 文件在 HDFS for Spark 中可拆分吗?

    在互联网上搜索和阅读有关此主题的答案时 我收到了令人困惑的消息 有人可以分享他们的经验吗 我知道 gzipped csv 不是这样的事实 但也许 Parquet 的文件内部结构是这样的 Parquet 与 csv 的情况完全不同 使用 GZ
  • 通过斯坦福解析器提取所有名词、形容词形式和文本

    我试图通过斯坦福解析器从给定文本中提取所有名词和形容词 我当前的尝试是在 Tree Object 的 getChildrenAsList 中使用模式匹配来定位以下内容 NN paper NN algorithm NN information
  • 从 vscode 的集成终端中打开新的集成终端的命令是什么?

    我正在尝试设置一系列任务 每个任务都需要一个终端 为此 我需要使用一个命令从以前的集成终端打开一个新的集成终端选项卡 有没有办法在vs code集成终端中做到这一点 在 mac 中我会使用 open a Terminal 或者类似的东西tt
  • 在 pika / RabbitMQ 中处理长时间运行的任务

    我们正在尝试建立一个基本的定向队列系统 其中生产者将生成多个任务 一个或多个消费者将一次获取一个任务 处理它并确认消息 问题是 处理过程可能需要 10 20 分钟 而且我们当时没有回复消息 导致服务器与我们断开连接 这是我们消费者的一些伪代
  • 通知本地化不起作用

    我想本地化通知 并且我发现有这样的属性 例如 title loc key body loc key 用于本地化 I18N 通知标题和正文的 FCM 字段不起作用 例如 android priority normal notification
  • 结合来自 T-SQL 的 XML

    我有两个单独的表 TV 和 Receiver 我正在使用 FOR XML PATH 命令来构建 XML 我的问题是 我想将 TV XML Build 的输出与 Receiver XML Build 的输出结合起来 以创建一个 XML 输出
  • DataStax DDC 服务无法启动

    我刚刚安装了 DataStax Community Edition 但是当尝试运行以下命令时 C gt net start DataStax DDC Server 我得到以下回复 Thanks 我自己也遇到了同样的问题 请尝试以下操作 打开
  • Dagger:如果我每次都*想要*一个新实例怎么办?

    有趣的是 这个答案是多么难以找到 我已经使用 Dagger Android 一段时间了 并且已经设置了整个依赖关系图 我正在使用范围 限定符以及所有这些好东西 我不再是 Dagger 新手 但可以说我一直在 Android 设置中以相当标准
  • 检查是否为空[重复]

    这个问题在这里已经有答案了 这是一个非常简单的问题 但是因为我只做了这门语言一周 所以我还没有找到答案 以下两行之间出现错误 因为Regex随机为空 但我如何检查它是否为空 这样它就不会抛出错误 var Regex span class c
  • 我正在使用两个不同的 jQuery 函数,其中一个似乎抵消了另一个

    我正在尝试使用两块 jquery 作为灯箱和一个滚动条来构建我正在构建的单页网站 它们单独工作都很好 但是当我将它们放在同一页面上时 滚动条似乎取消了灯箱 使其无效 这是灯箱代码 这是滚动条代码
  • 如何在 C++ 中正确返回 null/空对象?

    我是一名 Java 开发人员 试图解决一个简单的 C 任务 在 Java 中 如果我想返回一个空 null 对象 以指示未找到该对象 我只需返回 null 例子 Person getGetByName String name for int
  • iOS5中如何将旧的emoji编码转换为最新的编码?

    遗憾的是 在 iOS5 最终发布后 我收到用户的报告称他们无法登录 因为名字里有emoji符号 苹果改变了emoji的编码 那么用户名包含旧版本的表情符号 我如何将它们转换为新的编码 thanks 具体来说 一个表情符号 老虎 在iOS5中
  • django 注释框架:distinct() 不起作用?

    在评论模型的任何字段上运行distinct 总是返回所有记录 Comment objects values user distinct 用户 1 用户 0 用户 0 用户 0 用户 0 用户 1 用户 1 用户 1 用户 1 Comment
  • 如何获取要从 Elastic Beanstalk 上的 Dockerfile.aws.json 运行的命令?

    我有一个Dockerfile and a Dockerfile aws json AWSEBDockerrunVersion 1 Ports ContainerPort 5000 HostPort 5000 Volumes HostDire
  • 列出 RestEasy 服务的所有公开/可用端点?

    是否可以以简单的方式列出 RestEasy 服务的所有公开 可用端点 有一个 RestEasy 插件 stats 它公开了 resteasy registry 它需要注册在web xml
  • 使用step_naomit进行预测并使用tidymodels保留ID

    在使用随机森林模型进行预测以合并回原始数据帧时 我尝试在行上保留 ID 我在配方中使用了step naomit 它在烘焙训练数据时删除了缺少数据的行 同时也删除了测试数据上缺少数据的记录 不幸的是 我没有 ID 来轻松知道哪些记录被删除 因