2013-08-23 8 views
24

में कक्षा की संभावनाओं की भविष्यवाणी करने का प्रयास करता हूं तो मैंने कैरेट का उपयोग करके एक मॉडल बनाया है।त्रुटि जब मैं आर-कैरेट

चेतावनी संदेश: train.default में (एक्स, वाई, वजन = w, ...): कम से कम वर्ग स्तरों में से एक नहीं हैं वैध आर जब प्रशिक्षण पूरा कर लिया गया था मैं निम्न चेतावनी मिल गया चर नाम; यह अगर वर्ग संभावनाओं उत्पन्न कर रहे हैं क्योंकि चर नाम में परिवर्तित हो जाएगा त्रुटियां हो सकती हैं: X 0,

X1 चर के नाम हैं:

ctrl <- trainControl(method = "CV", 
        number=10, 
        classProbs = TRUE, 
        allowParallel = TRUE, 
        summaryFunction = twoClassSummary) 

set.seed(476) 
rfFit <- train(formula, 
       data=train, 
       method = "rf", 
       tuneGrid = expand.grid(.mtry = seq(4,20,by=2)), 
       ntrees=1000, 
       importance = TRUE, 
       metric = "ROC", 
       trControl = ctrl) 


pred <- predict.train(rfFit, newdata = test, type = "prob") 
:

 str(train) 
'data.frame': 7395 obs. of 30 variables: 
$ alchemy_category    : Factor w/ 13 levels "arts_entertainment",..: 2 8 6 6 11 6 1 6 3 8 ... 
$ alchemy_category_score  : num 3737 2052 4801 3816 3179 ... 
$ avglinksize     : num 2.06 3.68 2.38 1.54 2.68 ... 
$ commonlinkratio_1    : num 0.676 0.508 0.562 0.4 0.5 ... 
$ commonlinkratio_2    : num 0.206 0.289 0.322 0.1 0.222 ... 
$ commonlinkratio_3    : num 0.0471 0.2139 0.1202 0.0167 0.1235 ... 
$ commonlinkratio_4    : num 0.0235 0.1444 0.0426 0 0.0432 ... 
$ compression_ratio    : num 0.444 0.469 0.525 0.481 0.446 ... 
$ embed_ratio     : num 0 0 0 0 0 0 0 0 0 0 ... 
$ frameTagRatio     : num 0.0908 0.0987 0.0724 0.0959 0.0249 ... 
$ hasDomainLink     : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... 
$ html_ratio     : num 0.246 0.203 0.226 0.266 0.229 ... 
$ image_ratio     : num 0.00388 0.08865 0.12054 0.03534 0.05047 ... 
$ is_news      : Factor w/ 2 levels "0","1": 2 2 2 2 2 1 2 1 2 1 ... 
$ lengthyLinkDomain    : Factor w/ 2 levels "0","1": 2 2 2 1 2 1 1 1 1 2 ... 
$ linkwordscore     : num 24 40 55 24 14 12 21 5 17 14 ... 
$ news_front_page    : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... 
$ non_markup_alphanum_characters: num 5424 4973 2240 2737 12032 ... 
$ numberOfLinks     : num 170 187 258 120 162 55 93 132 194 326 ... 
$ numwords_in_url    : num 8 9 11 5 10 3 3 4 7 4 ... 
$ parametrizedLinkRatio   : num 0.1529 0.1818 0.1667 0.0417 0.0988 ... 
$ spelling_errors_ratio   : num 0.0791 0.1254 0.0576 0.1009 0.0826 ... 
$ label       : Factor w/ 2 levels "0","1": 1 2 2 2 1 1 2 1 2 2 ... 
$ isVideo      : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 1 1 ... 
$ isFashion      : Factor w/ 2 levels "0","1": 1 1 1 1 2 1 2 1 2 1 ... 
$ isFood      : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ... 
$ hasComments     : Factor w/ 2 levels "0","1": 1 2 2 2 2 1 2 2 1 2 ... 
$ hasGoogleAnalytics   : Factor w/ 2 levels "0","1": 1 1 1 1 2 1 2 2 2 1 ... 
$ hasInlineCSS     : Factor w/ 2 levels "0","1": 1 2 2 2 1 1 2 1 2 2 ... 
$ noOfMetaTags     : num 10 12 6 10 13 2 6 6 9 5 ... 

