【Julia1.5】KaggleノートブックでJuliaを使用してタイタニック

# はじめに
2020年7月に以下のノートブックが公開されました。
Kaggleノートブック上でJuliaを動かすサンプルです。
<b>[Julia Live on Kaggle](https://www.kaggle.com/marketneutral/julia-live-on-kaggle/notebook)</b>　※要インターネット設定ON

上記のノートブックを参考にタイタニックの分析と提出までを行ってみました。
→<b>[Titanic XGBoost using Julia-1.5.0](https://www.kaggle.com/kazuhito00/titanic-xgboost-using-julia-1-5-0)</b>

処理の概要を以下に記載します。全文は「[Titanic XGBoost using Julia-1.5.0](https://www.kaggle.com/kazuhito00/titanic-xgboost-using-julia-1-5-0)」を参照ください。

# Kaggleノートブック上にJuliaをインストールする
Juliaの実行バイナリをダウンロードして、/usr/local 配下に配置しています。

```bash
%%bash

JULIA_VERSION="1.5.0"

JULIA_VER=`cut -d '.' -f -2 <<< "$JULIA_VERSION"`
BASE_URL="https://julialang-s3.julialang.org/bin/linux/x64"
URL="$BASE_URL/$JULIA_VER/julia-$JULIA_VERSION-linux-x86_64.tar.gz"
wget -nv $URL -O /tmp/julia.tar.gz
tar -x -f /tmp/julia.tar.gz -C /usr/local --strip-components 1
rm /tmp/julia.tar.gz
```

# Juliaのパッケージをインストールする
「julia -e」でパッケージのインストール('using Pkg; pkg"add XXXXXXXX"')をコマンドライン実行します。
今回はDataFrames、CSV、XGBoostをインストールしています。

```bash
%%bash

julia -e 'using Pkg; pkg"add DataFrames"'
julia -e 'using Pkg; pkg"add CSV"'
julia -e 'using Pkg; pkg"add XGBoost"'
```

# PyJuliaをインストールして、マジック関数を設定する
「%load_ext julia.magic」を実行することで、後述のマジックコマンド「%%julia」が使用できるようになります。

```python
!pip install --quiet julia
import julia
from julia.api import Julia
julia.install()
jl = Julia(compiled_modules=False)  # cannot use precompiled packages with pyjulia on linux :-(
%load_ext julia.magic
```

以降、セルの先頭で「%%julia」を実行することで、Juliaスクリプトでの実行が可能になります。

# 学習データを読み込み

```julia
%%julia

using CSV, DataFrames

train_data = CSV.read("../input/titanic/train.csv")
head(train_data, 10)
```

# 説明変数と目的変数(Survived)に分ける
```julia
%%julia

X = select(train_data, Not(:Survived));
y = train_data[:Survived];
```

# データ前処理
簡単なデータ前処理用の関数を用意しています。
高スコアを目指す系のノートブックじゃないので適当です。
　カラム削除：「PassengerId」「Name」「Ticket」「Cabin」「Embarked」
　ラベルエンコーディング：「Sex(male:0, female:1)」
　欠損値：「Age(欠損値は中央値で置き換え)」「Fare(欠損値は0で置き換え)」


```julia
%%julia

using Statistics

function preprocess_data(df)
    tempdf = deepcopy(df)

    select!(tempdf, Not(:PassengerId))
    select!(tempdf, Not(:Name))
    select!(tempdf, Not(:Ticket))
    select!(tempdf, Not(:Cabin))
    select!(tempdf, Not(:Embarked))

    recode!(tempdf[:Sex], "male" => "0");
    recode!(tempdf[:Sex], "female" => "1");
    tempdf.Sex = tryparse.(Int, tempdf.Sex)

    recode!(tempdf[:Age], missing => median(skipmissing(tempdf[:Age])));
    tempdf.Age = Array{Float64}(tempdf.Age)
    
    recode!(tempdf[:Fare], missing => 0.0);
    tempdf.Fare = Array{Float64}(tempdf.Fare)

    return tempdf
end
```

```julia
%%julia

X = preprocess_data(X)
```

# 学習データとテストデータに分割
```julia
%%julia

train_data_num = Int64(floor(nrow(X) * 0.75))

X_train = convert(Matrix, X[begin:train_data_num, :]);
y_train = y[begin:train_data_num];
X_test = convert(Matrix, X[train_data_num+1:end, :]);
y_test = y[train_data_num+1:end];
```

# XGBoostのモデル訓練
パラメータは適当です。

```julia
%%julia

using XGBoost

num_round = 500
xgb = xgboost(X_train, num_round, label=y_train, eta=1, max_depth=3, objective = "binary:logistic")
```

# 推論用データ読み込み
```julia
%%julia

test_data = CSV.read("../input/titanic/test.csv")

test_data = preprocess_data(test_data);
test_data = convert(Matrix, test_data);
```

# 推論実施
推論結果が0.5より大きい値を生存(1)、0.5未満を死亡(0)に置き換えています。

```julia
%%julia

predictions = XGBoost.predict(xgb, test_data)

predictions[predictions .> 0.5] .= 1
predictions[predictions .<= 0.5] .= 0
predictions = Array{Int64}(predictions)
```

# 提出用ファイルに書き出し
```julia
%%julia

submission = CSV.read("../input/titanic/gender_submission.csv")
submission[2] = predictions
CSV.write("submission.csv", submission)
```

# 所感
セル毎に「%%julia」を記載するのが少々面倒くさいですね、、、

あと、色々インストールする都合上、Kaggleノートブックのインターネット設定がONになっている必要があるため、インターネット設定OFFが必須のコンペとかでは使えませんね。
データセットとして色々アップロードしておくことも試したのですが、パッケージのオフラインインストールが上手く行かずに断念しています。

Kaggle側で正式に対応してもらえると楽なのですが、、、:rolling_eyes: