2011-12-07 22 views
7

私はロジスティック回帰を行うのにGBMパッケージを使用したいと考えていましたが、0-1の範囲を少し超えて答えを出しています。私は0-1の予測(bernoulli、およびadaboost)の提案された配信パラメータを試しましたが、実際にはgaussianを使用するよりも悪化します。R gbmロジスティック回帰

GBM_NTREES = 150 
GBM_SHRINKAGE = 0.1 
GBM_DEPTH = 4 
GBM_MINOBS = 50 
> GBM_model <- gbm.fit(
+ x = trainDescr 
+ ,y = trainClass 
+ ,distribution = "gaussian" 
+ ,n.trees = GBM_NTREES 
+ ,shrinkage = GBM_SHRINKAGE 
+ ,interaction.depth = GBM_DEPTH 
+ ,n.minobsinnode = GBM_MINOBS 
+ ,verbose = TRUE) 
Iter TrainDeviance ValidDeviance StepSize Improve 
    1  0.0603    nan  0.1000 0.0019 
    2  0.0588    nan  0.1000 0.0016 
    3  0.0575    nan  0.1000 0.0013 
    4  0.0563    nan  0.1000 0.0011 
    5  0.0553    nan  0.1000 0.0010 
    6  0.0546    nan  0.1000 0.0008 
    7  0.0539    nan  0.1000 0.0007 
    8  0.0533    nan  0.1000 0.0006 
    9  0.0528    nan  0.1000 0.0005 
    10  0.0524    nan  0.1000 0.0004 
    100  0.0484    nan  0.1000 0.0000 
    150  0.0481    nan  0.1000 -0.0000 
> prediction <- predict.gbm(object = GBM_model 
+ ,newdata = testDescr 
+ ,GBM_NTREES) 
> hist(prediction) 
> range(prediction) 
[1] -0.02945224 1.00706700 

ベルヌーイ:

GBM_model <- gbm.fit(
x = trainDescr 
,y = trainClass 
,distribution = "bernoulli" 
,n.trees = GBM_NTREES 
,shrinkage = GBM_SHRINKAGE 
,interaction.depth = GBM_DEPTH 
,n.minobsinnode = GBM_MINOBS 
,verbose = TRUE) 
prediction <- predict.gbm(object = GBM_model 
+ ,newdata = testDescr 
+ ,GBM_NTREES) 
> hist(prediction) 
> range(prediction) 
[1] -4.699324 3.043440 

とのAdaBoost:

GBM_model <- gbm.fit(
x = trainDescr 
,y = trainClass 
,distribution = "adaboost" 
,n.trees = GBM_NTREES 
,shrinkage = GBM_SHRINKAGE 
,interaction.depth = GBM_DEPTH 
,n.minobsinnode = GBM_MINOBS 
,verbose = TRUE) 
> prediction <- predict.gbm(object = GBM_model 
+ ,newdata = testDescr 
+ ,GBM_NTREES) 
> hist(prediction) 
> range(prediction) 
[1] -3.0374228 0.9323279 

は、私が何か間違ったことをやっている私は、前処理(スケール、中央)にデータが必要なのでしょうか、私は行く必要があります次のような値で手動で値をフロア/キャップします。

prediction <- ifelse(prediction < 0, 0, prediction) 
prediction <- ifelse(prediction > 1, 1, prediction) 
+0

あなたのデータを共有しますか? – abcde123483

答えて

14

から?predict.gbm

予測のベクトルを返します。デフォルトでは、予測はf(x)のスケール上にあります。たとえば、Bernoulliの損失の場合は 、戻り値はログオッズスケール、ポアソン損失はログスケール、 coxphはログハザードスケールです。

type = "response"の場合、gbmは結果と同じ縮尺に変換します。現在のところ、 の唯一の効果は、ベルヌーイの確率とポアソンの期待カウントです。 の他のディストリビューションでは、 "response"と "link"は同じ結果を返します。

したがって、distribution="bernoulli"を使用する場合は、予測値を[0、1]:p <- plogis(predict.gbm(model))にスケール変更する必要があります。 distribution="gaussian"を使用するのは、実際には分類とは対照的に回帰のためですが、私は予測が[0、1]にないことに驚いています。私の理解はgbmがまだ木に基づいているためです。トレーニングデータに存在する値の外側に移動します。

+0

Thanks.gbm()の 'type ='引数を 'response'に変更する必要がありました。 – screechOwl

関連する問題