Pyhton APIのlgbmで、単純な二値分類をしています。
二値分類の場合、例えば、目的変数が0と1の分類ならば、各説明変数のデータセットに対して、0,1に対してそれぞれの確率を出すかと思います。そして、最終的に、閾値を決めたり活性化関数を使ったりして0,1に変換するのが一般的なやり方と考えており、そうしていました。
ただ、lgbmでモデルを作る際、lgbm内での評価関数による評価は、0,1ではなく、変換前の連続値で行われているように思います。これは手法として正しいのでしょうか。というのも、モデル生成のする際に、パラメータとして"objective":"binary"はあっりますが、閾値を決めたりするような過程がなく、以下のコードのoofに格納した値も確率になっているためです。
抜き出したものですが、以下がモデル生成と予測のコードです。
ごく一般的なものと思います。
Python
folds = 20 kf = KFold(n_splits=folds, random_state=0, shuffle=True) lgbm_params = { "objective":"binary", "metric": 'auc', "random_seed":0, "learning_rate":0.05, "n_estimators":1000, 'num_leaves': 12, 'max_bin': 179, 'bagging_fraction': 0.7918221226509443, 'bagging_freq': 4, 'feature_fraction': 0.7107392007498818, 'min_data_in_leaf': 10, 'min_sum_hessian_in_leaf': 5 } models =[] roc_auc_scores = [] oof = np.zeros(len(train_X)) for train_index, val_index in kf.split(train_X): X_train = train_X.iloc[train_index] X_valid = train_X.iloc[val_index] y_train = train_y.iloc[train_index] y_valid = train_y.iloc[val_index] lgb_train = lgb.Dataset(X_train, y_train) lgb_eval = lgb.Dataset(X_valid, y_valid, reference=lgb_train) model_lgb = lgb.train(lgbm_params, lgb_train, valid_sets=lgb_eval, num_boost_round=5000, early_stopping_rounds=200, verbose_eval=10, ) y_pred = model_lgb.predict(X_valid, num_iteration=model_lgb.best_iteration) tmp_score = roc_auc_score(y_valid, y_pred) print(tmp_score) models.append(model_lgb) roc_auc_scores.append(tmp_score) oof[val_index] = y_pred
PYthon
oof # array([0.12186042, 0.23685486, 0.04406063, ..., 0.96849681, 0.1656876, 0.04805159])
python
pred_prob = model_lgb.predict(test_df.drop(['id', 'target'], axis=1), num_iteration=model_lgb.best_iteration) pred= np.where(pred_prob < 0.5, 0, 1) pred_df = pd.DataFrame(pred)
Python
pred_df # id target # 0 5 0 # 1 6 0 # 2 8 1 # . . . # . . .
まだ回答がついていません
会員登録して回答してみよう