GCPを使ったKaggleのデータ分析　導入編

# 概要
1. GCEインスタンス立ち上げ
2. 各種パッケージインストール
3. jupyter notebook導入
4. GCEとGCSを接続
4. Kaggle API導入
5. Kaggle データセットダウンロード

# 1 GCEインスタンス立ち上げ

そもそもGCEって？ https://qiita.com/oosha/items/746dc4a9ad16f5a6beac

左のサイドバーのComputed Engineから、インスタンスを作成する

<img width="1440" alt="スクリーンショット 2019-03-11 10.25.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/2ee09f43-0f29-751a-6ccd-1c67bc2c17b9.png">
 
<img width="1440" alt="スクリーンショット 2019-03-11 10.26.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/8b21fc30-cfba-e238-6c05-61a22763bd60.png">

インスタンスの名前は任意の名前

リージョンはサーバーの場所,今回はeastUS1にする。（場所によっては無料枠でなくなる、アメリカの方が何かとアクセスが早い）

マシンのメモリは、30GB(120GBとかは大学の研究などのレベル)

料金に関しては 
https://cloud.google.com/compute/pricing?hl=ja

メモリの若干の目安

https://qiita.com/lain21/items/a33a39d465cd08b662f1#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABpc-vs-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9

<img width="1440" alt="スクリーンショット 2019-03-11 10.30.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/7bb1e4b9-14c9-17b1-b268-5823fc50937a.png">

ブートディスクはubuntsu16,サイズは50GBくらいあればいい

<img width="1440" alt="スクリーンショット 2019-03-11 10.30.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/c8029d82-feaf-1236-41ed-2818eeb1c626.png">

アクセス権は全て許可
ファイアウォールも全てチェック

<img width="1440" alt="スクリーンショット 2019-03-11 10.32.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/41e94c2c-e2c7-bb6e-38ea-f1b5b924f583.png">

作成ボタンを押して、少し待つとインスタンスが立ち上がる

<img width="1440" alt="スクリーンショット 2019-03-11 10.33.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/344a0753-f54d-175f-f7b2-6495e813a56e.png">

ローカルのターミナルからssh通信でGCSに接続する方法
https://qiita.com/matken11235/items/e4e7de36ef5f01f1d1d7

出来るだけ安くGCEを使う方法
https://qiita.com/Brutus/items/22dfd31a681b67837a74

# 2 各種パッケージインストール

SSH通信でインスタンスのシェルに入る

<img width="1440" alt="スクリーンショット 2019-03-11 10.34.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/53b5ae64-0ccf-7de3-9921-f76c7f98d080.png">

### 必要になりそうなパッケージを入れていく

gitやら何やら

```
sudo apt install git tmux build-essential
```

特にtmuxはかなり使えます。

1. 1つの画面の中でウインドウを追加・分割して複数の端末を開く
2. ssh切断後も端末丸ごと継続され、後でまた繋ぎ直せる

等の利点があります。
# 3 jupyter notebookの導入
### jupyter notebookのインストールと設定
- Anacondaを入れる
- Anacondaの中にjupyter notebookも入っている

```
wget https://repo.anaconda.com/archive/Anaconda3-2018.12-Linux-x86_64.sh
sh Anaconda3-2018.12-Linux-x86_64.sh
```
これらを実行するとLicenseの確認画面が出るので、ひたすらEnterを押します。

`Do you approve the license terms? [yes|no]` と出てきたらyesと打ち込んでEnterです。

```
Anaconda3 will now be installed into this location:
/home/sonics_jr/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below
```

と表示されたら、特に変更の必要がなければEnterです。

```

Do you wish the installer to prepend the Anaconda3 install location
to PATH in your /home/sonics_jr/.bashrc ? [yes|no]
```

これも問題なければyesと打ち込みます。

最後に`source ~/.bashrc`でbashを読み込み直して終了です。

jupyter notebookを使えるようにする

```
#設定ファイルの作成
jupyter notebook --generate-config

#SSL用の鍵を作成
cd .jupyter
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mykey.key -out mycert.pem
```

次にpythonを起動して、python上でパスワードのハッシュを作ります。

以下コマンドを実行し、利用したいパスワードを二回入力し、結果をコピーして控えておきます。

```python:python

>>> from notebook.auth import passwd; passwd()
Enter password: 
Verify password: 
```

vim等で設定ファイルを開き編集する(コメントアウトされている余分な設定は消しても良い)

```
vim ~/.jupyter/jupyter_notebook_config.py
```

以下の設定を書き込む

```
#------------------------------------------------------------------------------                                    
# Configurable configuration                                                                                       
#------------------------------------------------------------------------------  
c = get_config()
c.NotebookApp.certfile = u'/home/<username>/.jupyter/mycert.pem'
c.NotebookApp.keyfile  = u'/home/<username>/.jupyter/mykey.key'
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
c.NotebookApp.password = u'作成したハッシュ'
```
usernameはご自身のアカウント名を記入してください
pwdコマンドで確認できます

以上でjupyterの設定は完了です。

###ファイアーウォールの設定

次にファイヤーウォールの設定を行います。

VPCネットワーク>ファイヤーウォールルールを選択します。

<img width="1440" alt="スクリーンショット 2019-03-11 20.27.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/9dfb08fe-0b8e-e1a4-99c5-8e0124170ed0.png">


