質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Kaggle

Kaggleは、機械学習モデルを構築するコンペティションのプラットフォームおよびその運営企業を指します。企業や政府といった組織とデータサイエンティスト・機械学習エンジニアを繋げるプラットフォームであり、単純なマッチングではなくコンペティションが特徴です。

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

lgbmの二値分類の結果について

fu_3823
fu_3823

総合スコア79

Kaggle

Kaggleは、機械学習モデルを構築するコンペティションのプラットフォームおよびその運営企業を指します。企業や政府といった組織とデータサイエンティスト・機械学習エンジニアを繋げるプラットフォームであり、単純なマッチングではなくコンペティションが特徴です。

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0評価

0クリップ

2051閲覧

投稿2021/03/12 22:34

編集2021/03/13 05:43

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 # . . . # . . .

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

toast-uz

2021/03/13 00:47 編集

質問がよくわかりません。モデルは「連続値(0〜1)」(→(A)とします) を出力して、その結果に閾値を当てはめて「0,1の2値」(→(B)とします) にしていることはご理解されていますよね。すなわち、モデル自身は(B)は持っていないことになります。であるのに、モデルが自身の評価(B)でなはく(A)を使っていることが不思議なので教えて下さい、という質問になっています。むしろ逆で、モデル自身が持っていない(B)を使っていたら不思議であると思います。 なお、(A)を確率として解釈するのは間違いですので、ご注意ください。「確率」などという意味は持たない、単なる数値です。
fu_3823

2021/03/13 06:11

コメントありがとうございます。 モデルが(A)しか持たないのはわかります。疑問に思ったのは次の点です。 モデルの精度は、(A)の連続値を0,1の二値へ変換する閾値によって変わります。そのため、lgbmでもパラメータで閾値を設定し、連続値ではなく最終的に0,1の二値(B)で評価できるようにする必要があるのではないか。 ということです。 ですので、lgbmで二値分類をしたつもりでいるが、結果として連続値しか出力できていない。これは手法として誤ったことをしているのではないかということをお聞きしたかったのです。 二値分類のコードを書いたのに、lgbmの結果が二値ではなく(A)であるのは私の間違いではないか、と思っています。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Kaggle

Kaggleは、機械学習モデルを構築するコンペティションのプラットフォームおよびその運営企業を指します。企業や政府といった組織とデータサイエンティスト・機械学習エンジニアを繋げるプラットフォームであり、単純なマッチングではなくコンペティションが特徴です。

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。