映画と時々技術の日記

データ分析やNLPが専門です.よく映画を見ます.

初めてKaggleのコンペをやった話(続き)

こんにちは。私です。 前回記事の続きになっていますのでご注意を。

koletika.hatenablog.com

前回の最後で精度0.62679だったものを、0.75598まで上げたことについて書こうかなと。

前回からの変更点

  • SVMからランダムフォレストに変更
  • 欠損していたAgeの欠損値の推定を線形回帰で行う
  • SibSpParchを用いて家族の人数を表すFamilySizeの列を作成

目次

学習器の変更

SVMからランダムフォレストに変更しました。
二値分類だからSVMでいいかって思ってやってたんですけど、ランダムフォレスト使ってねって言われていたのを読んでませんでした…

ランダムフォレストってなんやって人のために

2001年に Leo Breiman によって提案された[1]機械学習アルゴリズムであり、分類、回帰、クラスタリングに用いられる。
決定木を弱学習器とする集団学習アルゴリズムであり、この名称は、ランダムサンプリングされたトレーニングデータによって学習した多数の決定木を使用することによる。
対象によっては、同じく集団学習を用いるブースティングよりも有効とされる。
Wikipediaより

私も細部まで理解しているわけではありませんが、決定木を複数作ってそれぞれに学習させて平均値取ったりしたものという認識です。
今回は特にパラーメータを設定したわけではなく、scikit-learnでデフォルトのまま学習させました。

欠損値の推定

欠損値の存在していたAgeの値を推定する方法です。前回は平均値で推定していたのでもうちょい進化して線形回帰を用います。
自分でも予想外でしたがここでつまりました…(主にjupyterまわりで…)

目的変数をAge、説明変数をPclass SibSp Parch Fareを用いました。これでtrain.csvAgeを推定し、test.csvの方もこれで行いました。

詰まったのはここからです。
このときにはSVMからランダムフォレストに学習器を切り替えていました。その際、SVMとランダムフォレストで違う変数名を使用していたんですね。
学習するときにはちゃんと書き換えていましたが、学習したあとでテストするときの方で書き換えていなくてですね…
しかも、jupyterだと一度全てのセルを停止しないと変数が消去されないのかエラーも出てこず…
精度が全然変化しないので、説明変数を色々変えたりしてあれこれやったのに全然精度が上がらないことにイライラと悲しみでした。
結局気づいたのは翌日です…

列の追加

Ageの推定で詰まっていたときに、初めてKaggleのTitanicについて調べてみました。
そこで、結構一般的に使われているようなので利用しました。よくみんな思いつくな…

列の削減は普段からしてましたが、列の追加は全く思い浮かびませんでした…
今回は、SibSp Parchの2つを用いて、FamilySizeの列を追加しました。

df["FamilySize"] = df["SibSp"] + df["Parch"] + 1
df = df.drop(["SibSp", "Parch"], axis=1)

このFamilySizeを学習に用いました。

結果

これらを用いて精度が0.75598までいけました…
f:id:akitelok:20170607190106j:plain
前回から比べると一割増しです。その日テンション高かったです。

おわりに

今回は、線形回帰を用いて欠損値を推定したり、学習器を変えたり、列を追加したりを行いました。
そういえばFamilySizeを線形回帰に用いてなかったな…
とりあえず、精度が75%まできたしTitanicはもういいかな…と思っています。
別のコンペに参加して、使っていない欠損値の推定方法などを用いてまた記事を書こうと思います。
ではまたそのときまで。