LightGBMError: Cannot change feature_pre_filter after constructed Dataset handle.

2024年6月17日

このエラーは、LightGBMで feature_pre_filter パラメータを動的に変更しようとしていることに関連しています。LightGBMの仕様では、データセットハンドルが構築された後に feature_pre_filter を変更することはできません。

この問題を解決するためには、feature_pre_filter パラメータを動的に変更する代わりに、最初から正しい値を設定する必要があります。

具体的には、objective 関数内で lgb_params を構築する際に、feature_pre_filter パラメータを設定する前にデータセットハンドルを構築すればエラーを回避できます。つまり、lgb.train() 関数を呼び出す前に、lgb.Dataset を使用してデータセットハンドルを作成し、それを lgb_params に渡すようにします。以下は修正されたコードです:

python
# 最適化する目的関数の定義
def objective(params):
    # LightGBMのデータセットハンドルを準備
    lgb_train = lgb.Dataset(X_rf_train, label=y_train)
    
    # LightGBMのパラメータを設定
    lgb_params = {
        'boosting_type': 'gbdt',
        'objective': 'multiclass',
        'num_class': num_classes,
        'metric': 'multi_logloss',
        **params
    }
    
    # LightGBMのトレーニング
    lgb_model = lgb.train(lgb_params, lgb_train, num_boost_round=100)
    
    # テストデータでの予測
    y_pred_lgb = lgb_model.predict(X_rf_test, num_iteration=lgb_model.best_iteration)
    y_pred_lgb = np.argmax(y_pred_lgb, axis=1)
    
    # 正解率を計算して返す
    accuracy = accuracy_score(y_test, y_pred_lgb)
    return -accuracy  # 最大化するためにマイナスをかける

これにより、データセットハンドルが構築された後で feature_pre_filter パラメータを設定しようとするエラーが回避されます。

未分類

Posted by ぼっち