どん底から這い上がるまでの記録

どん底から這い上がりたいけど這い上がれない人がいろいろ書くブログ(主にプログラミング)

Titanic: Machine Learning from Disaster(2)

スポンサーリンク


前回はあまり深く考えずにやったので、今回は少しだけ深堀してみます。

pytry3g.hatenablog.com

 

今回は年齢の欠損値について少し考えてみました。前回は欠損値のあるデータは全て削除していましたが、生存予測をする際、年齢はかなり生存に影響するようです。なので欠損値に適切な年齢を与えることができれば、訓練データを減らすことなく高い精度で分類ができるのではと思いました。下の図は年齢での生存結果です。青が死亡、オレンジが生存です。若い人のほうが生き残ることができてて、年を取っている人のほうが生き残れていないような気がします。

f:id:pytry3g:20180122152315p:plain

で、どうやって適切な年齢を与えるかというと、乗客の名前に注目してみます。乗客の名前には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の結果。

f:id:pytry3g:20180122142815p:plain

精度は0.1ぐらいしか上がってないが順位はけっこう上がったので、おそらく年齢の欠損値についてのアプローチがうまくいったんだと思う。だと思いたい、、、

また別のアプローチを考えて高い精度で分類できるようにしたいと思います。

とりあえず次の目標は80%を超えること。

コードは↓

github.com