【AI投資システム構築】6.学習方法（個人PCでの実行における注意点）

# 教師データで学習させてみましょう

前々回の投稿で教師データをつくりました。

https://qiita.com/marcy_st_tech/items/99f328db201da6e126c9

前回の投稿で学習モデルをつくりました。

https://qiita.com/marcy_st_tech/items/be128a341441fb6270be

さて、次は実際に学習させてみましょう。

学習法にも様々な方法があります。
・ホールドアウト法
・交差検証法
・ジャックナイフ法
・ブートストラップ法
などなど

今回の投稿でもそれぞれの詳しい説明は行いません。
先人達が分かりやすくまとめて下さっているので、そちらをご参照下さい。

https://qiita.com/FukuharaYohei/items/0bae9bbaef0099627751

この投稿では「個人のPCで長時間学習を行う時の方法や注意点」を記載していこうと思います。

# 交差検証法（クロスバリデーション）

私が採用したのは交差検証法になります。
理由は明確。長時間、機械学習でPCを占有させることが出来ないからです。
(したくないからです)

交差検証法のための教師データの分割は、KFoldライブラリを用いれば簡単にできます。

~~~python:交差検証法のための教師データの分割（例）
import numpy as np
from sklearn.model_selection import KFold

x = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
y = np.array([1, 2, 3, 4, 5])

kf = KFold(n_splits=3, shuffle=True) # 3分割
for train_index, test_index in kf.split(x, y): # 3回ループ
    x_train = x[train_index] # 学習に用いるXデータ
    y_train = y[train_index] # 学習に用いるYデータ
    x_test = x[test_index]   # 検証に用いるXデータ
    y_test = y[test_index]   # 検証に用いるYデータ
~~~

私は5分割で交差検証しています。
交差検証法で学習させると、学習済みモデルが複数（5つ）できることになりますので、実際にトレードで使う時は、それぞれの学習済みモデルで予測させ、その平均をとることになります。
使い方については、次回以降の「MT4/MT5と学習モデルの連携システム構成」の投稿時に、詳しく解説します。

# 【個人PCによる】学習実行環境の構築

お金がジャブジャブある人は（表現が古いでしょうか？(笑)）、オンプレミスサーバーやクラウド（AWSやGCPなどなど）をご利用ください。
私のように、個人向けPCで学習させようと思っている人は、このまま読み進めてください。

## 学習に必要な時間
私の個人PCスペックは下記のとおりです。
（昔ちょっとだけカスタマイズしました）
- OS : Windows 10 Pro
- プロセッサ：Intel(R) Core(TM) i7-7700 CPU @3.60GHz 3.60GHz
- 実装RAM：32.0GB
- GPU：NVIDIA GeForce GTX 1070

このPCで機械学習を実施したとき、
1モデルだけの生成であれば、エポック数を1000とした場合、およそ1時間です。
通貨ペアにもハイパーパラメータの値にもよりますが、
私のモデルではエポック数が3000で綺麗に収束するので、およそ3時間かかります。

実際には交差検証法のため複数個のモデル生成が必要ですし、
学習データの組み合わせや要素数やデータ長を変更して何度も学習・検証を繰り返します。

すると平気で1週間、連続稼働とかあります。
その間、PCを止める訳には行きません。
下記の点に注意して、PCが途中で止まらないようにする必要があります。

:::note info
 PCを連続稼働させていると、電気代は1日数百円かかりますが、見なかったことにしましょう。
:::

## 途中経過を保存する
1モデル生成のたびにモデルを保存（外部出力）するのはもちろんですが、
途中経過を保存することをオススメします。
Kerasのライブラリを用いれば、下記のサンプルコードで途中経過を保存できます。

~~~python:途中保存サンプル
import os
from tensorflow.keras.callbacks import ModelCheckpoint

# 途中保存先
model_checkpoint = ModelCheckpoint(
    filepath=os.path.join(keras_output_min_folder, 'predict_model_best.hdf5'),
    monitor='val_loss',
    verbose=0,
    save_best_only=True,
    save_weights_only=True)

# 学習実行
history = model.fit(x_train, y_train, 
    batch_size=BATCH_SIZE, epochs=EPOCHS_NUM,
    validation_data=(x_valid, y_valid),
    callbacks=[model_checkpoint], 
    shuffle=True, verbose=0)

# モデル保存
model.save(h5_file, include_optimizer=False) # 再学習を想定しない
#model.save(h5_file, include_optimizer=True) # 再学習を想定
model.save_weights(hdf5_file)    
~~~

