🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
機械学習

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

1回答

6191閲覧

LightGBMで他クラス分類をする際、すべて同じクラスに予測されるのですが、対処法を教えてください。

TaisukeUmetani

総合スコア1

機械学習

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2020/11/27 11:27

以下のような分布のデータがあります。

このAMT_REQ_CREDIT_MONを目的変数として、testデータの同じ列を予測しようと考えています。

LightGBM + optunaのLightGBM_tuner を用いて学習を行った結果、各列、各クラスの確率が表示されました。

これを見ると、クラス0のスコアが一律に高いことが見て取れると思います。

以下のコードで最終的な予測結果となるpredict列を作成し、クラスのラベル(1~23)を格納しました。

py

1d = {} 2pred['predict'] = 0 3for i in range(31629): 4 d[0] = pred[0][i] 5 d[1] = pred[1][i] 6 d[2] = pred[2][i] 7 d[3] = pred[3][i] 8 d[4] = pred[4][i] 9 d[5] = pred[5][i] 10 d[6] = pred[6][i] 11 d[7] = pred[7][i] 12 d[8] = pred[8][i] 13 d[9] = pred[9][i] 14 d[10] = pred[10][i] 15 d[11] = pred[11][i] 16 d[12] = pred[12][i] 17 d[13] = pred[13][i] 18 d[14] = pred[14][i] 19 d[15] = pred[15][i] 20 d[16] = pred[16][i] 21 d[17] = pred[17][i] 22 d[18] = pred[18][i] 23 d[19] = pred[19][i] 24 d[20] = pred[20][i] 25 d[21] = pred[21][i] 26 d[22] = pred[22][i] 27 pred['predict'][i] = max(d, key=d.get)

もっとも確率が高いラベルを格納しているので、すべての行において0が選択され、以下のようになりました。
イメージ説明

実現したいこと

最後に示したグラフを、最初に示したようなグラフの分布のようにしたいです。
できればLightGBMでそれを行う方法を教えていただきたいです。

コード

py

1cat_cols = non_null_df.columns.tolist() 2cat_cols.append('AMT_REQ_CREDIT_BUREAU_MON') 3 4real_df = df[cat_cols] 5 6train_real_df = real_df[real_df.AMT_REQ_CREDIT_BUREAU_MON.notnull()] 7test_real_df = real_df[real_df.AMT_REQ_CREDIT_BUREAU_MON.isnull()] 8 9from sklearn.preprocessing import LabelEncoder 10le = LabelEncoder() 11 12cat_cols = train_real_df.columns.tolist() 13 14for c in cat_cols: 15 le = LabelEncoder() 16 le.fit(train_real_df[c]) 17 train_real_df[c] = le.transform(train_real_df[c]) 18 19train_real_df = train_real_df.drop('index', axis=1) 20 21cat_cols = train_real_df.columns.tolist() 22 23test_real_df['AMT_REQ_CREDIT_BUREAU_MON'] = 0 24for c in cat_cols: 25 le = LabelEncoder() 26 le.fit(test_real_df[c]) 27 test_real_df[c] = le.transform(test_real_df[c]) 28 29test_real_df = test_real_df.drop(['index','AMT_REQ_CREDIT_BUREAU_MON'],axis=1) 30 31# 学習フェーズ 32y=train_real_df.AMT_REQ_CREDIT_BUREAU_MON 33X=train_real_df.drop(["SK_ID_CURR", "AMT_REQ_CREDIT_BUREAU_MON"],axis=1) 34 35import lightgbm as lgb 36import optuna.integration.lightgbm as lgb_tuner 37from sklearn.model_selection import train_test_split 38 39X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1) 40 41train_dataset=lgb.Dataset(X_train,y_train) 42valid_dataset=lgb.Dataset(X_test,y_test,reference=train_dataset) 43 44params={"objective":"multiclass", 45 "learning_rate":0.05, 46 "metric":'multi_logloss', 47 'num_class':23 48 } 49model=lgb_tuner.train(params, 50 train_set=train_dataset, 51 valid_sets=[valid_dataset], 52 num_boost_round=300, 53 early_stopping_rounds=50)

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

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

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

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

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

guest

回答1

0

ベストアンサー

できれば実装を、という要望は答えていませんが、対処法を、という質問に回答します。

特定の結果に偏るような分類問題は、通常のmetricを使うと、質問者様のような状況になります。以下を参照すると求めるものに近づくものと思います。参照先は2値問題ですが本質的には同様であると思います。

参照

機械学習で分類問題のモデルを評価する指標について
特にf値の記載を参照ください。

LightGBMのf値算出の方法を教えてください

機械学習を用いて製造現場における2値分類モデル作成

投稿2020/11/28 03:58

編集2020/11/28 04:07
toast-uz

総合スコア3266

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

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

TaisukeUmetani

2020/11/28 12:08

ありがとうございます。参考にします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問