【问题标题】:C5.0 decision tree - c50 code called exit with value 1C5.0 决策树 - 名为 exit 的 c50 代码,值为 1
【发布时间】:2014-05-13 06:08:09
【问题描述】:

我收到以下错误

c50 代码调用退出,值为 1

我正在根据 Kaggle 提供的泰坦尼克号数据进行此操作

# Importing datasets
train <- read.csv("train.csv", sep=",")

# this is the structure
  str(train)

输出:-

    'data.frame':   891 obs. of  12 variables:
 $ PassengerId: int  1 2 3 4 5 6 7 8 9 10 ...
 $ Survived   : int  0 1 1 1 0 0 0 0 1 1 ...
 $ Pclass     : int  3 1 3 1 3 3 1 3 3 2 ...
 $ Name       : Factor w/ 891 levels "Abbing, Mr. Anthony",..: 109 191 358 277 16 559 520 629 417 581 ...
 $ Sex        : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ...
 $ Age        : num  22 38 26 35 35 NA 54 2 27 14 ...
 $ SibSp      : int  1 1 0 1 0 0 0 3 0 1 ...
 $ Parch      : int  0 0 0 0 0 0 0 1 2 0 ...
 $ Ticket     : Factor w/ 681 levels "110152","110413",..: 524 597 670 50 473 276 86 396 345 133 ...
 $ Fare       : num  7.25 71.28 7.92 53.1 8.05 ...
 $ Cabin      : Factor w/ 148 levels "","A10","A14",..: 1 83 1 57 1 1 131 1 1 1 ...
 $ Embarked   : Factor w/ 4 levels "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ...

然后我尝试使用 C5.0 dtree

# Trying with C5.0 decision tree
library(C50)

#C5.0 models require a factor outcome otherwise error
train$Survived <- factor(train$Survived)

new_model <- C5.0(train[-2],train$Survived)

所以运行上面的行给了我这个错误

c50 code called exit with value 1

我无法弄清楚出了什么问题?我在不同的数据集上使用了类似的代码,它工作正常。关于如何调试我的代码有什么想法吗?

-谢谢

【问题讨论】:

    标签: r machine-learning decision-tree kaggle


    【解决方案1】:

    我也遇到了同样的错误,但这是因为其中一列的因子级别中有一些非法字符。

    我使用了make.names 函数并修正了因子水平:

    levels(FooData$BarColumn) <- make.names(levels(FooData$BarColumn))
    

    那么问题就解决了。

    【讨论】:

      【解决方案2】:

      在构建模型和进行预测时,我也为同样的问题(返回代码“1”)苦苦挣扎了几个小时。 在 Marco 的回答提示下,我编写了一个小函数来删除数据框或向量中等于“”的所有因子级别,请参见下面的代码。但是,由于 R 不允许通过引用传递函数,因此您必须使用函数的结果(它不能更改原始数据帧):

      removeBlankLevelsInDataFrame <- function(dataframe) {
        for (i in 1:ncol(dataframe)) {
          levels <- levels(dataframe[, i])
          if (!is.null(levels) && levels[1] == "") {
            levels(dataframe[,i])[1] = "?"
          }
        }
        dataframe
      }
      
      removeBlankLevelsInVector <- function(vector) {
        levels <- levels(vector)
        if (!is.null(levels) && levels[1] == "") {
          levels(vector)[1] = "?"
        }
        vector
      }
      

      函数的调用可能如下所示:

      trainX = removeBlankLevelsInDataFrame(trainX)
      trainY = removeBlankLevelsInVector(trainY)
      model = C50::C5.0.default(trainX,trainY)
      

      不过,C50 似乎也有类似的问题,即字符列包含一个空单元格,因此如果你有一些字符属性,你可能必须扩展它以处理字符属性。

      【讨论】:

        【解决方案3】:

        我遇到了同样的错误,但我使用的是没有缺失值的数字数据集。

        很久之后,我发现我的数据集有一个预测属性叫"outcome",而C5.0Control使用这个名字,这就是错误原因:'(

        我的解决方案是更改列名。其他方式,将创建一个C5.0Control 对象并更改标签属性的值,然后将此对象作为参数传递给 C50 方法。

        【讨论】:

          【解决方案4】:

          以防万一。您可以通过

          查看错误
          summary(new_model)
          

          当变量名称中有特殊字符时也会发生此错误。例如,如果变量名称中有“я”(来自俄语字母)字符,则会出现此错误。

          【讨论】:

            【解决方案5】:

            这是最终奏效的方法:-

            读了post后有了这个想法

            library(C50)
            
            test$Survived <- NA
            
            combinedData <- rbind(train,test)
            
            combinedData$Survived <- factor(combinedData$Survived)
            
            # fixing empty character level names 
            levels(combinedData$Cabin)[1] = "missing"
            levels(combinedData$Embarked)[1] = "missing"
            
            new_train <- combinedData[1:891,]
            new_test <- combinedData[892:1309,]
            
            new_model <- C5.0(new_train[,-2],new_train$Survived)
            
            new_model_predict <- predict(new_model,new_test)
            
            submitC50 <- data.frame(PassengerId=new_test$PassengerId, Survived=new_model_predict)
            write.csv(submitC50, file="c50dtree.csv", row.names=FALSE)
            

            这背后的直觉是,通过这种方式,训练数据集和测试数据集将具有一致的因子水平。

            【讨论】:

              【解决方案6】:

              任何有兴趣的人都可以在这里找到数据:http://www.kaggle.com/c/titanic-gettingStarted/data。我认为您需要注册才能下载它。

              关于你的问题,首先我认为你的意思是写

              new_model <- C5.0(train[,-2],train$Survived)
              

              接下来,注意CabinEmbarked 列的结构。这两个因素有一个空字符作为级别名称(检查levels(train$Embarked))。这就是C50 倒下的地方。如果您修改您的数据,这样

              levels(train$Cabin)[1] = "missing"
              levels(train$Embarked)[1] = "missing"
              

              您的算法现在可以正常运行了。

              【讨论】:

              • 谢谢马可。有效!! Cabin 和 Embarked 列中的缺失值导致了该问题。我观察到的另一件事是 train[-2] 和 train[,-2] 具有相同的输出......两者之间还有其他区别吗??
              • 你是对的,它似乎适用于 data.frames。我总是使用 train[,-2],因为对于矩阵 train[-2] 会将结果转换为向量并仅删除一个元素。这是因为从概念上讲矩阵就像向量,您可以访问它们的每个元素而无需指定行/列
              • 糟糕。现在下一步是给出类似的代码退出错误。我将 test.csv 读入测试数据框。然后:- new_model_predict
              • 我对C50库没有太多经验,但是训练集和测试集中的因子有可能需要相同的水平吗?如果不包括具有不同级别(姓名、机票、客舱、已登机)的因素,它运行良好
              • 感谢您到目前为止的帮助。看来我需要对此进行更多研究。
              猜你喜欢
              • 1970-01-01
              • 2016-11-27
              • 2016-09-10
              • 2019-01-25
              • 2020-06-03
              • 2016-02-27
              • 2018-09-24
              • 2015-12-18
              • 1970-01-01
              相关资源
              最近更新 更多