実現したいこと
- target encodingの活用方法の違いを理解する
発生している問題・分からないこと
"Kaggleで勝つデータ分析の技術" のp.143から紹介されている次の2つの違いが分かりません。
- target encodingの手法・実装
- target encodingの手法・実装 ークロスバリデーションを行う場合
2番のクロスバリデーションを行う場合においても一番外側の for文にて
Python
1tr_x.loc[:, c] = tmp
のあとに
Python
1train_x[c] = tr_x[c] 2train_x[c] = va_x[c]
として特徴量を元の変数に戻せば1番と同じになります。(外側のKFoldの最終Foldで処理した結果だけがtrain_xに反映されると認識しています。)
そのように考えたため、1と2の違いが分からずどのように活用すれば良いのか分かっていません。
分かる方がいらっしゃいましたら、ご教授いただけますと幸いです。よろしくお願いします。
該当のソースコード
Python
1# ----------------------------------- 2# target encoding (1番の例) 3# ----------------------------------- 4# データの読み込み 5train_x, test_x = load_data() 6# ----------------------------------- 7from sklearn.model_selection import KFold 8 9# 変数をループしてtarget encoding 10for c in cat_cols: 11 # 学習データ全体で各カテゴリにおけるtargetの平均を計算 12 data_tmp = pd.DataFrame({c: train_x[c], 'target': train_y}) 13 target_mean = data_tmp.groupby(c)['target'].mean() 14 # テストデータのカテゴリを置換 15 test_x[c] = test_x[c].map(target_mean) 16 17 # 学習データの変換後の値を格納する配列を準備 18 tmp = np.repeat(np.nan, train_x.shape[0]) 19 20 # 学習データを分割 21 kf = KFold(n_splits=4, shuffle=True, random_state=72) 22 for idx_1, idx_2 in kf.split(train_x): 23 # out-of-foldで各カテゴリにおける目的変数の平均を計算 24 target_mean = data_tmp.iloc[idx_1].groupby(c)['target'].mean() 25 # 変換後の値を一時配列に格納 26 tmp[idx_2] = train_x[c].iloc[idx_2].map(target_mean) 27 28 # 変換後のデータで元の変数を置換 29 train_x[c] = tmp 30 31# ----------------------------------- 32# target encoding - クロスバリデーションのfoldごとの場合 (2番の例) 33# ----------------------------------- 34# データの読み込み 35train_x, test_x = load_data() 36# ----------------------------------- 37from sklearn.model_selection import KFold 38 39# クロスバリデーションのfoldごとにtarget encodingをやり直す 40kf = KFold(n_splits=4, shuffle=True, random_state=71) 41for i, (tr_idx, va_idx) in enumerate(kf.split(train_x)): 42 43 # 学習データからバリデーションデータを分ける 44 tr_x, va_x = train_x.iloc[tr_idx].copy(), train_x.iloc[va_idx].copy() 45 tr_y, va_y = train_y.iloc[tr_idx], train_y.iloc[va_idx] 46 47 # 変数をループしてtarget encoding 48 for c in cat_cols: 49 # 学習データ全体で各カテゴリにおけるtargetの平均を計算 50 data_tmp = pd.DataFrame({c: tr_x[c], 'target': tr_y}) 51 target_mean = data_tmp.groupby(c)['target'].mean() 52 # バリデーションデータのカテゴリを置換 53 va_x.loc[:, c] = va_x[c].map(target_mean) 54 55 # 学習データの変換後の値を格納する配列を準備 56 tmp = np.repeat(np.nan, tr_x.shape[0]) 57 kf_encoding = KFold(n_splits=4, shuffle=True, random_state=72) 58 for idx_1, idx_2 in kf_encoding.split(tr_x): 59 # out-of-foldで各カテゴリにおける目的変数の平均を計算 60 target_mean = data_tmp.iloc[idx_1].groupby(c)['target'].mean() 61 # 変換後の値を一時配列に格納 62 tmp[idx_2] = tr_x[c].iloc[idx_2].map(target_mean) 63 64 tr_x.loc[:, c] = tmp 65 66 # 必要に応じてencodeされた特徴量を保存し、あとで読み込めるようにしておく
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
1番と2番の実装の違いについて調べましたが、分かりやすく説明されている記事等は見つけられませんでした。
補足
特になし
あなたの回答
tips
プレビュー