首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tidymodels:在日期列中计算缺少的值?

Tidymodels:在日期列中计算缺少的值?
EN

Stack Overflow用户
提问于 2021-06-16 07:00:00
回答 1查看 394关注 0票数 0

这个问题是Tidymodels: What is the correct way to impute missing values in a Date column?的重复,因为问题已经结束,我提供了一个reprex并再次提出了这个问题。

在日期列中,我与缺失的值作了一点斗争。在我的预处理管道(recipe-object)中,我使用step_impute_knn函数来填充所有日期列中缺少的值。不幸的是,我得到了以下错误:

分配的数据pred_vals必须与现有数据兼容。列avg_begin_first_contract .x发生错误,无法将双重日期转换为日期

下面是一个版本的reprex,其中我将值计算在多个列中,包括一个Date列。如果我只将值计算到Date列,对我来说并不重要。结果是一样的。下面是一个reprex,它不会通过一个错误,因为没有使用Date列。

以前有人有过这个问题吗?

代码语言:javascript
复制
library(tidyverse)
library(tidymodels)

iris <- iris %>%
  mutate(Plucked = sample(seq(as.Date("1999/01/01"), as.Date("2000/01/01"),
    by = "day"
  ), size = 150))

iris[45, 2] <- as.numeric(NA)
iris[37, 3] <- as.numeric(NA)
iris[78, 4] <- as.numeric(NA)
iris[9, 5] <- as.numeric(NA)
iris[15, 6] <- as.factor(NA)

set.seed(456)

iris_split <- iris %>%
  initial_split(strata = Sepal.Length)


iris_training <- training(iris_split)
iris_testing <- testing(iris_split)

iris_rf_model <- rand_forest(
  mtry = 10,
  min_n = 10,
  trees = 500
) %>%
  set_engine("ranger") %>%
  set_mode("regression")


base_rec <- recipe(Sepal.Length ~ .,
  data = iris_training
) %>%
  step_impute_knn(Sepal.Width, Petal.Length, Petal.Width, Species, Plucked) %>%
  step_date(Plucked) %>%
  step_dummy(Species)

iris_workflow <- workflow() %>%
  add_model(iris_rf_model) %>%
  add_recipe(base_rec)

iris_rf_wkfl_fit <- iris_workflow %>%
  last_fit(iris_split)
#> x train/test split: preprocessor 1/1: Error: Assigned data `pred_vals` must be compatible wi...
#> Warning: All models failed. See the `.notes` column.
Created on 2021-06-15 by the reprex package (v2.0.0)

下面是reprex,它不会通过错误:

代码语言:javascript
复制
library(tidyverse)
library(tidymodels)

iris[45, 2] <- as.numeric(NA)
iris[37 ,3] <- as.numeric(NA)
iris[78, 4] <- as.numeric(NA)
iris[9, 5] <- as.numeric(NA)

set.seed(123)

iris_split <- iris %>% 
  initial_split(strata = Sepal.Length)

iris_training <- training(iris_split)
iris_testing <- testing(iris_split)

iris_rf_model <- rand_forest(
  mtry = 5,
  min_n = 5,
  trees = 500) %>%
  set_engine("ranger") %>%
  set_mode("regression")


base_rec <- recipe(Sepal.Length ~ .,
                   data = iris_training) %>% 
  step_impute_knn(Sepal.Width, Petal.Length, Petal.Width, Species) %>%
  step_dummy(Species)

iris_workflow <- workflow() %>% 
  add_model(iris_rf_model) %>% 
  add_recipe(base_rec)

iris_rf_wkfl_fit <- iris_workflow %>%
  last_fit(split = iris_split)
Created on 2021-06-15 by the reprex package (v2.0.0)

提前感谢!M.

EN

回答 1

Stack Overflow用户

发布于 2021-06-16 17:25:57

我怀疑step_impute_knn不适用于日期格式。您可能必须首先将其转换为一个因子。你能试试下面的代码吗?

代码语言:javascript
复制
iris_n <- iris %>%
  mutate(Plucked = sample(seq(as.Date("1999/01/01"), as.Date("2000/01/01"),
    by = "day"
  ), size = 150))  %>% 
  mutate(Plucked = as.factor(Plucked)) #convert date into factor

iris_n[45, 2] <- NA
iris_n[37, 3] <- NA
iris_n[78, 4] <- NA
iris_n[9, 5] <- NA
iris_n[15, 6] <- NA

set.seed(456)

iris_split <- iris_n %>%
  initial_split(strata = Sepal.Length)


iris_training <- training(iris_split)
iris_testing <- testing(iris_split)

iris_rf_model <- rand_forest(
  mtry = 10,
  min_n = 10,
  trees = 500
) %>%
  set_engine("ranger") %>%
  set_mode("regression")


base_rec <- recipe(Sepal.Length ~ .,
  data = iris_training
) %>%
  step_impute_knn(Sepal.Width, Petal.Length, Petal.Width, Species, Plucked) %>%
  #step_date(Plucked) %>% #might not need this step anymore
  step_dummy(Species)

iris_workflow <- workflow() %>%
  add_model(iris_rf_model) %>%
  add_recipe(base_rec)

iris_rf_wkfl_fit <- iris_workflow %>%
  last_fit(iris_split)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67997823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档