2013-08-23 16 views
24

Mam zbudować model za pomocą karetki. Gdy zakończono szkolenie Mam następujące ostrzeżenie:Błąd podczas próby przewidywania prawdopodobieństw klas w R - caret

wiadomość Ostrzeżenie: W train.default (x, y, waga = w, ...): Przynajmniej jeden z poziomów klasowych nie obowiązują R nazwy zmiennych; Może to spowodować błędy jeśli prawdopodobieństwa klasy są generowane ponieważ nazwy zmiennych zostaną zamienione na: X0, X1

Nazwy zmiennych są:

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

Mój kod jest następujący:

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") 

pojawia się błąd: błąd w [.data.frame (out,, obsLevels, drop = FAŁSZ): niezdefiniowanych kolumny wybrany

Nazwy zmiennych w zbiorze danych testowych są:

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

Jeśli pominąć typ = „prob” część, mam żadnego błędu.

Wszelkie pomysły?

Może to być długość zmiennej "alchemy_category", która jest dołączana do odpowiednich poziomów czynników, np. "alchemy_categoryarts_entertainment" w modelu?

+0

To nie długość tych zmiennych. Skróciłem je, ale problem pozostaje ... – Stergios

+0

Usunąłem wszystkie czynniki (oprócz zmiennej odpowiedzi oczywiście) i ciągle otrzymuję ten sam błąd !! – Stergios

+1

Zestaw 'classProbs = FALSE' w' trainControl' –

Odpowiedz

36

Odpowiedź jest pogrubioną czcionką w górnej części słupka =]

Co ty modelowania? Czy to jest alchemy_category? Kod mówi tylko formula i nie możemy go zobaczyć.

Gdy pytasz o prawdopodobieństwa klasy, prognozy modelu są ramką danych z oddzielnymi kolumnami dla każdej klasy/poziomu. Jeśli alchemy_category nie ma poziomów, które są poprawnymi nazwami kolumn, data.frame konwertuje następnie na prawidłowe nazwy. Stwarza to problem, ponieważ kod szuka określonej nazwy, ale ramka danych jest inna (ale ważna).

Na przykład, gdybym miał

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

kod byłyby szuka „Poziom 2”, ale tam jest tylko „level.2”.

+0

Przykro mi, ale nie zawarłem tutaj mojej formuły. Modeluję "etykietę", a więc "0" lub "1". Co masz na myśli, że "odpowiedź jest pogrubiona na początku mojego postu =]" ?? Nie rozumiem tego. – Stergios

+6

@Stergios Oznacza, że ​​zawarte w nim ostrzeżenie wyjaśnia, co się dzieje. Ponieważ "0" i "1" nie są poprawnymi nazwami zmiennych R, pojawiają się błędy podczas generowania prawdopodobieństw klas. –

+9

Dobre wyjaśnienie. Miałem swoje klasy jako 0 i 1 i ciągle nie działa z powodu powyższego komunikatu o błędzie. Zmiana tych na "Nie" i "Tak" rozwiązało problem. – xbsd

9

Przeczytałem powyższe odpowiedzi, mając jednocześnie podobny problem. Formalnym rozwiązaniem jest wykonanie tego w pociągu i przetestowanie zestawów danych. Upewnij się, że uwzględniłeś zmienną odpowiedzi również w pliku feature.names.

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)) 
    } 
} 

To tworzy poprawne syntaktycznie etykiety dla wszystkich czynników.

+0

To naprawdę działa !! Dziękuję Ci! – Jojo

0

Zgodnie z powyższym przykładem, zwykle refaktoryzacja zmiennej wyniku naprawi problem. Lepiej zmienić w oryginalnym zbiorze danych przed partycjonowanie do szkoleń i testów zestawów danych

poziomy < - unikatowe (dane $ wynik) dane $ wyników leczenia < - współczynnik (dane $ wynik, etykiety = zrobić.Nazwy (poziomy))

Jak inni wskazał wcześniej, problem ten występuje tylko wtedy, gdy classProbs = TRUE, która powoduje, że funkcja pociąg do wygenerowania dodatkowych danych statystycznych związanych z klasą outcome

9

Jak stwierdzono powyżej wartości klasy musi być czynniki i muszą być poprawnymi nazwami. Innym sposobem, aby zapewnić to,

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

Jak @Sam Firke już wskazano w komentarzach (ale przeoczyłem go) Poziomy prawda/fałsz również nie działają. Więc zamieniłem je na tak/nie.

Powiązane problemy