前回の記事で、今回使う為替データを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メソッドを使います。
データの正規化はscikit–learnという機械学習ライブラリの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]
おわりに
お疲れ様です。少し長かったですが、
今回はデータを予測モデルに学習・検証させるように変換させるコードを作成しました。
次回は予測モデルの構築と学習を行っていきます。