2014-04-02 84 views
9

我收到以下錯誤C5.0決策樹 - C50代碼調用出口值爲1

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 

我無法弄清是怎麼回事?我在不同的數據集上使用類似的代碼,它工作正常。有關如何調試我的代碼的任何想法?

-Thanks

回答

10

任何有興趣,該數據可以在這裏找到: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" 

您的算法現在將運行而不會出現錯誤。

+0

感謝Marco。有效!! Cabin和Embarked列中的缺失值導致了這個問題。我觀察到的另一件事是,列車[-2]和列車[, - 2]具有相同的輸出...兩者之間是否有其他差異? – zephyr

+0

你說得對,它似乎適用於data.frames。我總是使用train [, - 2],因爲對於矩陣train [-2]將把結果轉換成一個vector,並且只刪除一個元素。這是因爲概念矩陣就像向量一樣,您可以訪問它們的每個元素而不指定行/列 – Marco

+0

糟糕。現在下一步是給出類似的代碼退出錯誤。我將test.csv讀入測試數據框。然後: - new_model_predict < - 對測試數據進行預測(new_model,test)。此外,我還在Cabin和Embarked測試數據列中分配了缺失標籤。 – zephyr

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) 

這背後的直覺是,通過這種方式既火車和測試數據集將有一致的因子水平。

2

爲了以防萬一。你可以看看錯誤

summary(new_model) 

此外,當變量的名稱中有特殊字符時會發生此錯誤。例如,如果變量名稱中有「я」(來自俄文字母)字符,則會出現此錯誤。

1

我有同樣的錯誤,但我使用的數值數據集沒有缺失值。

後很長一段時間,我發現我的數據集有一個預測的屬性稱爲"outcome"C5.0Control使用這個名字,這是錯誤的原因:「(

我的解決辦法是改變列名的其他方式,將創建一個C5.0Control對象並更改標籤屬性的值,然後將此對象作爲參數傳遞給C50方法。

0

我還在構建一個相同的問題(返回代碼「1」)時掙扎了幾個小時模型以及預測的時候 隨着馬可的回答,我寫了一個小函數來刪除e數據框或向量中的所有因子水平等於「」,請參閱下面的代碼。然而,由於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與包含空單元格的字符列有類似的問題,所以如果您有一些字符屬性,那麼您可能會擴展該屬性來處理字符屬性。