Дерево решений C5.0 - код c50, называемый exit со значением 1

Я получаю следующую ошибку

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

Я не могу понять, что происходит не так? Я использовал аналогичный код в разных наборах данных, и он работал нормально. Любые идеи о том, как я могу отлаживать свой код?

-Спасибо

Ответ 1

Для всех, кто интересуется, данные можно найти здесь: 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"

ваш алгоритм будет работать без ошибок.

Ответ 2

На всякий случай. Вы можете взглянуть на ошибку с помощью

summary(new_model)

Также эта ошибка возникает, когда в имени переменной есть специальные символы. Например, эта ошибка будет получена, если в имени переменной есть символ "я" (от русского алфавита).

Ответ 3

Вот что работало наконец: -

Получил эту идею после прочтения этого 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)

Интуиция заключается в том, что таким образом и набор данных поезда и теста будет иметь согласованные уровни факторов.

Ответ 4

У меня была такая же ошибка, но я использовал числовой набор данных без пропущенных значений.

После долгого времени я обнаружил, что у моего набора данных был прогностический атрибут "outcome", а C5.0Control - это имя, и это было причиной ошибки: '(

Мое решение изменило имя столбца. Другой способ: создать объект C5.0Control и изменить значение атрибута метки, а затем передать этот объект в качестве параметра для метода C50.

Ответ 5

Я также несколько часов работал с той же проблемой (код возврата "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 имеет аналогичную проблему с столбцами символов, содержащими пустую ячейку, поэтому вам, вероятно, придется расширять ее, чтобы обрабатывать также атрибуты символов, если у вас есть.

Ответ 6

Я также получил ту же ошибку, но это было из-за некоторых недопустимых символов в уровнях факторов одного столбца.

Я использовал функцию make.names и исправил уровни факторов:

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

Тогда проблема была решена.