次のエラーが発生します
値1のexitと呼ばれるc50コード
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.0dtreeを使用してみました
# 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
何が悪いのかわからないのですか?異なるデータセットで同様のコードを使用していましたが、正常に機能していました。コードをデバッグする方法についてのアイデアはありますか?
-ありがとう
興味のある方は、データをここで見つけることができます: http://www.kaggle.com/c/titanic-gettingStarted/data 。ダウンロードするには登録が必要だと思います。
あなたの問題に関して、私はあなたが書くつもりだったと思います
_new_model <- C5.0(train[,-2],train$Survived)
_
次に、Cabin
列とEmbarked
列の構造に注目してください。これらの2つの要素には、レベル名として空の文字があります(levels(train$Embarked)
で確認してください)。これは、_C50
_が倒れるポイントです。次のようにデータを変更した場合
_levels(train$Cabin)[1] = "missing"
levels(train$Embarked)[1] = "missing"
_
これで、アルゴリズムはエラーなしで実行されます。
念のため。あなたはによってエラーを見ることができます
summary(new_model)
また、このエラーは、変数の名前に特殊文字が含まれている場合に発生します。たとえば、変数の名前に「я」(ロシア語のアルファベットから)文字が含まれている場合、このエラーが発生します。
これが最終的に機能したものです:-
これを読んだ後にこのアイデアを得ました 投稿
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)
この背後にある直感は、このようにして、トレインとテストの両方のデータセットが一貫した因子レベルを持つことです。
同じエラーが発生しましたが、値が欠落していない数値データセットを使用していました。
しばらくして、データセットに"outcome"
という予測属性があり、C5.0Control
がこの名前を使用していることを発見しました。これが、エラーの原因でした: '(
私の解決策は、列名を変更することでした。もう1つの方法は、C5.0Control
オブジェクトを作成し、label属性の値を変更してから、このオブジェクトをC50メソッドのパラメーターとして渡すことです。
同じエラーが発生しましたが、1つの列の因子レベルに不正な文字が含まれていることが原因でした。
make.names
関数を使用して、因子レベルを修正しました。
levels(FooData$BarColumn) <- make.names(levels(FooData$BarColumn))
その後、問題は解決されました。
また、モデルの作成時と予測時に、同じ問題(リターンコード「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には、空のセルを含む文字列で同様の問題があるようです。したがって、文字属性がある場合は、これを拡張して文字属性も処理する必要があります。