見出し画像

FX機械学習入門(4/6):特徴量にノイズをいれて拡張する

これ面白いノイズをいれてかさまししてるんだ。

import numpy as np
import pandas as pd

def augment_data(raw_data, noise_level=0.01, time_shift=1, scale_range=(0.9, 1.1)):
    # 拡張前のデータの行数を出力します。
    print(f"拡張前の行数: {len(raw_data)}")

    # raw_dataをaugmented_dataにコピーします。
    augmented_data = raw_data.copy()

    # ノイズを追加します。
    noisy_data = raw_data.copy()
    noisy_data += np.random.normal(0, noise_level, noisy_data.shape)
    # NaN値を平均値で置き換えます。
    noisy_data.fillna(noisy_data.mean(), inplace=True)
    augmented_data = pd.concat([augmented_data, noisy_data])
    print(f"ノイズを追加した後の行数: {len(noisy_data)}")

    # タイムシフトを適用します。
    shifted_data = raw_data.copy()
    shifted_data.index += pd.DateOffset(hours=time_shift)
    # NaN値を平均値で置き換えます。
    shifted_data.fillna(shifted_data.mean(), inplace=True)
    augmented_data = pd.concat([augmented_data, shifted_data])
    print(f"タイムシフト後の行数: {len(shifted_data)}")

    # スケーリングを適用します。
    scale = np.random.uniform(scale_range[0], scale_range[1])
    scaled_data = raw_data.copy()
    scaled_data *= scale
    # NaN値を平均値で置き換えます。
    scaled_data.fillna(scaled_data.mean(), inplace=True)
    augmented_data = pd.concat([augmented_data, scaled_data])
    print(f"スケーリング後の行数: {len(scaled_data)}")

    # 反転を適用します。
    inverted_data = raw_data.copy()
    inverted_data *= -1
    # NaN値を平均値で置き換えます。
    inverted_data.fillna(inverted_data.mean(), inplace=True)
    augmented_data = pd.concat([augmented_data, inverted_data])
    print(f"反転後の行数: {len(inverted_data)}")

    # 拡張後のデータの行数を出力します。
    print(f"拡張後の行数: {len(augmented_data)}")

    # 年ごとに日付を表示します。
    print("年ごとの日付:")
    for year, group in augmented_data.groupby(augmented_data.index.year):
        print(f"年 {year}: {group.index}")

    return augmented_data

raw_data = augment_data(raw_data)


GPTの説明:

このコードは、データ拡張(Data Augmentation)の技術を使って、時系列データ(例えば、財務データ)のサンプル数を増やすことを目的としています。データ拡張は、特にデータが限られている場合に、モデルの性能と汎化能力を向上させるのに有用です。具体的には、以下の手順を通じてデータセットを拡張しています。

1. ノイズの追加

  • 何をしているか: 元のデータにランダムなノイズ(正規分布に基づく)を追加し、新しいサンプルを生成しています。

  • なぜするか: モデルが実世界のデータの微小な変動にも耐えられるようにし、過学習を防ぐためです。

2. タイムシフト

  • 何をしているか: データのインデックス(時系列の場合は日時など)をシフトさせ、時間的にずらした新しいサンプルを作成します。

  • なぜするか: 時系列データにおいて、時間的なずれに対するモデルの堅牢性を高めるためです。

3. スケーリング

  • 何をしているか: データ全体をランダムに選択したスケールで乗算し、データの大きさを変更します。

  • なぜするか: モデルが異なるスケールのデータに対してもうまく機能するようにするためです。

4. 反転

  • 何をしているか: データの符号を反転させ、例えば正の値を負に変えます。

  • なぜするか: データの方向性が異なる状況でもモデルが適切に機能するようにするためです。

データの前処理

各ステップで生成された新しいサンプルにはNaN値が含まれる可能性があるため、これらを平均値で置き換えています。これにより、モデルの訓練時に欠損データによる問題を防ぎます。

最終的な目的

これらの手法を通じて、元のデータセットに対して多様性と量を増やした新しいサンプルを生成し、結果として得られる拡張データセットを使用して機械学習モデルを訓練します。これにより、モデルはより多くのシナリオを学習し、実際の状況においてより正確な予測を行うことができるようになることが期待されます。特に、データ量が限られている場合や、より複雑な状況に対応する必要がある場合に効果的です。

参考記事:



この記事が気に入ったらサポートをしてみませんか?