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の仕組みを理解できていないかどうかはわかりません。任意の助けいただければ幸いです。
ラベルはスクリプトの[0、num_class)にある必要がありますadd y<-y-1
前 model <-...
私もこの奇妙な問題に遭遇しました。私のクラスでは、正しくないラベルのエンコードの結果であるように思われました。
まず、ラベルとして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
)
例えば。
同じエラーが表示されましたが、私の問題はeval_metric
これは、データにバイナリラベルがある場合にのみ、マルチクラスラベルに使用されることを意図していた。見る eval_metric
XGBoost docsのLearning Class Parametersセクション のすべてのオプションのリスト。
私はこの問題を抱えていて、すでに0と1の単位になっている予測子から1を減算しようとしていることがわかりました。おそらく初心者の間違いですが、すでに0と1です。
チュートリアルは言った:
label = as.integer(iris$Species)-1
私のために働いたもの(応答はhigh_endです):
label = as.integer(high_end)