前回はあまり深く考えずにやったので、今回は少しだけ深堀してみます。
今回は年齢の欠損値について少し考えてみました。前回は欠損値のあるデータは全て削除していましたが、生存予測をする際、年齢はかなり生存に影響するようです。なので欠損値に適切な年齢を与えることができれば、訓練データを減らすことなく高い精度で分類ができるのではと思いました。下の図は年齢での生存結果です。青が死亡、オレンジが生存です。若い人のほうが生き残ることができてて、年を取っている人のほうが生き残れていないような気がします。
で、どうやって適切な年齢を与えるかというと、乗客の名前に注目してみます。乗客の名前にはMr.やMiss.などの敬称が含まれています。この敬称はその人の年齢や性別によって変わってきます。以下のコードで敬称から年齢を与えています。
def get_age(name): name = name.split() if "Mr." in name: return 25.0 elif "Miss." in name: return 20.0 elif "Master." in name: return 8.0 elif "Mrs." in name: return 30.0 else: # Dr. return 40.0 for name in data[data["Age"].isnull()]["Name"]: new_age = get_age(name) data.loc[data["Name"] == name, "Age"] = new_age
学習
今回はPyTorchを用いたニューラルネットワークのみで学習をしてみました。 年齢を与えるところ以外は変わっていません。
結果
Submitの結果。
精度は0.1ぐらいしか上がってないが順位はけっこう上がったので、おそらく年齢の欠損値についてのアプローチがうまくいったんだと思う。だと思いたい、、、
また別のアプローチを考えて高い精度で分類できるようにしたいと思います。
とりあえず次の目標は80%を超えること。
コードは↓