C5. 0 дерево решений-код c50 вызывается exit со значением 1
Я получаю следующую ошибку
код c50 называется exit with value 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
Я не могу понять, что происходит? Я использовал аналогичный код на разных наборах данных, и он работал нормально. Любые идеи о том, как я могу отладить мой код?
- Спасибо
5 ответов:
Для всех заинтересованных, данные можно найти здесь: 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"Теперь ваш алгоритм будет работать без ошибок.
Вот что сработало окончательно: -
Получил эту идею после прочтения этого поста
Интуиция подсказывает, что таким образом и поезд, и набор тестовых данных будут иметь последовательные уровни факторов.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)
На всякий случай. Вы можете взглянуть на ошибку с помощью
summary(new_model)Также эта ошибка возникает, когда в имени переменной есть специальные символы. Например, эту ошибку можно получить, если в имени переменной есть символ"я" (это из русского алфавита).
У меня была та же ошибка, но я использовал числовой набор данных без пропущенных значений.
Спустя долгое время я обнаружил, что мой набор данных имеет прогностический атрибут под названием
"outcome"иC5.0Controlиспользует это имя, и это было причиной ошибки: '(Моим решением было изменить имя столбца. Другим способом было бы создать объект
C5.0Controlи изменить значение атрибута label, а затем передать этот объект в качестве параметра для метода C50.
Я также несколько часов боролся с той же проблемой (код возврата "1") при построении модели, а также при прогнозировании. С намеком на ответ Марко я написал небольшую функцию, чтобы удалить все уровни факторов, равные "" в фрейме данных или векторе, см. код ниже. Однако, поскольку 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 имеет аналогичную проблему с символьными столбцами, содержащими пустую ячейку, поэтому вам, вероятно, придется расширить это, чтобы обрабатывать также атрибуты символов, если они у вас есть.
Comments