2013-08-23 16 views
24

キャレットを使用してモデルを構築しました。Rキャレットのクラス確率を予測しようとするとエラーが発生する

警告メッセージ:train.defaultで (X、Y、重み= ...、W): クラスの少なくとも一つのレベルがR無効なトレーニングが完了したとき、私は次の警告を得変数名。クラス確率が生成される場合、変数名はに変換されますので、これはエラーを引き起こすことがあります。X0

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

私はタイプ=「PROB」の部分を省略した場合、私はエラーを取得していません。

アイデア?

変数「alchemy_category」の長さにそれぞれの因子レベルが追加されていますか。モデル内の "alchemy_categoryarts_entertainment"?

+0

これらの変数の長さではありません。私はそれらを短縮しましたが、問題は残っています.. – Stergios

+0

私はすべての要因(もちろん応答変数を除く)を削除し、私は同じエラーが発生し続ける!! – Stergios

+1

'trainControl'に' 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

@Stergios彼はあなたが含む警告メッセージが何がうまくいかないのかを説明することを意味します。 "0"と "1"は有効なR変数名ではないので、クラス確率を生成するときにエラーが発生します。 –

+9

良い説明。私は0と1として私のクラスを持っていたし、上記のエラーメッセージのために失敗し続けた。それらを「いいえ」と「はい」に変更すると、問題が修正されました。 – xbsd

9

私は同様の問題を抱えながら上記の答えを読んだ。正式な解決策は、電車とテストのデータセットでこれを行うことです。 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)) 
    } 
} 

これにより、すべての要素に対して構文的に正しいラベルが作成されます。

+0

それは本当に動作します!ありがとうございました! – Jojo

0

通常、結果変数をリファクタリングすると問題が解決します。ユニークな(データ$結果) データ$結果< - - ファクタ(データ$結果、ラベル=作るには、トレーニングとテストデータセットに

レベル<を分割する前に、元のデータセットに変更すると良いでしょう。名(レベル))

他の人が先に指摘したようにクラス値上述したよう転帰クラス

9

に関連する追加の統計情報を生成する列車機能を引き起こすclassProbs = TRUEが要因でなければならない場合、この問題が発生します有効な名前でなければなりません。 @Sam Firkeが既にコメントで指摘した(しかし、私はそれを見落とし)FALSE/TRUEレベルも動作しないように、これを保証する別の方法は、

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

です。そこで私はそれらをyes/noに変換しました。

関連する問題