About connecting the dots.

data science related trivial things

kaggleで予測モデルを構築してみた (2) - Rで機械学習パッケージをまとめて試してみる

ということで,引き続き入手したデータをRStudioに読み込んで予測モデルを試すところに進みたいと思います.

データ読み込み

RStudioでのデータ読み込みは簡単で,下の図のように画面右上部分のボタンを押してファイルを読み出せば,csvファイルを普通に読み込んでくれると思います.

f:id:SAM:20121220224822p:plain

データファイル自体は文字コードがShift-JISでWindows用なので,Macの人は文字コードをUTF8,改行コードをLFにしておくとよいと思います.文字コードと改行コードの変更は,CotEditorでもダウンロードしてcsvファイルを開いけば,上のメニューに文字コード改行コードがあるので,それを変更して保存すればOKです.

f:id:SAM:20121220225213p:plain

もちろんコマンドでファイルを開くこともできます.こんな感じですね.今回はテストなので,訓練データをそのままテストデータに使います.

# データの読み込み
train <- read.table('~/Documents/workspace/R/kaggle/data/titanic/train.csv', header=T, sep=',')
test <- train

パッケージのインストールとライブラリ読み込み

で,予測モデルを試してみる前に,必要なパッケージをインストールした上で,そのパッケージに含まれているライブラリを読み込む必要があります.パッケージのインストールは一度行えば,もうする必要はありません.ライブラリの読み込みについては,新しいプロジェクトで新しい処理を行う際には,毎回行う必要があります.

# パッケージのインストール
install.packages('randomForest')
install.packages('e1071')
install.packages('nnet')

# ライブラリの読み込み
library('randomForest')
library('e1071')
library('nnet')

そして,トレーニングデータとテストデータを簡単に加工しておきたいと思います.ここで行っているのは,年齢がNA(回答なし)のものについて,NAのデータをのぞいた年齢の平均値を補完する処理です.サンプル数を減らしたくないので,適当に値を当てはめているということになりますね.ここの部分についても,本当はいろいろ補完のやり方がありますが,とりあえずこれでいきます.

# データ加工
train$age = ifelse(is.na(train$age), mean(na.omit(train$age)), train$age)
test$age = ifelse(is.na(test$age), mean(na.omit(test$age)), test$age)

予測モデルの構築

ここでは,いくつかの手法をざっと試してみたいと思います.それ俺の手法の説明は次回以降にまわして,まずはやってみようということです.ここでは,客室のグレード,性別,年齢,いっしょに乗っていた兄弟や配偶者の人数,いっしょに乗っていた親子どもの人数,運賃から,生き残ったか否かを予測しました.

ロジスティック回帰

以下のコマンドをうつと,下のテーブルが得られます.行が実際の値,列が予測値,そして1が生き残りで0が死亡です.死亡と予測して実際に死亡だったデータが474人,生存と予測して実際は死亡だったデータが75人,死亡と予測して生存が107人,生存と予測して生存が235人でした.00および11が正解で10および01が不正解なので,的中率は(474+235)/(474+75+107+235)=79.6%でした.

train.lr <- lm(survived~pclass+sex+age+sibsp+parch+fare, data=train)
pred <-predict(train.lr, test, interval='prediction')
pred_b <- ifelse(pred[,1] > 0.5, 1, 0)
table(train$survived, pred_b)

   pred_b
      0   1
  0 474  75
  1 107 235

ランダムフォレスト

次にランダムフォレストを試してみます.基本的に同じフォーマットでちょっと書き換えるだけですね.90.9%とずいぶん高い予測精度が出ました.

train.rf <- randomForest(formula=survived~pclass+sex+age+sibsp+parch+fare, data=train)
pred <- predict(train.rf, test)
pred_b <- ifelse(pred > 0.5, 1, 0)
table(train$survived, pred_b)

   pred_b
      0   1
  0 527  22
  1  59 283

SVM

続いてSVMを試してみます.83.2%の正解率になります.

train.svm <- svm(formula=survived~pclass+sex+age+sibsp+parch+fare, data=train)
pred <- predict(train.svm, test)
pred_b <- ifelse(pred > 0.5, 1, 0)
table(train$survived, pred_b)

   pred_b
      0   1
  0 492  57
  1  92 250

ニューラルネットワーク

最後にニューラルネットワークです.81.0%でした.

train.nnet <- nnet(formula=survived~pclass+sex+age+sibsp+parch+fare, size=5, data=train)
pred <- predict(train.nnet, test)
pred_b <- ifelse(pred > 0.5, 1, 0)
table(train$survived, pred_b)

   pred_b
      0   1
  0 498  51
  1 118 224

ということで,簡単でしたね.細かい説明は次回以降に.