映画と時々技術の日記

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

初めてKaggleのコンペをやった話

どうもみなさん、私です。

今回KaggleのTitanic: Machine Learning from Disasterをやってみました。 もともとこのブログを作ろうと思った原因がこれなのでちびちびとやっていきます。

Kaggleやらタイタニックデータについては私より詳しく書いているサイトやらがいっぱいあるのでそっちを参照で…

とりあえずデータ取ってきてやってみます。

環境とデータ

使用言語はPython3.5 ライブラリはpandasnumpyscikit-learnのいつものって感じのものです。

train.csvの列としては以下の感じ

  • IDPassengerId
  • 生死Survived
  • 階級Pclass
  • 氏名Name
  • 性別Sex
  • 年齢Age
  • 配偶者数SibSp
  • 子供数Parch
  • チケット番号Ticket
  • 旅客運賃Fare
  • 船室番号Cabin
  • 乗船した港Embarked

前処理

この中から数値にできなさそうなNameを除外、 あと欠損値が多かったのでTicketFareも除外 あと使わないだろうと思うPassengerIdも除外

ここまでやってAgeの欠損値np.nanになっている行を除外しようとして一度つまりました。
なのでこちらのブログ を見てdf.dropna()で欠損値のある行を削除。

次にSexEmbarkedをカテゴリカルな変数にします。
これも詰まったので調べました。そうすると、pandasにはdf.where()df.replace()の二種類があるもよう。df.where()のほうが条件を色々付けられるのかなぁと思いましたが、私にはよくわかりませんでした…
df.replace()pythonの文字列置換と使い方が同じっぽいしこっち使うぞ~ってことで使いました。

学習と提出

ここまでやって学習させます。
目的変数をSurvived、それ以外を説明変数としてscikit-learnSVMにパラメータなどを指定せずにとりあえず放り込みました。そして、出来上がった分類器にtest.csvのデータを入力し、予測値をCSVファイルで出力します。
しかしここでも問題が…
私はtest.csvAgeの列にもdf.dropna()を適用して行数を減らしてしまいました。Kaggleのファイル提出はテストデータの行数と同じ行数のCSVファイルを提出しないといけないんですね…エラー吐かれるまで全く気が付きませんでした。

そして出てくるのが欠損値np.nanをどうするかです。
一番最初に思いついたのは、df.replace()で適当な値に書き換えること。とりあえず今回は平均値で行いました。
それで提出したところ通りました…ようやくです。
その精度は…0.59330 このくらいだとこんなもんか~って感じでした。

その直後に、train.csvの処理でAgeの欠損値np.nanの行を削除しないで書き換えれば精度上がるんじゃね…?ってことに気がついて書き換えて提出しました。
その精度0.62679
たったこれだけで思った以上に上がるんですね…。

さいごに

今のところはこれで止まっています。
このあと欠損値を何かしらの推定手法で推定したり、使っていない列を使ってみたり、学習する手法を変えてみたり、etc…
やることがいっぱいですが精度が上がったら 多分 また記事を投稿します。
Markdownの書き方もよくわかってないので勉強せねば…