kaggleの雑記

LightGBMError: Label must be in [0, x), but found y in labelが出た時の対処法

LightGBMError: Label must be in ….と言われて嵌った話

lightgbmを初めて使った頃に下記のようなエラーが出ました。

 LightGBMError: Label must be in [0, 3), but found 335 in label

このようなエラーが出るときは、分類するべきクラス数に対して、paramsで設定するnum_classが間違っています。

分類するべき数だけnum_classを設定する必要があります。

例えば動物の分類で、犬と猫とうさぎの3種類に分類する問題であればnum_classは3にしなくてはなりません。

私自身の失敗例コード

params = {'task': 'train',
        'boosting_type': 'gbdt',
        'objective': 'multiclass',
        'metric': {'multi_logloss'},
        "verbosity":-1,
        'num_class': 3,  # ここの設定が失敗していた
        "seed":42}

num_round = 1000

categorical_features = cat_features
model = lgb.train(params, lgb_train, num_boost_round=num_round,
                  categorical_feature=categorical_features,
                  valid_names=["train", "valid"], valid_sets=[lgb_train, lgb_valid]
                  ,early_stopping_rounds=0)

va_pred = model.predict(X_valid)
score = mean_squared_error(y_valid.values, np.argmax(va_pred, axis=1))
print(f"logloss: {score:.4f}")

lightgbm初心者だった私はparamsを別のコードからそのまま持ってきました。参加していたのは給与推定コンペで給与の種類はいくつもあります。この時は給与の最大が1100(万円)だったので、num_classを1100にすることで解決できました。

ただし、この解法はただしくありません。給与コンペのような数値を予測するコンペは回帰問題として取り扱うべきです。詳しくは下記ブログに記載いたします。

2値問題の時は

'objective': 'binary',

2値問題の時はobjectiveをbinaryに設定するようです。

参考:公式ドキュメントより

https://lightgbm.readthedocs.io/en/latest/Parameters.html#num_class

ABOUT ME
hirayuki
今年で社会人3年目になります。 日々体当たりで仕事を覚えています。 テーマはIT・教育です。 少しでも技術に親しんでもらえるよう、noteで4コマ漫画も書いています。 https://note.mu/hirayuki