web-dev-qa-db-ja.com

Rでのxgboostのnum_classesについて

Xgboostのnum_classesを正しく設定する方法を理解するのに多くの問題があります。

アイリスのデータを使った例があります

df <- iris

y <- df$Species
num.class = length(levels(y))
levels(y) = 1:num.class
head(y)

df <- df[,1:4]

y <- as.matrix(y)
df <- as.matrix(df)

param <- list("objective" = "multi:softprob",    
          "num_class" = 3,    
          "eval_metric" = "mlogloss",    
          "nthread" = 8,   
          "max_depth" = 16,   
          "eta" = 0.3,    
          "gamma" = 0,    
          "subsample" = 1,   
          "colsample_bytree" = 1,  
          "min_child_weight" = 12)

model <- xgboost(param=param, data=df, label=y, nrounds=20)

これはエラーを返します

Error in xgb.iter.update(bst$handle, dtrain, i - 1, obj) : 
SoftmaxMultiClassObj: label must be in [0, num_class), num_class=3 but found 3 in label

Num_classを2に変更すると、同じエラーが発生します。 num_classを4に増やすと、モデルは実行されますが、600の予測確率が返されます。これは、4つのクラスに意味があります。

エラーが発生しているかどうか、またはxgboostの仕組みを理解できていないかどうかはわかりません。任意の助けいただければ幸いです。

15
House

ラベルはスクリプトの[0、num_class)にある必要がありますadd y<-y-1model <-...

7
RustamA

私もこの奇妙な問題に遭遇しました。私のクラスでは、正しくないラベルのエンコードの結果であるように思われました。

まず、ラベルとしてN個のクラスを持つ文字列ベクトルを使用すると、num_class = N + 1を設定するだけでアルゴリズムを実行できましたが、実際のクラスはN個とN +予測確率の1バケット。

I ラベルを整数として再エンコードa ndし、Nに設定するとnum_classが正常に機能しました。

# Convert classes to integers for xgboost
class <- data.table(interest_level=c("low", "medium", "high"), class=c(0,1,2))
t1    <- merge(t1, class, by="interest_level", all.x=TRUE, sort=F)

そして

param <- list(booster="gbtree",
              objective="multi:softprob",
              eval_metric="mlogloss",
              #nthread=13,
              num_class=3,
              eta_decay = .99,
              eta = .005,
              gamma = 1,
              max_depth = 4,
              min_child_weight = .9,#1,
              subsample = .7,
              colsample_bytree = .5
)

例えば。

4
Hack-R

同じエラーが表示されましたが、私の問題はeval_metricこれは、データにバイナリラベルがある場合にのみ、マルチクラスラベルに使用されることを意図していた。見る eval_metricXGBoost docsのLearning Class Parametersセクション のすべてのオプションのリスト。

2
Vito

私はこの問題を抱えていて、すでに0と1の単位になっている予測子から1を減算しようとしていることがわかりました。おそらく初心者の間違いですが、すでに0と1です。

チュートリアルは言った:

label = as.integer(iris$Species)-1

私のために働いたもの(応答はhigh_endです):

label = as.integer(high_end)
0
Tessa Danehy