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

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

新規登録して質問してみよう
ただいま回答率
85.50%
パラメータ

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

機械学習

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

Python

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

Q&A

解決済

1回答

9246閲覧

Training apiのLightGBMにおいて予測確率を出力させるにはどうしたらいいでしょうか?

almark7032

総合スコア4

パラメータ

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/11/23 16:10

編集2021/11/23 16:20

テーブルデータの二値分類の分析をしています。
LightGBMをoptunaでパラメータチューニングし、チューニングしたパラメータをモデルに渡して学習させROC曲線とROCAUCスコアを出力させたいです。
最初はscikit-learn apiで書いていましたが、これでは調整出来るパラメータが少ないようなので、Training apiで書き換えようとしています。

ROCAUCやROC曲線を出力させるため、各クラスの予測確率を出力させたいのですが、training apiのlgbmにおいて予測確率を出力させるやり方がわかりません。
scikit-learn apiではpredict_probaが使えますが、これはtraining apiでは使えないですよね?

predict_probaの説明自体がscikit-learnのドキュメントに載っていますし、実際実行してみると、

python

1AttributeError: 'Booster' object has no attribute 'predict_proba'

と表示されてしまいます。

「"Training api" "predicted probability"」等で検索しましたが、結論としては解決法を見つけられませんでした。
このページ(https://teratail.com/questions/253968)を参考に、

python

1model.predict_proba(val_x)

としていたところを

python

1model.predict(data=val_x,raw_score=True)

と書き換えたのですが

python

1IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

と表示されてしまいます。

また、過去にも似たような質問はされているようなのですが、(https://teratail.com/questions/349446)結局どうしたらいいのかよくわかりませんでした。

Training apiの場合予測確率を出力させることは不可能なのでしょうか…?

ご回答よろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

almark7032

2021/11/24 03:20

書き方はこういう風にしています。 APIの呼び方ってサイトによってTraining apiとかPython apiとか微妙に違っててよく分からないんですよね。。 公式ドキュメントではPython apiの中でTraining apiとscikit-learn apiに分かれてたように思うのですが…
jbpb0

2021/11/24 04:27 編集

そこから下にスクロールさせたら出てくる「【予測値の確認】」〜「【ROC曲線の描画】」の手順ではダメでしょうか?
almark7032

2021/11/24 12:11 編集

このページの通り、 model.predict(val_x) としてみましたが、同じエラーが出ました。 念の為、学習から予測までのコードを記します。 features = [f_ for f_ in train_x.columns] skf = StratifiedKFold(n_splits=4, shuffle=True, random_state=42) for n_fold, (trn_idx, val_idx) in enumerate(skf.split(train_x,train_y)): trn_x, trn_y = train_x[features].iloc[trn_idx], train_y.iloc[trn_idx] val_x, val_y = train_x[features].iloc[val_idx], train_y.iloc[val_idx] trn_data = lgb.Dataset(trn_x,trn_y) model=lgb.train(params,trn_data, verbose_eval=1000) a=model.predict(val_x)[:,1] fpr, tpr, thres = metrics.roc_curve(val_y,model.predict(val_x)[:,1]) (ここでは何か再現されないですがfor文の中のインデントはきちんと入れています) エラーは ---> 18 a=model.predict(val_x)[:,1] 19 fpr, tpr, thres = metrics.roc_curve(val_y,model.predict(val_x)[:,1]) 20 plt.plot(fpr, tpr, marker='o') IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed となっています(aはエラー箇所特定のために入れています)。
jbpb0

2021/11/24 12:40

私が紹介したWebページの、「LightGBMの基本的な使い方(2値分類編)」の 「準備」(【ライブラリのインポート、関数の定義】〜【クラスの比率】) と、 「LightGBM (Python API)」(【モデルの学習】〜【ROC曲線の描画】) を、Google Colabでそのまま行ったら、Webページに書かれてる通りの結果になりました いろんな【説明変数】を使って、【目的変数】(乳がんでない/乳がんである、のどちらか)を予測する問題なので、質問者さんがやってる > テーブルデータの二値分類の分析 と同様な問題だと思ったのですが、全然違うことをやってるのでしょうか?
almark7032

2021/11/24 12:49

「LightGBMのTraining apiを使ってテーブルデータの二値分類をやっている」という点はこのページと共通です。 ただ、使ってるデータは全然違いますし、僕はstratified kfoldでやってるので、全体のコードは全然違います。
jbpb0

2021/11/24 13:08

Training apiのLightGBMにおいて予測確率を出力させるにはどうしたらいいか? という質問ですよね? その際、stratified kfoldかどうかは、本質では無いのではありませんか?
jbpb0

2021/11/24 13:29 編集

a=model.predict(val_x)[:,1] ↓ 変更 a=model.predict(val_x) print(a.shape) として実行して、「a」の次元を確認してください aは1次元なのに、[:,1]を付けて2次元として扱ってるので、 > array is 1-dimensional, but 2 were indexed となってるのだと思います 【追記】 私が参考に挙げたWebページにも書かれてますが、 a=model.predict(val_x) で計算された「a」はクラス1の確率だけで、クラス0の確率は入ってません クラス0の確率は「1-a」を別途計算します そこが、「scikit-learn API」とは違います
almark7032

2021/11/25 10:45 編集

”[:,1]”を消したら出来ました! ありがとうございました! ご教授頂いた解決法について、回答の方に転記をお願い致します。
guest

回答1

0

ベストアンサー

【初心者向け】LightGBM (2値分類編)【Python】【機械学習】
の「LightGBMの基本的な使い方(2値分類編)」で扱ってるのは

テーブルデータの二値分類の分析

なので、それの「LightGBM (Python API)」の「【予測値の確認】」〜「【ROC曲線の描画】」の手順で可能だと思います

注意点は、「Training API (Python API)」の「model.predict()」で計算されるのはクラス1の確率だけの1次元データで、クラス0の確率は入ってないことです
そこが、「scikit-learn API」の「model.predict_proba()」と違います

投稿2021/11/26 01:29

jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

almark7032

2021/11/26 02:07

ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問