初めてKaggleのコンペをやった話(続き)
こんにちは。私です。 前回記事の続きになっていますのでご注意を。
前回の最後で精度0.62679だったものを、0.75598まで上げたことについて書こうかなと。
前回からの変更点
- SVMからランダムフォレストに変更
- 欠損していた
Age
の欠損値の推定を線形回帰で行う SibSp
とParch
を用いて家族の人数を表すFamilySize
の列を作成
目次
学習器の変更
SVMからランダムフォレストに変更しました。
二値分類だからSVMでいいかって思ってやってたんですけど、ランダムフォレスト使ってねって言われていたのを読んでませんでした…
ランダムフォレストってなんやって人のために
2001年に Leo Breiman によって提案された[1]機械学習のアルゴリズムであり、分類、回帰、クラスタリングに用いられる。
決定木を弱学習器とする集団学習アルゴリズムであり、この名称は、ランダムサンプリングされたトレーニングデータによって学習した多数の決定木を使用することによる。
対象によっては、同じく集団学習を用いるブースティングよりも有効とされる。
–Wikipediaより
私も細部まで理解しているわけではありませんが、決定木を複数作ってそれぞれに学習させて平均値取ったりしたものという認識です。
今回は特にパラーメータを設定したわけではなく、scikit-learnでデフォルトのまま学習させました。
欠損値の推定
欠損値の存在していたAge
の値を推定する方法です。前回は平均値で推定していたのでもうちょい進化して線形回帰を用います。
自分でも予想外でしたがここでつまりました…(主にjupyterまわりで…)
目的変数をAge
、説明変数をPclass
SibSp
Parch
Fare
を用いました。これでtrain.csvのAge
を推定し、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までいけました…
前回から比べると一割増しです。その日テンション高かったです。
おわりに
今回は、線形回帰を用いて欠損値を推定したり、学習器を変えたり、列を追加したりを行いました。
そういえばFamilySize
を線形回帰に用いてなかったな…
とりあえず、精度が75%まできたしTitanicはもういいかな…と思っています。
別のコンペに参加して、使っていない欠損値の推定方法などを用いてまた記事を書こうと思います。
ではまたそのときまで。