この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)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/28 12:08