मेरे कोड पीछा कर रहा है [.data.frame (बाहर,, obsLevels, ड्रॉप = FALSE) में त्रुटि::

मैं त्रुटि मिलती चयनित अपरिभाषित कॉलम

परीक्षण डेटा सेट पर चर नाम हैं:

str(test) 
'data.frame': 3171 obs. of 29 variables: 
$ alchemy_category    : Factor w/ 13 levels "arts_entertainment",..: 8 4 12 4 10 12 12 8 1 2 ... 
$ alchemy_category_score  : num 5307 4825 1 6708 5416 ... 
$ avglinksize     : num 2.56 3.77 2.27 2.52 1.85 ... 
$ commonlinkratio_1    : num 0.39 0.462 0.496 0.706 0.471 ... 
$ commonlinkratio_2    : num 0.257 0.205 0.385 0.346 0.161 ... 
$ commonlinkratio_3    : num 0.0441 0.0513 0.1709 0.123 0.0323 ... 
$ commonlinkratio_4    : num 0.0221 0 0.1709 0.0906 0 ... 
$ compression_ratio    : num 0.49 0.782 1.25 0.449 0.454 ... 
$ embed_ratio     : num 0 0 0 0 0 0 0 0 0 0 ... 
$ frameTagRatio     : num 0.0671 0.0429 0.0588 0.0581 0.093 ... 
$ hasDomainLink     : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... 
$ html_ratio     : num 0.23 0.366 0.162 0.147 0.244 ... 
$ image_ratio     : num 0.19944 0.08 10 0.00596 0.03571 ... 
$ is_news      : Factor w/ 2 levels "0","1": 2 1 1 2 2 1 1 2 1 1 ... 
$ lengthyLinkDomain    : Factor w/ 2 levels "0","1": 2 2 2 2 1 2 2 1 1 1 ... 
$ linkwordscore     : num 15 62 42 41 34 35 15 22 41 7 ... 
$ news_front_page    : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... 
$ non_markup_alphanum_characters: num 5643 382 2420 5559 2209 ... 
$ numberOfLinks     : num 136 39 117 309 155 266 55 145 110 1 ... 
$ numwords_in_url    : num 3 2 1 10 10 7 1 9 5 0 ... 
$ parametrizedLinkRatio   : num 0.2426 0.1282 0.5812 0.0388 0.0968 ... 
$ spelling_errors_ratio   : num 0.0806 0.1765 0.125 0.0631 0.0653 ... 
$ isVideo      : Factor w/ 2 levels "0","1": 1 2 1 2 2 2 1 1 2 2 ... 
$ isFashion      : Factor w/ 2 levels "0","1": 1 1 1 1 1 2 1 1 1 1 ... 
$ isFood      : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ... 
$ hasComments     : Factor w/ 2 levels "0","1": 2 1 1 2 2 2 1 2 2 1 ... 
$ hasGoogleAnalytics   : Factor w/ 2 levels "0","1": 1 2 2 2 2 1 1 2 1 1 ... 
$ hasInlineCSS     : Factor w/ 2 levels "0","1": 2 2 2 1 1 2 2 2 1 1 ... 
$ noOfMetaTags     : num 3 6 5 9 16 22 6 9 7 0 ... 

अगर मैं प्रकार छोड़ देते हैं = "समस्या" भाग, मुझे कोई त्रुटि मिलती है।

कोई विचार?

यह चर "alchemy_category" की लंबाई हो सकता है जो संबंधित कारक स्तरों के साथ संलग्न है उदा। मॉडल के अंदर "alchemy_categoryarts_entertainment" ??

+0

यह इन चरों की लंबाई नहीं है। मैंने उन्हें छोटा कर दिया लेकिन समस्या बनी हुई है .. – Stergios

+0

मैंने सभी कारकों को हटा दिया (पाठ्यक्रम की प्रतिक्रिया चर को छोड़कर) और मुझे एक ही त्रुटि मिल रही है !! – Stergios

+1

'ट्रेन नियंत्रण' में 'classProbs = FALSE' सेट करें –

उत्तर

36

जवाब अपनी पोस्ट के शीर्ष पर बोल्ड में है =]

