2014-04-02 5 views
9

मैं मूल्य 1C5.0 निर्णय वृक्ष - मूल्य के साथ C50 कोड कहा जाता है बाहर निकलने के 1

मैं उपलब्ध टाइटैनिक डेटा पर यह कर रहा हूं साथ निम्न त्रुटि

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.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 

मैं यह पता लगाने में सक्षम नहीं कर रहा हूँ क्या गलत हो रहा उपयोग करने की कोशिश? मैं अलग-अलग डेटासेट पर समान कोड का उपयोग कर रहा था और यह ठीक काम कर रहा था। मैं अपने कोड को डीबग कैसे कर सकता हूं इसके बारे में कोई विचार?

शुक्रिया

उत्तर

10

रुचि किसी के लिए, डेटा यहां पाया जा सकता: 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" 

आपका एल्गोरिदम अब बिना किसी त्रुटि के चलाएगा।

+0

धन्यवाद मार्को। इसने काम कर दिया!! केबिन और लापता कॉलम में गुम मूल्य इस मुद्दे का कारण बन रहे थे। मैंने देखा कि दूसरी बात यह है कि ट्रेन [-2] और ट्रेन [, - 2] एक ही आउटपुट है ... क्या दोनों के बीच कोई और अंतर है ?? – zephyr

+0

आप सही हैं, ऐसा लगता है कि यह डेटा.फ्रेम के लिए काम करता है। मैं हमेशा ट्रेन [, - 2] का उपयोग करता हूं, क्योंकि मैट्रिस ट्रेन के लिए [-2] परिणाम को वेक्टर में बदल देगा और केवल एक तत्व को हटा देगा। ऐसा इसलिए है क्योंकि अवधारणात्मक matrices वैक्टर की तरह हैं और आप पंक्ति/कॉलम – Marco

+0

ओह निर्दिष्ट किए बिना उनमें से प्रत्येक तत्व का उपयोग कर सकते हैं। अब अगला चरण समान कोड निकास त्रुटि दे रहा है। मैंने टेस्ट डेटा फ्रेम में test.csv पढ़ा। फिर: - new_model_predict <- परीक्षण डेटा पर पूर्वानुमान (new_model, परीक्षण)। इसके अलावा मैंने केबिन में लापता लेबल और टेस्ट डेटा के एम्बर्क किए गए कॉलम भी सौंपा। – 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") मॉडल के साथ-साथ भविष्यवाणी करते समय। मार्को के जवाब के संकेत के साथ मैंने remov को एक छोटा सा फ़ंक्शन लिखा है ई डेटा फ्रेम या वेक्टर में बराबर सभी कारक स्तर, नीचे कोड देखें।

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 
} 

कार्यों की कॉल कुछ ऐसा दिखाई देगा: हालांकि, बाद से आर कार्यों के संदर्भ द्वारा पारित करने के लिए अनुमति नहीं है, तो आप फ़ंक्शन के परिणाम (यह मूल dataframe नहीं बदल सकते हैं) का उपयोग करने के

trainX = removeBlankLevelsInDataFrame(trainX) 
trainY = removeBlankLevelsInVector(trainY) 
model = C50::C5.0.default(trainX,trainY) 

हालांकि, ऐसा लगता है, C50 चरित्र एक खाली सेल युक्त कॉलम के साथ एक समान समस्या है, तो आप शायद इस विस्तार करने के लिए चरित्र का श्रेय अगर आप कुछ भी संभाल करने के लिए होगा।

संबंधित मुद्दे