2019年7月18日木曜日

Kerasで構築したニューラルネットワークのハイパーパラメータを自動チューニングする方法

概要

Kerasで構築したニューラルネットワークのハイパーパラメータを自動チューニングする方法のメモです。

用語

・Anaconda:データサイエンスおよび機械学習関連アプリケーション(大規模データ処理、予測分析、科学計算)のためのPythonおよびRプログラミング言語のフリーでオープンソースのディストリビューション
・Python:機械学習プログラミングに人気のプログラミング言語。
・Keras:Pythonで書かれたオープンソースニューラルネットワークライブラリ。tensorflowをラッピングして作られている。
・ニューラルネットワーク:脳機能を模して考案された機械学習のアルゴリズムの1つ。
・optuna:Kerasで構築するニューラルネットワークモデルのハイパーパラメータを自動チューニングしてくれるオープンソースライブラリ

事前準備(前提とする環境)

・Windows10 Professional
・Anaconda
・Python3(バージョン3.7.2)
・Keras2.1.5

手順

optunaのインストール

まずは事前準備として、ハイパーパラメータを自動チューニングしてくれるライブラリのoptunaをインストールします。

$ pip install optuna

ハイパーパラメータ自動チューニングプログラムを作成

インストールが完了したら、早速プログラムを作成します。
自動チューニングするのは、前回本ブログで作成したニューラルネットワークモデル作成プログラムの「createModel.py」です。
具体的なプログラムは以下です。
今回も著者のプログラム能力不(ryです。

import datetime
import importXLSX as ic
import numpy as np
import optuna

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization
from keras.utils import np_utils


def getData(fileDefinition, trainFilename, testFileName, superviser):
    # 入力データの作成 -------------------------------------------------------------------------
    # 入力データの全件取得
    print(datetime.datetime.today(), ' トレーニング用データの取得を開始します')
    trainData = ic.getData(fileDefinition, trainFilename, 1, 1, superviser)

    # 学習データと教師データの作成(Pandas)
    print(datetime.datetime.today(), ' トレーニング用データから学習データと教師データを作成します')
    x_train, y_train = ic.setSupData(superviser, trainData)

    # テストデータの作成 -----------------------------------------------------------------------
    # テスト用データの全件取得
    print(datetime.datetime.today(), ' テスト用データを作成します')
    testData = ic.getData(fileDefinition, testFileName, 1, 1, superviser)

    # テストデータと正解データの作成(Pandas)
    print(datetime.datetime.today(), ' テスト用データからテストデータと正解データを作成します')
    x_test, y_test = ic.setSupData(superviser, testData)

    return x_train, y_train, x_test, y_test


def objective(trial):
    # パラメータ
    fileDefinition = 'nikkei225_def.xlsx'
    trainFilename = 'nikkei225.xlsx'
    testFileName = 'nikkei225_test.xlsx'
    superviser = '翌日日経平均'

    # データをロード
    x_train, y_train, x_test, y_test = getData(fileDefinition, trainFilename, testFileName, superviser)

    # 調整したいハイパーパラメータの設定
    n_layer = trial.suggest_int('n_layer', 1, 3) # 追加する層を1-3から選ぶ
    mid_units = int(trial.suggest_discrete_uniform('mid_units', 100, 500, 1)) # ユニット数
    dropout_rate = trial.suggest_uniform('dropout_rate', 0, 1) # ドロップアウト率
    activation = trial.suggest_categorical('activation', ['relu', 'sigmoid']) # 活性化関数
    optimizer = trial.suggest_categorical('optimizer', ['sgd', 'adam', 'rmsprop']) # 最適化アルゴリズム

    model = Sequential()

    model.add(Dense(x_train.shape[1], activation=activation))
    model.add(BatchNormalization())
    model.add(Dropout(dropout_rate))

    for i in range(n_layer):
        model.add(Dense(mid_units, activation=activation))
        model.add(BatchNormalization())
        model.add(Dropout(dropout_rate))

    model.add(Dense(1))

    model.compile(loss='mean_squared_error', optimizer=optimizer)
    history = model.fit(x_train.values, y_train.values, epochs=500, batch_size=16, verbose=1, validation_split=0.1)
    score = model.evaluate(x_test.values, y_test.values, verbose=0)
    print('Test MSE : ', score)


    # 学習モデルの保存
    model_json = model.to_json()
    with open('keras_model.json', 'w') as f_model:
        f_model.write(model_json)
    model.save_weights('keras_model.hdf5')

    # 最小値探索なので
    return -1 * score


def main():
    study = optuna.create_study(sampler=optuna.samplers.TPESampler())
    study.optimize(objective, n_trials=15)
    print('best_params')
    print(study.best_params)
    print('-1 x best_value')
    print(-study.best_value)

    print('\n --- sorted --- \n')
    sorted_best_params = sorted(study.best_params.items(), key=lambda x : x[0])
    for i, k in sorted_best_params:
        print(i + ' : ' + str(k))


if __name__ == '__main__':
    main()

0 件のコメント:

コメントを投稿

FX自動トレード_2021年6月実績

      概要 2021年6月が終わり、FX自動トレードによる収益実績を取り纏めましたので振り返ってみたいと思います。 2021年6月結果 2021年6月の実績は、実利利益額:\66,761、実績利益率は1.42%でした。 今月もボラが全く出ず。利益率の連続過去最低記録更新は免...