今回は機械学習モデルそのものではなく、特徴量エンジニアリング(Feature Engineering)について学習した。
ここまでTitanicデータセットでは、以下のような特徴量を利用してモデルを作成してきた。
- Pclass
- Sex
- Age
- Fare
- FamilySize
しかしKaggleでは、モデルを変更するよりも新しい特徴量を作ることの方が精度向上につながるケースが多いらしい。
今回はその第一歩として、乗客の氏名(Name)から敬称(Title)を取り出して特徴量として利用できるかを調べてみた。
特徴量エンジニアリングとは
特徴量エンジニアリングとは、既存のデータからモデルにとって有益な新しい特徴量を作成することである。
例えばTitanicには次のような列が存在する。
- SibSp(兄弟・配偶者の人数)
- Parch(親・子供の人数)
以前の学習では、この2つから
FamilySize = SibSp + Parch + 1
という新しい特徴量を作成した。
これは「家族の人数」という人間にとって分かりやすい情報へ変換した例であり、これも特徴量エンジニアリングである。
NameからTitleを抽出する
今回は氏名(Name)から敬称を取り出してみる。
df["Title"] = df["Name"].str.extract(r",\s*([^.]+)\.")
このコードでは、Name列から
- Mr
- Mrs
- Miss
- Master
- Dr
などの敬称だけを取り出し、新しいTitle列として追加している。
Titleの件数を調べる
敬称の件数を確認してみる。
print(df["Title"].value_counts())
Mr 517 Miss 182 Mrs 125 Master 40 Dr 7 Rev 6 Major 2 Mlle 2 Col 2 Don 1 Mme 1 Ms 1 Lady 1 Sir 1 Capt 1 the Countess 1 Jonkheer 1
上位4種類だけでほとんどのデータを占めていることが分かる。
一方で、SirやLadyなどは1件しか存在しない。
このようなカテゴリをそのまま学習させると、その1件だけの特徴を覚えてしまう可能性があるため、KaggleではRare(その他)としてまとめることが多いらしい。
MlleやMmeはなぜまとめるのか
ChatGPTとのやり取りの中で疑問になったのが、次のような変換である。
Mlle → Miss Mme → Mrs
最初は単純にカテゴリ数を減らすためだと思っていた。
しかし実際には、
- Mlle = Mademoiselle(フランス語)
- Mme = Madame(フランス語)
であり、英語のMiss、Mrsと同じ意味であることを知った。
つまり言語が違うだけで意味は同じカテゴリなのでまとめているのである。
Titleごとの生存率を調べる
特徴量として使えそうかを確認するため、生存率も集計した。
print(df.groupby("Title")["Survived"].mean())
Title Master 0.575000 Miss 0.702703 Mr 0.156673 Mrs 0.793651 Rare 0.318182 the Countess 1.000000
結果を見るとかなり差がある。
- Mr:約16%
- Miss:約70%
- Mrs:約79%
- Master:約58%
- Rare:約32%
特にMrだけ生存率が非常に低い。
これはTitanicで女性や子どもが優先的に避難したという歴史的背景とも一致している。
また、Master(男児)の生存率が成人男性よりかなり高い点も興味深かった。
Titleには性別だけでなく、年齢や社会的立場など複数の情報が含まれていることが分かる。
ここで疑問になったこと
Titleを特徴量へ追加するなら、次のように書けば良さそうに見える。
features = [
"Pclass",
"Sex",
"Age",
"Fare",
"FamilySize",
"Title"
]
しかし、このままではモデルは学習できない。
理由はTitleは文字列だからである。
機械学習モデルは基本的に数値を入力として計算するため、文字列のままでは扱えない。
以前Sexを
male → 0 female → 1
へ変換したように、Titleについても数値へ変換する必要がある。
ただし、
Mr → 0 Mrs → 1 Miss → 2 Master → 3 Rare → 4
のように単純に番号を付けると、「Rare > Master > Miss」のような大小関係が存在するとモデルが誤解する可能性がある。
この問題を解決する方法として、次回はOne-Hot Encodingについて学ぶ予定である。
今回の学び
- 特徴量エンジニアリングはKaggleでも重要な技術である
- NameからTitleという新しい特徴量を作成できる
- カテゴリ数が少ないものはRareへまとめる考え方がある
- Titleには性別だけでなく年齢などの情報も含まれている
- カテゴリ変数はそのままでは学習できず、適切な数値化が必要になる
あとがき
今回は新しいモデルを学ぶ回ではなく、「データからどんな情報を引き出せるか」を考える回だった。
これまではモデルのアルゴリズムに意識が向いていたが、実際にはデータの加工や特徴量設計がモデル性能へ大きく影響することを実感した。
また、ChatGPTを講師・壁打ち相手として利用することで、「なぜこの特徴量を作るのか」「この処理にはどんな意味があるのか」といった部分まで掘り下げながら学習を進められた。コードを動かすだけで終わらず、自分の言葉で説明できるところまで理解することを意識して、今後も学習を続けていきたい。