そしてファイヤーウォールルールを作成をクリック。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/266948/46a7e8d0-8957-61a5-2bba-b6c9024f528c.png)


以下のように入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/266948/a7c04e93-b3a1-88d7-45b7-4f3765beda4e.png)

名前は任意で構いません。

ターゲットタグで指定したタグがついているネットワーク設定に適用されるので、この後でネットワークタグの設定を行います。

ソースIPの範囲は「0.0.0.0/0」を設定すると全てのIPを許可します。

ポートは、jupyterの設定ファイルに書き込んだものと同じものを設定します。

以上でファイヤーウォールルールの設定は終わりです。

### インスタンス側のネットワークタグの設定

Compute>VMインスタンスをクリックし、ファイヤーウォールの設定を適用したいインスタンスをクリックし編集ボタンを押します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/266948/76baebad-12be-3aa5-767a-295858b8f844.png)

ページ中部の「ネットワークタグ」の欄に「jupyter」と入力して完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/266948/47dcc2bc-a339-5da3-c968-ee4c0bbab2a0.png)

### jupyterを起動してアクセス

jutyer notebookを起動させるコマンドを入力

```
jupyter notebook
```

<img width="1440" alt="スクリーンショット 2019-03-11 23.22.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/d82883f4-9c3a-33fd-e198-0e596bc6a11e.png">

外部IPをクリックする

<img width="1440" alt="スクリーンショット 2019-03-11 23.29.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/4f1238da-7fa5-7391-9563-3b7a76dd089e.png">

するとこのようにアクセスできないが、先ほど設定したポート、:8888をURLにつけると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/266948/8f41a343-cb63-bbd9-db6a-a87383a1e4be.png)

このように警告画面が出ますが、 個人利用のため無視してアクセスします。
以下の画面が出たら、先ほどハッシュ化したパスワードを入力してアクセスします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/266948/f95ae4e8-cffe-8538-7797-a1f2eccc4293.png)

# 4 GCEとGCSを接続

GCS Fuseを使ってGCSバケットをファイルシステムとしてマウントする
### インストール

```
$ export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s`
$ echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list
$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install gcsfuse
```

### アカウント認証をする

```
$ gcloud auth login
```

<img width="1440" alt="スクリーンショット 2019-03-11 23.57.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/348f4911-6262-4fa0-ee32-0b90372ebeac.png">

出てきたURLをクリックする

するとログイン画面が出てくるので、ログインする

<img width="1440" alt="スクリーンショット 2019-03-11 23.59.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/7b2ba69b-95e5-5ecd-6543-487666420413.png">

すると認証コードが出てくるのでメモする。

そのコードをshellに入力すると認証が完了する

### Google Cloud Storageでマウントするバケットを作る

左のサイドバーのStorageをクリック

<img width="1440" alt="スクリーンショット 2019-03-12 0.15.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/10a4490f-b5ad-1d93-bee3-6925aede33ef.png">


バケットを作成

<img width="1440" alt="スクリーンショット 2019-03-12 0.16.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/1b75b58b-0846-1b81-a707-fc5e23156a46.png">

バケット名は任意の名前、クラスはRegionalで場所はGCSと同じ場所にする

<img width="1440" alt="スクリーンショット 2019-03-12 0.18.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/fe0bc900-c835-d234-e249-da60e2d9d249.png">

他の設定はそのままで作成

マウント用のディレクトリを作成しマウントする

```
mkdir sample
gcsfuse バケット名　sample
```

# 5 Kaggle APIの導入
`pip install kaggle`　でインストール

Kaggleにログインし、アカウントページからcreate API Tokenを作る

<img width="1440" alt="スクリーンショット 2019-03-12 0.39.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/266948/bfc6aa60-713e-8ada-ccd7-85f277b18119.png">

kaggle.jsonファイルがダウンロードされる

そのファイルを先ほどマウントしたGCRのバケットにアップロードする

取得したjsonファイルを~/.kaggle/kaggle.jsonに移動させる

```
#ファイルがあるディレクトリ
mv kaggle.json ~/.kaggle/kaggle.json
```

kaggle.jsonのパーミッションを600にする。以上で、kaggleコマンドが使えるようになります。

```
chmod 600 ~/.kaggle/kaggle.json
```

# 6 Kaggle データセットダウンロード

## kaggle コマンド

`kaggle -h`と後ろに-hをつけてやると、次のようにhelpが表示されるので、helpを見ながら使えばそんなに困らない感じです。

| コマンド例| 結果 | 
|:-----------|:----------- |
| kaggle competitions list| コンペの一覧を取得 | 
| kaggle competitions files -c titanic | タイタニックコンペのデータサイズ等を表示 | 
| kaggle competitions download -c titanic | タイタニックコンペのデータをダウンロード | 
| kaggle competitions <br> submit -c titanic -f pred.csv -m test | タイタニックコンペにpred.csvをサブミット。 <br> メッセージはtest |
| kaggle competitions submissions -c titanic | タイタニックコンペの自分のサブミット一覧を表示 | 


実際に kaggleのデータセットをダウンロードする（早い）

```
kaggle competitions download -c titanic
```

jupyter notebookなどで分析開始！


インスタンスを作るたびに環境を作るのが面倒になってくるので、Dockerで環境を構築する方法を取ると良い。