初めてKaggleのコンペをやった話
どうもみなさん、私です。
今回KaggleのTitanic: Machine Learning from Disasterをやってみました。 もともとこのブログを作ろうと思った原因がこれなのでちびちびとやっていきます。
Kaggleやらタイタニックデータについては私より詳しく書いているサイトやらがいっぱいあるのでそっちを参照で…
とりあえずデータ取ってきてやってみます。
環境とデータ
使用言語はPython3.5
ライブラリはpandas
、numpy
、scikit-learn
のいつものって感じのものです。
train.csv
の列としては以下の感じ
- ID
PassengerId
- 生死
Survived
- 階級
Pclass
- 氏名
Name
- 性別
Sex
- 年齢
Age
- 配偶者数
SibSp
- 子供数
Parch
- チケット番号
Ticket
- 旅客運賃
Fare
- 船室番号
Cabin
- 乗船した港
Embarked
前処理
この中から数値にできなさそうなName
を除外、
あと欠損値が多かったのでTicket
とFare
も除外
あと使わないだろうと思うPassengerId
も除外
ここまでやってAge
の欠損値np.nan
になっている行を除外しようとして一度つまりました。
なのでこちらのブログ
を見てdf.dropna()
で欠損値のある行を削除。
次にSex
、Embarked
をカテゴリカルな変数にします。
これも詰まったので調べました。そうすると、pandasにはdf.where()
とdf.replace()
の二種類があるもよう。df.where()
のほうが条件を色々付けられるのかなぁと思いましたが、私にはよくわかりませんでした…
df.replace()
はpythonの文字列置換と使い方が同じっぽいしこっち使うぞ~ってことで使いました。
学習と提出
ここまでやって学習させます。
目的変数をSurvived
、それ以外を説明変数としてscikit-learn
のSVMにパラメータなどを指定せずにとりあえず放り込みました。そして、出来上がった分類器にtest.csv
のデータを入力し、予測値をCSVファイルで出力します。
しかしここでも問題が…
私はtest.csv
のAge
の列にもdf.dropna()
を適用して行数を減らしてしまいました。Kaggleのファイル提出はテストデータの行数と同じ行数のCSVファイルを提出しないといけないんですね…エラー吐かれるまで全く気が付きませんでした。
そして出てくるのが欠損値np.nan
をどうするかです。
一番最初に思いついたのは、df.replace()
で適当な値に書き換えること。とりあえず今回は平均値で行いました。
それで提出したところ通りました…ようやくです。
その精度は…0.59330
このくらいだとこんなもんか~って感じでした。
その直後に、train.csv
の処理でAge
の欠損値np.nan
の行を削除しないで書き換えれば精度上がるんじゃね…?ってことに気がついて書き換えて提出しました。
その精度0.62679
たったこれだけで思った以上に上がるんですね…。
さいごに
今のところはこれで止まっています。
このあと欠損値を何かしらの推定手法で推定したり、使っていない列を使ってみたり、学習する手法を変えてみたり、etc…
やることがいっぱいですが精度が上がったら 多分 また記事を投稿します。
Markdownの書き方もよくわかってないので勉強せねば…