#はじめに
前回は、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 初版公開