0.はじめに
みなさんこんにちは!ゆめおです!(ネーミングセンスがないな...と日々思っているので、良い案があれば名前は変える予定...)
今回はKaggleのTitanic問題における、乗客の生死をロジスティック回帰で分類することを試みました。
余談:Kaggleで復習するススメ
現在、データサイエンスを学ぶ大学院に通っており、統計の講義を受講していますが、テストがないので知識が定着せず、生成AIにテストを作成してもらおうかと思っていました。
あるときKaggleで機械学習モデルを作成することが、統計の復習になるのではないかと思い、コンペにいくつか出場しようと思っています。実務でデータサイエンスに携われない私のような人間には「統計の学習」と「Kaggleコンペ」を回すことが有効なのではないかと思います。
1.データセットについて
以下のデータセットの説明は、恐縮ですが「@kaita_kakihara」様から引用させていただいたものです🙇♂️
| カラム名 | 説明 |
| PassengerId | 乗客の一意の識別番号 |
| Survived | 乗客が生存したかどうか(1: 生存, 0: 死亡) |
| Pclass | 乗客の社会経済的地位を示すクラス(1st, 2nd, 3rd) |
| Name | 乗客の名前 |
| Sex | 乗客の性別 |
| Age | 乗客の年齢 |
| SibSp | タイタニック号に同乗している兄弟または配偶者の数 |
| Parch | タイタニック号に同乗している親または子供の数 |
| Ticket | チケット番号 |
| Fare | 乗船料金 |
| Cabin | 部屋番号 |
| Embarked | 乗船した港(C: Cherbourg, Q: Queenstown, S: Southampton) |
生存者の割合が極端に少ない場合、モデルが全て死者に分類するといった問題が発生するので、訓練データにおける生存者確率を求めましたが、約39%で極端な偏りはなかったです。
削除する説明変数は3つあります。1つ目はPassengerIdで、乗客の識別番号(ID)で乗客の生死に関係ないため、削除します。2つ目はNameで、家族関係を示すものとなりうる気がするのですが、疎行列を作ってまで分析しようという気概は流石にないので、今回は削除します。3つ目はTicketです。
その他の説明変数について、項番2〜4で対応を検討していきます。
項番2では、AgeとCabin、Embarkedには欠損値があるため、それぞれどのように対応するのか検討します。
項番3では、L1正則化の最適なパラメータの値をクロスバリデーションを行い、求めることにより、過学習を起こさないようにモデリングします。
2.欠損値処理
AgeとCabin、Embarkedにて欠損値が見つかったので、それぞれについて対処していきます。
欠損値処理では、欠損値がMCAR(Missing Completely At Random)、MAR(Missing At Random)、MNAR(Missing Not At Random)のどれに分類されるかで対応が変わります。それぞれ以下のような特徴があります。
| MCAR | 欠損値が完全にランダムなケース。 | 削除法 |
| MAR | 欠損であるかどうかが、そのデータの値の大小には影響を受けないが、その他の変数の値の大小に影響を受けるケース。 | 多重代入法 |
| MNAR | 欠損であるかどうかが、そのデータの値の大小に影響を受けるケース。 | 感情分析(?) |
Ageの欠損は、年齢の大小に影響を受けていると考えずらく、乗員の生死に影響を受けていると考えられます。これは、「そのデータ自身に影響を受けないが、その他の変数の大小に影響を受けるケース」なので、MARだと考えられます。ここでは多重代入法を用いることとし、重回帰分析で欠損値を補完します。
Cabinの欠損については、「Cabinの記録があるのか、ないのか」自体が重要な情報であると思われますので、データが入力されている場合は「1」で置き換え、データが入力されていない(欠損)の場合は「0」で置き換えます。
Embarkedは検証用データにおいて、1つも存在せず、訓練データにも欠損値は2つしか含まれなかったので、訓練データの欠損値は行ごと削除します。
3.L1正則化
過学習を防ぐため、モデルにL1正則化を導入します。ロジスティック回帰ではパラメータC(正則化項λの逆数)が用意されており、大きくするにつれて正則化が強くなります。ここでは、クロスバリデーションで最適なパラメーターλの値を求めます。10分割のクロスバリデーションを行った結果、100前後でモデルの精度が一定となったため、「C=100」としてロジスティック回帰を実施しました。
4.さいごに
上記の工夫を凝らしたモデルによる予測を提出したのですが、精度は76.315%でした。想像より低く、改善が必要だと思いました...
原因として考えられることについて書いてみます。モデルについては、ロジスティック回帰ではなく、結果だけを求めるならディープラーニングでもよかったのではないかと思いました。また、最初に変数をいくつか削除していますが、削除せずに利用すべきだと思います(これに関しては時間をかける気概がないので、やる気のある方はぜひ...)。