Help us understand the problem. What is going on with this article?

RでTitanicを予想する(kaggle⑧)

More than 1 year has passed since last update.

はじめに

前回は、Python の Keras で Titanic を予測してみました。
今回は、R言語で Titanic に挑戦してみたいと思います。

目次

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

1.R言語

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

2.H2Oパッケージ

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

## Importing packages
library(h2o)

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

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

Starting H2O JVM and connecting: .. Connection successful!

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

3.ファイル処理

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

# トレーニングデータを読み込む
# 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
<dbl> <dbl> <fct> <dbl> <dbl> <dbl> <dbl>
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エンコーディングも不要です。(おそらく)
前回まで One-Hotエンコーディングしていた Fare 以外の特徴量を factor型にします。

# 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 で行います。

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 と同じはずです。
上記の設定で、前回の Keras と同じような設定になっていると思います。

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

h2o.pred <- h2o.predict(object=h2o.res, newdata=h2o.test)
head(h2o.pred)
predict p0 p1
<fct> <dbl> <dbl>
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.全コード

全コードは以下です。

## 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 初版公開

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away