②データの取得と予測モデルが学習・評価できるようにデータの加工

前回の記事で、今回使う為替データをOANDA APIを使って取得しました。今回はそのデータを予測モデルが学習、評価できるように修正していきます。

予測モデルには、入力として過去c分の終値、出力(正解)として、c+1の終値を渡します。イメージとしては以下のような図になります。

このように予測モデルが学習できるようにデータを成形していきます。また、予測モデルが学習しやすくなるようにデータの正規化を行います。

実装

では、実装していきましょう!前回と同じファイルに追記していきます。

必要なモジュールのインポート

必要なモジュール等をインポートします。今回はデータの正規化に用いるMinMaxScalerをインポートしておきます。

from sklearn.preprocessing import MinMaxScaler

データの正規化

まず、データの取得とデータの正規化を行います。

データを0〜1の間に正規化することで、モデル(ニューラルネットワーク)の学習効率が上がることが知られています。
なので、本プログラムでも正規化を行います。

# データの取得
prices = get_prices(GRANULARITY, COUNT, COUNT_TIMES)

# データの正規化0〜1の間の数値に
sc = MinMaxScaler(feature_range=(0, 1))
prices = sc.fit_transform(prices)

まず、データの取得は前回作成したget_pricesメソッドを使います。

データの正規化はscikitlearnという機械学習ライブラリのMinMaxScalerを用います。この引数のfeature_range=(0,1)によって0〜1の間の値に変換してくれる正規化用インスタンスscを作成します。

次の行のsc.fit_transform(prices)によって、先程取得したpricesを0〜1に変換します。

では、ちょっとプロットしてみましょう。

# データのプロット
fig, ax = plt.subplots()
x = np.arange(len(prices))
ax.plot(x, prices)

データが0〜1の値になっていることがわかります。

予測モデルに読み込ませるようのデータの作成

次に、先程画像を使って説明したように、予測モデルが学習・テスト出来るようにデータを加工するメソッド(create_data_for_model)を作成します。

以下のような感じで入力\(x\)と\(y\)として、たくさんデータを作っていきます。

各データは入力\(x_i = {c_j,…,c_{j+k}}\)と出力\(y_i = c_{j+k+1}\)といった形になります。

では、実装していきます。

def create_data_for_model(prices):
    """
        入力 x=[x1,x2,,,] -> 出力 y
        といった形で学習・テスト用のデータの作成
    """

    X, Y = [], []
    prices_len = len(prices)
    for i, _ in enumerate(prices):
        if (i + INPUT_LEN + 1 >= prices_len):
            break
        X.append(prices[i:i + INPUT_LEN])
        Y.append(prices[i + INPUT_LEN + 1])

    X = np.array(X)
    Y = np.array(Y)

    # 学習用・テスト用に分割
    split_index = int(len(prices) * 0.7)
    X_train = X[:split_index]
    Y_train = Y[:split_index]
    X_test = X[split_index:]
    Y_test = Y[split_index:]

    return X_train, Y_train, X_test, Y_test

# 学習・テスト用データの作成
X_train, Y_train, X_test, Y_test = create_data_for_model(prices)

まず、最初のfor分で、学習・評価用のデータを作成していきます。先程画像で示したようにデータを作っていきます。ちなみにXはモデルへの入力データ、Yは出力データです。

そして18行目では、作ったデータを学習用(X_train, Y_train)と評価用(X_test, Y_test)というふうに分割します。(以下はイメージです)

実際に作ったデータがどんな感じか、1つデータを取り出してみてみます。今回は訓練データの最初の要素を見てみます。

# データの確認
print("x:{} => y:{}".format(X_train[0], Y_train[0]))

文字列に変数を入れたい時にはformatを用います。文字列内の{}にformatに渡した変数を表示します。

すると以下のように出力します。


x:[[0.44342615]
 [0.46281283]
 [0.4589355 ]
 [0.44765597]
 [0.45928798]
 [0.46704265]
 [0.45541065]
 [0.43743391]
 [0.4282693 ]
 [0.40676771]] => y:[0.40148044]

おわりに

お疲れ様です。少し長かったですが、

今回はデータを予測モデルに学習・検証させるように変換させるコードを作成しました。

次回は予測モデルの構築と学習を行っていきます。

タイトルとURLをコピーしました