ラベルエンコード
ラベルエンコードとは?
ラベルエンコード(Label Encoding)とは、文字やカテゴリ情報を整数のIDに変換する方法です。
機械学習モデルやニューラルネットワークでは、文字列やカテゴリのままでは計算できないため、一意のカテゴリごとに 0,1,2,… といった整数に割り当てて表現します。
📘 今回の具体例(競馬データの場合)
今回の処理では、以下のような列がラベルエンコードの対象になっています。
- 競馬場、芝ダ、馬場、性、年齢層、距離カテゴリ
- 各種クロス特徴(距離×芝ダ、天候×馬場など)
- 血統キー、血統得意距離/脚質/馬場
- 脚質過去、騎手ID、調教師ID
embedding_cols = ['競馬場','芝ダ','馬場','性','年齢層','距離カテゴリ','距離Cx芝ダ',
'天候x馬場','競馬場x芝ダ','年齢層x芝ダ','性x距離カテゴリ','血統キー',
'血統得意距離','血統得意脚質','血統得意馬場','脚質過去',"騎手ID","調教師ID"]
# 連続値として明示(float32にしておく)
for c in ["斤量_馬体重比", "騎手-馬コンビ勝率"]:
data[c] = pd.to_numeric(data[c], errors="coerce").astype("float32").fillna(0.0)
encoders = {}
for col in embedding_cols:
data[col] = data[col].astype(str)
le = LabelEncoder()
data[col] = le.fit_transform(data[col])
encoders[col] = le
joblib.dump(encoders, "label_encoders.pkl")
data.dropna(inplace=True)
📘 このコードは・・・・・
このコードは、学習モデルに渡す前段として カテゴリ列を埋め込み用の整数IDにエンコードし、連続値を float32
に統一、エンコーダを保存して推論時に同じ対応関係を再現できるようにする前処理です。処理の流れと構文の役割は以下の通りです。
- 埋め込み対象列の指定(
embedding_cols
)
競馬場・芝ダ・馬場・性・年齢層・距離カテゴリ・各種クロス特徴・血統キー・脚質過去・騎手ID・調教師IDなど、モデルではカテゴリとして扱いたい列を一覧化。
※騎手ID
や調教師ID
は数値に見えますが「ID」であり、連続値ではなくカテゴリとして扱うためここに含めています。 - 連続値の明示(
pd.to_numeric(...).astype("float32").fillna(0.0)
)斤量_馬体重比
と騎手-馬コンビ勝率
をpd.to_numeric(errors="coerce")
で数値化(不正値はNaN
へ強制変換)、.astype("float32")
で32bit浮動小数点に統一(メモリ節約&DLフレームワークと相性良)、.fillna(0.0)
で欠損をゼロ埋め。
これにより「連続値として学習させるべき列」を明確化します。
- ラベルエンコード(
LabelEncoder
)と型の安定化(astype(str)
)
各カテゴリ列に対してdata[col].astype(str)
で型を文字列に揃える(混在型や欠損での学習不具合を回避。NaN
は文字列"nan"
になります)、le = LabelEncoder()
を生成し、le.fit_transform(data[col])
でユニーク値→整数ID(0,1,2, …) へ一括変換。encoders[col] = le
として列ごとのエンコーダを辞書に保存。
※LabelEncoder
の整数IDは値の辞書順で決まるため、学習データが変わるとIDも変わり得ます。そのため後段の保存が重要です。
- エンコーダの永続化(
joblib.dump(encoders, "label_encoders.pkl")
)
学習時のカテゴリ→ID対応を ひとかたまりの辞書 としてpkl
に保存。推論時はjoblib.load
で読み出し、同じマッピングでtransform
することで一貫性を確保します。 - 残存欠損の除去(
data.dropna(inplace=True)
)
ここまでの変換後にまだ残っている欠損行を一括削除。astype(str)
済みのカテゴリ列は"nan"
という通常のカテゴリになっているため、このdropna
は主に他の列に残った欠損の掃除として働きます。
コメント