我收到以下错误
c50代码名为exit,值为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
我无法弄清楚出了什么问题?我在不同的数据集上使用类似的代码,它工作正常。关于如何调试我的代码的任何想法?
-Thanks
答案 0 :(得分:13)
对于任何感兴趣的人,可以在此处找到数据:http://www.kaggle.com/c/titanic-gettingStarted/data。我想你需要注册才能下载它。
关于你的问题,首先我认为你打算写
new_model <- C5.0(train[,-2],train$Survived)
接下来,请注意Cabin
和Embarked
列的结构。这两个因素具有空字符作为级别名称(使用levels(train$Embarked)
检查)。这是C50
失败的地方。如果您修改数据
levels(train$Cabin)[1] = "missing"
levels(train$Embarked)[1] = "missing"
您的算法现在可以正常运行。
答案 1 :(得分:6)
以防万一。您可以通过
查看错误summary(new_model)
当变量名称中有特殊字符时,也会发生此错误。例如,如果变量名称中有“я”(来自俄语字母)字符,则会出现此错误。
答案 2 :(得分:4)
最后有效: -
阅读此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)
这背后的直觉是,通过这种方式,列车和测试数据集将具有一致的因子水平。
答案 3 :(得分:1)
我遇到了同样的错误,但我使用的是数字数据集而没有丢失值。
很长一段时间后,我发现我的数据集有一个名为"outcome"
的预测属性而C5.0Control
使用此名称,这就是错误原因:&#39;(
我的解决方案是更改列名称。另一方面,将创建一个C5.0Control
对象并更改label属性的值,然后将此对象作为C50方法的参数传递。
答案 4 :(得分:0)
在构建模型时以及预测时,我也遇到了相同问题(返回码“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与包含空单元格的字符列有类似的问题,所以如果你有一些字符属性,你可能会扩展它以处理字符属性。
答案 5 :(得分:0)
我也遇到了同样的错误,但这是由于某一列的因子级别中存在一些非法字符所致。
我使用了make.names
函数并更正了因子水平:
levels(FooData$BarColumn) <- make.names(levels(FooData$BarColumn))
然后问题解决了。