आप क्या मॉडल कर रहे हैं? क्या यह alchemy_category है? कोड केवल formula कहता है और हम इसे नहीं देख सकते हैं।

जब आप कक्षा की संभावनाओं के लिए पूछते हैं, तो मॉडल पूर्वानुमान प्रत्येक कक्षा/स्तर के लिए अलग-अलग कॉलम वाले डेटा फ्रेम होते हैं। यदि alchemy_category में ऐसे स्तर नहीं हैं जो मान्य कॉलम नाम हैं, data.frame तब मान्य नामों में परिवर्तित हो जाते हैं। इससे कोई समस्या उत्पन्न होती है क्योंकि कोड एक विशिष्ट नाम की तलाश में है लेकिन डेटा फ्रेम एक अलग (लेकिन वैध) नाम के रूप में है।

उदाहरण के लिए

, अगर मैं था

> test <- factor(c("level1", "level 2")) 
> levels(test) 
[1] "level 2" "level1" 
> make.names(levels(test)) 
[1] "level.2" "level1" 

कोड "स्तर 2" तलाश कर रहा होगा लेकिन वहाँ केवल "level.2" है।

+0

क्षमा करें मैंने यहां अपना फॉर्मूला शामिल नहीं किया है। मैं 'लेबल' मॉडल करता हूं, इसलिए "0" या "1"। आपका क्या मतलब है कि "जवाब मेरी पोस्ट के शीर्ष पर बोल्ड में है =]" ?? मुझे यह नहीं मिला। – Stergios

+6

@ स्टेरिजियोस का मतलब है कि आपके द्वारा शामिल चेतावनी संदेश में बताया गया है कि क्या गलत हो रहा है। चूंकि "0" और "1" वैध आर चर नाम नहीं हैं, इसलिए कक्षा संभावनाओं को उत्पन्न करते समय आपको त्रुटियां मिलती हैं। –

+9

अच्छी व्याख्या। मेरे पास कक्षाएं 0 और 1 थीं और उपर्युक्त त्रुटि संदेश के कारण यह विफल रही। उन्हें "नहीं" और "हां" में बदलना समस्या को हल करता है। – xbsd

9

मैंने इसी तरह की समस्या का सामना करते हुए उपरोक्त उत्तरों के माध्यम से पढ़ा है। एक औपचारिक समाधान ट्रेन और परीक्षण डेटासेट पर ऐसा करना है। सुनिश्चित करें कि आप फीचर.नाम में भी प्रतिक्रिया चर शामिल हैं।

feature.names=names(train) 

for (f in feature.names) { 
    if (class(train[[f]])=="factor") { 
    levels <- unique(c(train[[f]])) 
    train[[f]] <- factor(train[[f]], 
        labels=make.names(levels)) 
    } 
} 

यह सभी कारकों के लिए वाक्य रचनात्मक रूप से सही लेबल बनाता है।

+0

यह वास्तव में काम करता है !! धन्यवाद! – Jojo

0

उपर्युक्त उदाहरण के अनुसार, आम तौर पर परिणाम चर को पुन: सक्रिय करने से समस्या ठीक हो जाएगी। अद्वितीय (डेटा $ परिणाम) डेटा $ परिणाम < - - कारक (डेटा $ परिणाम, लेबल = बनाने यह प्रशिक्षण और परीक्षण डेटासेट में विभाजन

स्तरों < से पहले मूल डेटासेट में परिवर्तित करने के लिए बेहतर है।नाम (स्तर))

के रूप में दूसरों को पहले ने कहा, इस समस्या को केवल जब classProbs = TRUE जो ट्रेन समारोह परिणाम वर्ग

9

से संबंधित अतिरिक्त आंकड़े उत्पन्न करने के लिए के रूप में वर्ग मूल्यों ऊपर कहा गया है कारकों होना चाहिए का कारण बनता है तब होता है और वैध नाम होना चाहिए। इस बीमा करने के लिए एक और तरीका है, है

levels(all.dat$target) <- make.names(levels(factor(all.dat$target))) 
0

@Sam Firke जैसा कि पहले ही टिप्पणी में कहा (लेकिन मैं इसे अनदेखा) सही स्तरों/गलत भी काम नहीं करते। तो मैंने उन्हें हां/नहीं में बदल दिया।

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