Motivation
- 現在参加中の機械学習コンペで伸び悩んでいたので、ずっと避けてたtarget encodingを満を辞して実装しようと思った(いやいや、さっさとやれよって話)
- 以前に一度見よう見まねで実装したことはあるのだが、処理が不十分だったのかスコアが極端に悪化したのでそのままそっ閉じ。
- 前述の状況により、とうとう向き合うしかなくなったので(後が無くなったので)、ちゃんと学ぶためにどうする?? -> 折角だし記事にしながら学べば良いんじゃね? <- 今ここ!(Zennありがとう)
Action
前回の反省を活かし、まずは"What is the target encoding?"から入り、その後sklearnのAPIを咀嚼して根本理解を深める
target encodingとは?
先輩方の知恵を拝借させて頂きます🙇
https://www.codexa.net/target_encoding/
https://note.com/shuzooooo/n/n2ee906287672
いくつかのポイント
- target encodingは”カテゴリ変数”に対する”前処理”の方法の一つ
- カテゴリ変数 -> 数値への変換
- 他にも"One hot encoding", "Label encoding", "Count encoding"がある(Count encodingは知らなかった)
- カテゴリ変数をカテゴリ毎の"目的変数の平均値(場合によっては中央値)"に変換する
- カテゴリ変数 -> あるカテゴリが取りうる目的変数の平均値(または中央値)という情報になる
- ”目的変数の平均値”の取り方もいくつかある
- Greedy Target Encoding, Leave-one-out Target Encoding, Holdout Target Encodingの三種類
- ”目的変数”を利用するため”リーク”の危険がある
- 変数が答に対する情報を持っている状態 => 未知のデータに対して役に立たないモデルの出来上がり(言い過ぎかな?)
- Target encoding後に”Smoothing”を行いリークを防ぐ方法もある
- "Target encodingへの重みづけ"や”ノイズの追加”など
リークの危険は他の記事を見ても必ずといっていいほど出てくる。変換時に必ず目的変数を使用するので、当たり前と言えば当たり前。学習時はk-fold等の方法があるから良いとして、推論時はどうするんだ?
sklearn.preprocessing.TargetEncoder
scikit-learnの公式API
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.TargetEncoder.html
parameters
- categories: "auto" for list of shape (n_features)
- カテゴリ変数のcolumnを指定する or autoで自動的に検出
- target_type: {“auto”, “continuous”, “binary”, “multiclass”}, default=”auto”
- 目的変数のタイプを指定。autoだと自動的に判定
- smooth: “auto” or float, default=”auto”
- グローバル平均のターゲット平均への混合率。autoだと
then smooth is set to an empirical Bayes estimate. - ここむずいな
- グローバル平均のターゲット平均への混合率。autoだと
- cv: int, default=5
- お馴染み
cross validation数。fit_transformの時に使われる(=fitの時には使われない) - 確かにfitの所に
It is discouraged to use this method because it can introduce data leakage.って注意書きされている
- お馴染み
- shuffle: bool, default=True
- k-fold前にshuffleを行うかどうか。
- random_state
- これもお馴染みrandom_state
- shuffle時に使用
Next
- どうせやってく内に詰まる箇所が出てくるので、都度調査
- 記事の中でTitanic データを使ったデモがあるのでまずはそれを動かしてみる
- 実際のコンペデータへ適用してscoreの変動をテスト
- 提出データへ適用(ここマジでどうやるんだ?)