## バッチ起動のプログラムにする
実行環境で、**Jupyter Notebook** を用いている人もいるかと思いますが、
ブラウザ上の実行は長時間稼働に向いていないので、バッチファイル化して、コマンド実行することをオススメします。
簡単なループ処理であれば、下記のようにバッチでもループ処理ができます。引数に意味を持たせて（引数1は要素番号1とか）、コマンド実行しましょう。
~~~bat
cd /d %~dp0
for /l %%l in (2,1,10) do (
	for /l %%n in (2,1,10) do (
		python CreateModel.py USDJPY %%l %%n		
	)
)
~~~

## 不要なサービス・アプリ・機能の停止

### 1. スリープ解除

スリープは「なし」に設定しましょう。ディスプレイはOFFにしても問題ありません。

![スリープ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992567/034348fd-db47-4835-a7c5-8b1c26ffcc0f.png)

### 2. ネットワーク切断
機械学習実行中は、ネットワークは使う必要はないと思います。
いっそのこと切断してしまいましょう。

### 3. ウイルス検知アプリ停止
ウイルス検知アプリなど、定期実行する常駐アプリがあると思います。
ネットワークを切断するので、こちらも停止してしまいましょう。

### 4. 不要なサービス停止
ネットワーク系やセキュリティ系のサービスは不要となります。
不要なサービスも停止しましょう。

### 5. Windowsアップデート停止

:::note info
:coffee:**CoffeeBreak**
実はこれが一番大事。上記2～4はやらなくても大差ないですが、実行中にWindowsアップデートが勝手に実行され、学習を中断した経験が、何度あったことか…。
:::

Windowsアップデートを停止しましょう。

![WindowsUpdate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992567/bd51b13e-a046-4e40-a531-67bd902fcdd1.png)

## 停電・ブレイカーが落ちた時の対策を練りましょう
私の住処のように~~義両親がバカみたいに電気をつけっぱなしに…~~
その他の電気をたくさん使う家だったり、
~~古すぎの上、増改築を繰り返して電気系統がバカになって…~~
ブレーカーがすぐに落ちる家の場合、
停電やブレーカーが落ちた時の対策を行いましょう。

私の場合、小型の無停電電源装置を買いました。5年ぐらいは持ちます。

https://www.amazon.co.jp/%E3%82%AA%E3%83%A0%E3%83%AD%E3%83%B3-%E7%84%A1%E5%81%9C%E9%9B%BB%E9%9B%BB%E6%BA%90%E8%A3%85%E7%BD%AE-%E5%B8%B8%E6%99%82%E5%95%86%E7%94%A8%E7%B5%A6%E9%9B%BB-%E6%AD%A3%E5%BC%A6%E6%B3%A2%E5%87%BA%E5%8A%9B-550VA/dp/B079J8SCJK/ref=asc_df_B079J8SCJK?mcid=8ec24c98db4033cc821b67298d40db55&tag=jpgo-22&linkCode=df0&hvadid=707464437007&hvpos=&hvnetw=g&hvrand=17396537837635138694&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9178406&hvtargid=pla-456266366399&psc=1&gad_source=1

## CPU負荷は70～80% 程度

バッチ起動のプログラムにしたので、複数バッチを同時起動して、効率よく処理しましょう。この時、CPU／GPUの負荷は70～80%に留めておきましょう。
（下記の例は47%ですね）

![CPU.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992567/b89d8756-53b2-49ff-bb99-33f0aeb4b08f.png)

90%以上にしたとき、もし他の常駐処理が働いて100%になってしまった場合、
驚くほど進捗が遅くなります。少しぐらい余力を残しておいた方がいいです。

## コマンドプロンプトのウィンドウは触らない
これもとても大事です。私は何度も失敗しました。
実行中は下記のようなコマンドプロンプトのウィンドウが見えると思います。

![コマンドプロンプト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992567/c9cf449f-2313-4d94-b0a9-3c90faae393d.png)


ご存じの方も多いと思いますが、実行中にコマンドプロンプトのウィンドウをクリックしてしまうと、処理が中断されてしまいます。
ウィンドウは触らないよう、タスクバーに隠すなり、マウスやキーボードの電源を切るなりしましょう。
もしクリックしてしまった可能性がある場合、「Enter」を押して中断を解除しましょう。

# まとめ

機械学習の学習方法…というより、個人PCで機械学習を実行させる環境についての注意点を記載しました。
最近は使いやすく安いサーバー・クラウド環境もあるようなので、
そちらの見当がついている人は、そちらをお勧めします。デメリットが多いので個人PCにこだわる必要はないです。

次は「MT4/MT5と学習モデルの連携システム構成」について、投稿する予定です。
実はこの内容を一番知りたい人が多いので？と思っています。

よろしくお願いいたします。