【问题标题】:about recipes package in R关于 R 中的食谱包
【发布时间】:2020-02-29 14:14:48
【问题描述】:

您好,我正在使用机器学习模型中的特征工程配方。 但是,当我使用 step_dummy 时,虚拟变量被视为数值变量,而不是因子。 我认为当我们使用随机森林或其他树模型时,这可能会出现问题。 我们怎样才能改变这一点? PDP 显示虚拟预测器被视为数字。所以X轴有0.25、0.5....... 这应该只有 0 和 1(因为 dummy)。

library(modeldata)
library(recipes)
library(caret)
library(ranger)
library(ggplot2)
library(pdp)

data(okc)
okc <- okc[complete.cases(okc),]

rec <- recipe(~ diet + age + height, data = okc)

dummies <- rec %>% step_dummy(diet)
dummies <- prep(dummies, training = okc)

dummy_data <- bake(dummies, new_data = okc)
summary(dummy_data)
dummy_data<-na.omit(dummy_data )
dummy_data<-dummy_data[1:2000,]

dummy_data$diet_strictly.anything<-factor(dummy_data$diet_strictly.anything)%>% factor(labels = c("No", "Yes"))

myTrainingControl <- trainControl(method = "cv", 
                                  number = 5, 
                                  savePredictions = TRUE, 
                                  classProbs = TRUE,
                                  summaryFunction = twoClassSummary,
                                  verboseIter = F)

fit_rf <- caret::train(diet_strictly.anything ~ .,   
                       data =dummy_data, 
                       method = "ranger",
                       tuneLength = 2,     
                       importance = "permutation",
                       trControl = myTrainingControl)


# Define a prediction function wrapper which requires two arguments
predict.function <- function(object, newdata) {
        predict(object, newdata, type="prob")[,2] %>% as.vector()
}

plt_ICE <- pdp::partial(fit_rf, 
                        pred.var = "diet_mostly.vegetarian", 
                        pred.fun = predict.function, 
                        train = dummy_data) %>% autoplot(alpha = 0.1)
plt_ICE

【问题讨论】:

    标签: r r-recipes


    【解决方案1】:

    来自step_dummy 文档:

    step_dummy 创建一个配方步骤的规范,它将名义数据(例如字符或因子)转换为原始数据级别的一个或多个数字二进制模型项。

    在这种情况下,函数似乎按预期工作,通过将分类变量 diet(存储为 okc 数据中的 character 类型)转换为一组对应于水平的二进制数值变量diet.

    如果您将变量视为结果(即尝试预测某人是否有特定类型的饮食),那么虚拟变量不应编码为数字是正确的。如果您有兴趣将“饮食”假人改回因素,那么一种简洁的方法可能是:

    library(tidyverse)
    dummy_data <- dummy_data %>%
      mutate_at(vars(starts_with('diet')), list(as.factor))
    

    如果您将这些虚拟变量用作预测变量,R(我主要使用rpartrandomForestranger)中的基于树的建模工具可以将虚拟变量作为预测变量处理 编码为数字,变量重要性度量的解释与将变量编码为 2 水平因子或逻辑变量相同。

    【讨论】:

    • 非常感谢您的帮助。但是,部分依赖图显示虚拟变量被视为连续变量。我编辑并添加了更多代码。
    • 没错,这里的数字变量将在您所调用的绘图上显示为连续的。但是,因为它们只在您的数据中采用两个离散值(在任何虚拟变量上调用 unique() 应该只返回集合 (0, 1) 中的值),所以它们在基于树的模型中被视为两级因子或逻辑变量。
    • 感谢您的评论!!!所以你的意思是我们可以忽略0到1之间的预测概率??如果是这样,它确实有道理。比如x轴0.5没有意义吧??
    • 啊,我一开始可能误解了,谢谢你的澄清。您是将来自diet 的虚拟变量视为预测变量还是结果?如果您仅将它们用作预测变量,那么出于我的第一条评论的原因,保留为数字就可以了,但是如果您将它们视为结果,我建议您转换回因子,以便模型以这种方式处理它们你会期待分类结果。我将更新我的答案以澄清这一点。
    • 编辑澄清,如果有帮助,请告诉我。无论如何,我认为将数字转换为因子的代码块可以解决问题:)
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2018-07-17
    • 1970-01-01
    • 2015-09-17
    相关资源
    最近更新 更多