AMD製GPUでKaggleにチャレンジする - 準備編 -

##はじめに
[以前の記事](https://qiita.com/hktm/items/ead2ed4ed3441fca7311)でAMD製GPUを搭載した自作PCのセットアップを行いました。
今回はそのPCでKaggleのコンペティション『[Avito Demand Prediction Challenge](https://www.kaggle.com/c/avito-demand-prediction/)』に参加するまでに行ったことを「準備編」としてまとめたいと思います。AMD製GPUでKaggleに挑戦してみたい方に参考にしていただければ幸いです。

大まかな流れは次の通りです。

1. Anacondaをインストールする
1. LightGBMをインストールする
1. グラフ描画ライブラリをインストールする（任意）
1. tmuxをインストールする
1. Kaggleを学ぶ
1. コンペティションにチャレンジする

##環境
Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz 16GB
Radeon RX Vega 56 Air Boost 8GB
Ubuntu 16.04 LTS

##Anacondaをインストールする
[前回の記事](https://qiita.com/hktm/items/ead2ed4ed3441fca7311)ではPythonのライブラリを個別にインストールしましたが、今回は様々なライブラリをまとめてインストールできるAnacondaというディストリビューションを使いたいと思います。詳細は[Github](https://github.com/pyenv/pyenv#installation)を参考にしてください。

まずはじめにpyenvをインストールします。

```terminal
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

次にパスを通します。私は`zsh`を使っているので`~/.zprofile`にパスを通しますが、`bash`の方は下記コマンドを`~/.bash_profile`に変更して実行してください。

```terminal
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zprofile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zprofile
echo 'eval "$(pyenv init -)"' >> ~/.zprofile
exec $SHELL -l
```
次にAnacondaをインストールします。

```terminal
pyenv install --list | grep anaconda
```
下記のようにインストール可能なバージョンの一覧が表示されます。

```terminal
anaconda-1.4.0
anaconda-1.5.0
anaconda-1.5.1
.
.
.
anaconda3-5.1.0
anaconda3-5.2.0
```

最も下に表示されているのが最新のバージョンなので、それを指定してインストールします。
ここでは`anaconda3-5.2.0`です。

```terminal
pyenv install anaconda3-5.2.0
```
しばらく時間がかかりますが、完了したら下記のコマンドを順番に入力して設定を反映させます。

```terminal
pyenv rehash
pyenv global anaconda3-5.2.0
python --version
```
このように表示されればインストール完了です。

```terminal
Python 3.6.5 :: Anaconda, Inc.
```

##LightGBMをインストールする
[LightGBM](https://github.com/Microsoft/LightGBM)とはMicrosoftが開発する勾配ブースティング(Gradient Boosting)ライブラリです。勾配ブースティングとはコンペティションでしばしば優勝するほど強力な機械学習モデルで、そのモデルをとても高速に簡単に計算できるようにしたものがLightGBMです。CPUおよびGPUで使うことができ、NVIDIA+CUDA環境ではもちろん、AMD+ROCm(OpenCL)にも対応しています。
インストールに関しては公式GitHubから下記3つのドキュメントを参考にします。

- [LightGBM GPU Tutorial](https://github.com/Microsoft/LightGBM/blob/master/docs/GPU-Tutorial.rst)
- [GPU Tuning Guide](https://github.com/Microsoft/LightGBM/blob/master/docs/GPU-Performance.rst)
- [LightGBM Python-package](https://github.com/Microsoft/LightGBM/tree/master/python-package)

```terminal
sudo apt update

# AMD GPU package
sudo apt install -y ocl-icd-libopencl1 ocl-icd-opencl-dev
sudo apt install --no-install-recommends git cmake build-essential libboost-dev libboost-system-dev libboost-filesystem-dev

cd /tmp
git clone --recursive https://github.com/Microsoft/LightGBM
cd LightGBM
mkdir build ; cd build
cmake -DUSE_GPU=1 ..
make -j$(nproc)
cd ..
```
次にPythonで使えるようにします。

```terminal
pip install lightgbm --install-option=--gpu
```
しばらく時間がかかると思いますが`Successfully installed lightgbm-2.1.1`のように表示されればインストール完了です。

##グラフ描画ライブラリをインストールする（任意）
探索的データ解析(EDA)を行う際に便利なグラフ描画ライブラリをインストールしておきます。執筆時点では今回私が使った3つのライブラリを記載しますが、今後、適宜追加していきたいと思います。

ベン図を描画する[matplotlib-venn](https://pypi.org/project/matplotlib-venn/)

```terminal
pip install matplotlib-venn
```

動的なグラフを描画できる[Plotly](https://plot.ly/python/)

```terminal
pip install plotly
```

プロファイリングが簡単にできる[pandas-profiling](https://github.com/pandas-profiling/pandas-profiling)

```terminal
pip install pandas-profiling
```

##tmuxをインストールする
tmuxとは1つのターミナルから複数のターミナルを管理するツールです。
また、tmuxはターミナルを閉じても裏側で作業が継続しているので、機械学習モデルを訓練しているときに誤ってターミナルを閉じてしまうといったアクシデントにも対処できます。tmuxの詳しい使い方は[ドットインストールの『tmux入門』](https://dotinstall.com/lessons/basic_tmux)という講座がわかりやすいので、そちらに委ねます。

ここではtmuxのインストール手順を記載します。[こちらの記事](https://bogdanvlviv.com/posts/tmux/how-to-install-the-latest-tmux-on-ubuntu-16_04.html)を参考にしました。

```terminal
sudo apt update
sudo apt install -y automake build-essential pkg-config libevent-dev libncurses5-dev

git clone https://github.com/tmux/tmux.git /tmp/tmux
cd /tmp/tmux
sh autogen.sh
./configure && make
sudo make install

cd
rm -fr /tmp/tmux
```
インストールが完了したので、次はtmuxのセッションを作ります。今回は`Avito`という名前にしましたが、お好きな名前で構いません。

```terminal
tmux new -s Avito
```
以下のコマンドで作成したセッションの一覧を確認できます。

```terminal
tmux ls
```
作成したセッションから出る（デタッチ）は`Ctrl+b`と入力してから`d`と打ちます。再度セッションに入る（アタッチ）場合は次のように入力します。

```terminal
tmux a -t Avito
```

##Kaggleを学ぶ
私がKaggleに参加するにあたり行ったことは次の3つです。ここからは私個人の体験談を書きたいと思います。よかったら参考にしてください。

1. 本を2冊写経する
1. Learn Machine Learning series を読む
1. 練習用コンペティションに参加する

##1. 本を2冊写経する
私はまず機械学習の基礎を学ぶためにオライリーが出版している次の2冊の本を使いました。1冊目で大枠と基礎をつかみ、2冊目で実践的な技術を学びました。どちらもとてもわかりやすく内容も網羅的なのでおすすめです。Amazonへのリンクを載せておきますが、アフィリエイトではないのでご安心ください。

- [Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎](https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E2%80%95scikit-learn%E3%81%A7%E5%AD%A6%E3%81%B6%E7%89%B9%E5%BE%B4%E9%87%8F%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E5%9F%BA%E7%A4%8E-Andreas-C-Muller/dp/4873117984/ref=cm_cr_arp_d_bdcrb_top?ie=UTF8)
- [scikit-learnとTensorFlowによる実践機械学習](https://www.amazon.co.jp/scikit-learn%E3%81%A8TensorFlow%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-Aur%C3%A9lien-G%C3%A9ron/dp/4873118344/ref=pd_sbs_14_2?_encoding=UTF8&pd_rd_i=4873118344&pd_rd_r=8e5d7e0c-7e82-11e8-8003-67533ad5f486&pd_rd_w=94vDT&pd_rd_wg=RXnrl&pf_rd_i=desktop-dp-sims&pf_rd_m=AN1VRQENFRJN5&pf_rd_p=5805929820760247504&pf_rd_r=JJ8F6EBVD3GB9GQ72V6E&pf_rd_s=desktop-dp-sims&pf_rd_t=40701&psc=1&refRID=JJ8F6EBVD3GB9GQ72V6E)

##2. Learn Machine Learning series を読む
次にKaggleの大まかな流れを知るために先人たちの知恵や技術が詰まったKernelを参考にしました。『[Learn Machine Learning series](https://www.kaggle.com/learn/machine-learning)』というKernelではデータサイエンティストのDan BeckerさんがKaggleに必要な基本的なことをまとめてくれています。これを読めばおおよそのKaggleのイメージがつかめると思います。

##3. 練習用コンペティションに参加する
Kaggleにはいくつか練習用のコンペティションが用意されています。これらは常時開催中なのでいつでも参加できます。『[Kaggleの練習問題（Regression）を解いてKagglerになる](https://qiita.com/katsu1110/items/a1c3185fec39e5629bcb)』という記事はとてもまとまっていてわかりやすかったので参考にさせていただきました。本番のコンペティションに参加する前にひとつかふたつほど練習してみるのがおすすめです。

##コンペティションにチャレンジする
ここまでである程度の流れがわかったので、さっそく本番のコンペティション『[Avito Demand Prediction Challenge](https://www.kaggle.com/c/avito-demand-prediction/)』に参加してみました。しかしこの範囲の内容は長くなりそうなので、ざっくりとした流れの列挙にとどめて詳しくは次回「実践編」という形で続きを書きたいと思います。

1. 特徴量を観察する
1. ターゲット値を観察する
1. 外れ値を除去する
1. 欠損値を処理する
1. 特徴量をつくる
1. モデルを訓練する
1. 提出用CSVをつくる

##最後に
今回はAMD製GPUでKaggleに参加する際に必要なライブラリのインストールや私の体験談をまとめました。本番のコンペティションで行った探索的データ解析(EDA)や特徴量エンジニアリング(Feature Engineering)といった実践的な内容は多少長くなりそうなので、改めて「実践編」として記事にしたいと思います。
最後まで読んでいただき、ありがとうございました。