RでTitanicを予想する（kaggle⑧）

#はじめに
[前回](https://qiita.com/sudominoru/items/386d79d2deab9f76334e)は、Python の Keras で Titanic を予測してみました。
今回は、R言語で Titanic に挑戦してみたいと思います。

#目次
1.R言語
2.H2Oパッケージ
3.ファイル処理
4.質的変数（factor）型
5.学習
6.結果
7.全コード
8.まとめ
履歴

#1.R言語

[データアナリティクス実践講座](https://www.amazon.co.jp/dp/4798143448)という本を読み始めました。
この本ではアソシエーション分析などのサンプルがR言語で記述されています。
せっかくなので、R言語も少し学ぼうと思い [Rで学ぶデータサイエンス](https://www.amazon.co.jp/dp/4274222543) という本をひと通り読み進めました。
内容は浅めだったため、あまりR言語の理解はできていないのですが、せっかくなので Titanic も R言語でやってみたいと思います。

#2.H2Oパッケージ

R言語では、H2Oというパッケージを利用することでディープラーニングを行えます。
他にもランダムフォレストのライブラリなどもあるようですが、今回は H2O を試してみたいと思います。

```R
## Importing packages
library(h2o)

# h2oを初期化する
# Initialize h2o
h2oinit <- h2o.init(ip="localhost", port=54321, startH2O=TRUE, nthreads=-1)
```

Kaggle環境でもライブラリをロードすることで H2o が使えます。
H2o はWebサーバを起動するような感じ？で使います。
h2o.init の部分です。

```R
Starting H2O JVM and connecting: .. Connection successful!
```

実行後のコンソールを見ると JVM を使っているようです。

#3.ファイル処理

H2O では、データを H2ODataFrame オブジェクトで扱います。
ファイルの読み込みに h2o.importFile を利用することで H2ODataFrame 形式で保持できます。

```R
# トレーニングデータを読み込む
# Load training data
h2o.train <- h2o.importFile(path="../input/titanic/train.csv", skipped_columns=c(1,4,6,11,12))
h2o.head(h2o.train)
```

||Survived|Pclass|Sex|SibSp|Parch|Ticket|Fare|
|:--|:--|:--|:--|:--|:--|:--|:--|:--|
||&lt;dbl&gt;|&lt;dbl&gt;|&lt;fct&gt;|&lt;dbl&gt;|&lt;dbl&gt;|&lt;dbl&gt;|&lt;dbl&gt;|
|1|0|3|male|1|0|NaN|7.2500|
|2|1|1|female|1|0|NaN|71.2833|
|3|1|3|female|0|0|NaN|7.9250|
|4|1|1|female|1|0|113803|53.1000|
|5|0|3|male|0|0|373450|8.0500|
|6|0|3|male|0|0|330877|8.4583|

#4.質的変数（factor）型

R言語には 質的変数を表す factor型があります。
上記の Sex が factor型です。
factor型だと数量とはみなされないので One-Hotエンコーディングも不要です。（おそらく）
[前回](https://qiita.com/sudominoru/items/386d79d2deab9f76334e)まで One-Hotエンコーディングしていた Fare 以外の特徴量を factor型にします。

```R
# Survived をfactor型に変換する
# Convert Survived to factor type
h2o.train[,1] = as.factor(h2o.train[,1])

# Pclass をfactor型に変換する
# Convert Pclass to factor type
h2o.train[,2] = as.factor(h2o.train[,2])

# SibSp をfactor型に変換する
# Convert SibSp to factor type
h2o.train[,4] = as.factor(h2o.train[,4])

# Parch をfactor型に変換する
# Convert Parch to factor type
h2o.train[,5] = as.factor(h2o.train[,5])

# Ticket をfactor型に変換する
# Convert Ticket to factor type
h2o.train[,6] = as.factor(h2o.train[,6])
```

#5.学習

学習は h2o.deeplearning で行います。

```R
h2o.res <- h2o.deeplearning(x=2:7, y=1, training_frame=h2o.train, activation="Rectifier", hidden=c(702,702,702), epochs=25)
h2o.res
```

training_frame で入力データを指定し、x で学習データ、y で教師データを指定します。
activation で活性化関数、hidden で隠れ層の数とニューロン数を指定します。
activation で指定している Rectifier は正規化線形関数のことで、 Keras でいう ReLU と同じはずです。
上記の設定で、[前回](https://qiita.com/sudominoru/items/386d79d2deab9f76334e)の Keras と同じような設定になっていると思います。

テストデータによる予測は h2o.predict で行います。
object に h2o.deeplearning の戻り値、newdata にテストデータを渡します。

```R
h2o.pred <- h2o.predict(object=h2o.res, newdata=h2o.test)
head(h2o.pred)
```
||predict|p0|p1|
|:--|:--|:--|:--|
||&lt;fct&gt;|&lt;dbl&gt;|&lt;dbl&gt;|
|1|0|9.543323e-01|0.04566772|
|2|1|3.790134e-02|0.96209866|
|3|0|9.673516e-01|0.03264838|
|4|0|9.553280e-01|0.04467202|
|5|1|2.828075e-06|0.99999717|
|6|0|9.559884e-01|0.04401156|

予測値(predict)と確率が格納されています。

#6.結果

この予測値を Kaggle に提出したところ、結果は「0.78468」でした。

#7.全コード

全コードは以下です。

```R
## Importing packages

library(h2o)

# h2oを初期化する
# Initialize h2o
h2oinit <- h2o.init(ip="localhost", port=54321, startH2O=TRUE, nthreads=-1)

# トレーニングデータを読み込む
# Load training data
h2o.train <- h2o.importFile(path="../input/titanic/train.csv", skipped_columns=c(1,4,6,11,12))
h2o.head(h2o.train)

# Survived をfactor型に変換する
# Convert Survived to factor type
h2o.train[,1] = as.factor(h2o.train[,1])

# Pclass をfactor型に変換する
# Convert Pclass to factor type
h2o.train[,2] = as.factor(h2o.train[,2])

# SibSp をfactor型に変換する
# Convert SibSp to factor type
h2o.train[,4] = as.factor(h2o.train[,4])

# Parch をfactor型に変換する
# Convert Parch to factor type
h2o.train[,5] = as.factor(h2o.train[,5])

# Ticket をfactor型に変換する
# Convert Ticket to factor type
h2o.train[,6] = as.factor(h2o.train[,6])

# 型をチェックする
# Check type
for (i in 1:7) {
  print(class(h2o.train[1,i]))
}

# テストデータを読み込む
# Load test data
h2o.test.import <- h2o.importFile(path="../input/titanic/test.csv", skipped_columns=c(3,5,10,11))
h2o.head(h2o.test.import)

# test.csv の PassengerId を保持する
# keep PassengerId of test.csv
test.index = as.data.frame(h2o.test.import[,1])
h2o.test = h2o.test.import[,2:7]
h2o.head(h2o.test)

# Pclass をfactor型に変換する
# Convert Pclass to factor type
h2o.test[,1] = as.factor(h2o.test[,1])

# SibSp をfactor型に変換する
# Convert SibSp to factor type
h2o.test[,3] = as.factor(h2o.test[,3])

# Parch をfactor型に変換する
# Convert Parch to factor type
h2o.test[,4] = as.factor(h2o.test[,4])

# Ticket をfactor型に変換する
# Convert Ticket to factor type
h2o.test[,5] = as.factor(h2o.test[,5])

# 型をチェックする
# Check type
for (i in 1:6) {
  print(class(h2o.test[1,i]))
}

h2o.res <- h2o.deeplearning(x=2:7, y=1, training_frame=h2o.train, activation="Rectifier", hidden=c(702,702,702), epochs=25)
h2o.res

h2o.pred <- h2o.predict(object=h2o.res, newdata=h2o.test)
head(h2o.pred)

h2o.pred.dataframe = as.data.frame(h2o.pred)
head(h2o.pred.dataframe)

pred <- data.frame(test.index, h2o.pred.dataframe$predict)
colnames(pred) <- c("PassengerId","Survived")
head(pred)

write.csv(pred, file="result.csv", row.names=FALSE)
```

#8.まとめ

少し試しただけですが、機械学習は R より Python の方がよさそうです。
R の factor 型は便利ですが、ライブラリやフレームワークの充実度が Python の方がよいと思います。
アソシエーション分析など、R言語で扱いやすい分析は R言語で行うなど、使い分けがよさそうです。

R言語はいったん置いておき、次回は Python に戻って PyTorch を使って学習してみたいと思います。

#履歴
2020/02/22 初版公開