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