【问题标题】:R Catboost to handle categorical variablesR Catboost 处理分类变量
【发布时间】:2020-06-11 21:36:57
【问题描述】:

我有一个关于Catboost 的问题。我是否在建模之前对分类进行预处理?

如果我有 86 个变量,包括 1 个目标变量。在这 85 个变量中,有 2 个数值变量和 83 个分类变量(Factor 类型)。目标变量是二进制因子,1或0。

第 1 列和第 4 列到第 85 列是因子类型。
第 2 列和第 3 列是数字。

我对@9​​87654324@ 中的cat_features 有点困惑。在参数中,我可以设置分类特征的向量。另外,我可以在catboost.load_pool中设置。

library(Catboost)
library(dplyr)

X_train <- train %>% select(-Target)
y_train <- (as.numeric(unlist(train[c('Target')])) - 1)
X_valid <- test %>% select(-Target)
y_valid <- (as.numeric(unlist(test[c('Target')])) - 1)

train_pool <- catboost.load_pool(data = X_train, label = y_train, cat_features = c(0,3:84))
test_pool <- catboost.load_pool(data = X_valid, label = y_valid, cat_features = c(0,3:84))

params <- list(iterations=500,
               learning_rate=0.01,
               depth=10,
               loss_function='RMSE',
               eval_metric='RMSE',
               random_seed = 1,
               od_type='Iter',
               metric_period = 50,
               od_wait=20,
               use_best_model=TRUE,
               cat_features = c(0,3:84))

catboost.train(train_pool, test_pool, params = params)

但是,在我运行上面的代码之后,我得到了一个错误:

Error in catboost.train(train_pool, test_pool, params = params) : 
  catboost/libs/options/plain_options_helper.cpp:339: Unknown option {cat_features} with value "[0,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84]"

有什么帮助吗?

【问题讨论】:

    标签: r machine-learning error-handling categorical-data catboost


    【解决方案1】:

    我没有在 R 中尝试过 CatBoost,但请参阅此页面上的示例:

    https://catboost.ai/docs/concepts/r-reference_catboost-train.html

    您似乎只在load_pool() 调用中传递分类变量,而在train() 调用中NOT

    (这与 Python API 的工作方式不同,其中 cat_features 在 Python fit() 调用中传递。)

    一个建议:将所有分类变量分组在最左边的列中。这样你就有了一个更简单的矢量创建。我还检查了我的代码以确保我做对了...

    【讨论】:

      【解决方案2】:

      看这个例子 cat_features 不应该进入 param

      library(catboost)
      
      countries = c('RUS','USA','SUI')
      years = c(1900,1896,1896)
      phone_codes = c(7,1,41)
      domains = c('ru','us','ch')
      
      dataset = data.frame(countries, years, phone_codes, domains, stringsAsFactors = T)
      glimpse(dataset)
      
      label_values = c(0,1,1)
      
      fit_params <- list(iterations = 100,
                         loss_function = 'Logloss',
                         ignored_features = c(4,9),
                         border_count = 32,
                         depth = 5,
                         learning_rate = 0.03,
                         l2_leaf_reg = 3.5)
      
      pool = catboost.load_pool(dataset, label = label_values, cat_features = c(0,3))
      model <- catboost.train(pool, params = fit_params)
      model
      

      【讨论】:

        猜你喜欢
        • 2018-03-08
        • 2018-01-22
        • 1970-01-01
        • 1970-01-01
        • 2019-06-07
        • 2018-04-12
        • 2021-08-07
        • 2012-04-22
        相关资源
        最近更新 更多