時系列分類05:Python利回りはスライディングウィンドウを実装して時系列データをインターセプトします(調整可能なスライディングステップサイズ)

時系列予測または時系列分類タスクを処理するとき、時系列予測または分類について書かれた20を超える記事に多かれ少なかれ含まれる「スライディングウィンドウ」の概念に遭遇することがよくあります。この概念も繰り返し言及されています。画像の畳み込みニューラルネットワーク処理の原理と同様に、シーケンスデータの「スライディングウィンドウ」を使用してシーケンスフラグメントをインターセプトし、元のデータを指定の長さのサンプルに再形成して、モデルをモデル化します。

スライディングウィンドウを実装するには多くの方法があり、forループを使用できますが、大量のデータを処理する場合はforループが拡張されているようです。現時点では、Pythonの利回りが便利です。Pythonの利回りの原理と使用については、ある程度の基礎が必要です。以前に具体的に記事を書いたことがあります。興味がある場合は、Pythonの利回りを簡単に分析するを参照してください

日常のビジネスニーズでは、スライディングウィンドウ関数は通常、トレーニングセットテストセットの分割とは別に定義されます。比較的単純な状況であれば、関数で定義できます。


方法1

次の例は、家庭の電力消費量予測の例におけるスライディングウィンドウの実装方法です。

最初に、データセットの状況を確認します。
ここに画像の説明を挿入
上の図から、トレーニングセット(以下のコードのトレーニング)の形状は(1442,8)で、サンプリングポイントは1442であり、フィーチャ(フィーチャ)の数は8(8列)です。 )。上記のサンプリングデータは、スライディングウィンドウとスライスの組み合わせによってサンプルに分割されます。スライディングウィンドウの幅とスライディングステップ(sw_width)をパラメーターとして設定すると、後でパラメーターを調整しやすくなり、ニーズに合ったビジネスニーズを見つけることができます。ウィンドウ幅とスライドステップ。コードの実装:

def sliding_window(train, sw_width=7, n_out=7, in_start=0):
    '''
    该函数实现窗口宽度为7、滑动步长为1的滑动窗口截取序列数据
    '''
    data = train.reshape((train.shape[0] * train.shape[1], train.shape[2])) # 将以周为单位的样本展平为以天为单位的序列
    X, y = [], []
    
    for _ in range(len(data)):
        in_end = in_start + sw_width
        out_end = in_end + n_out
        
        # 保证截取样本完整,最大元素索引不超过原序列索引,则截取数据;否则丢弃该样本
        if out_end < len(data):
            # 训练数据以滑动步长1截取
            train_seq = data[in_start:in_end, 0]
            train_seq = train_seq.reshape((len(train_seq), 1))
            X.append(train_seq)
            y.append(data[in_end:out_end, 0])
        in_start += 1
        
    return np.array(X), np.array(y)

上記の説明で、少し基本的なことを理解するのは難しくないはずです。興味がある場合は、この記事を参照してください。時系列予測15:電力消費量/発電量予測を実現するためのマルチ入力/マルチヘッドCNN


方法2

このメソッドは、データインターセプトの単一の列であり、forループおよびnp.vstackメソッドと組み合わせて、データの複数の列をスタックできます。この部分はプロジェクトのポイントです。プロジェクトが完了すると、今後の記事で紹介されます。このメソッドは、スライディングウィンドウの幅とスライディングステップを指定できます。最初にデータセットの状況を見て、実装されている機能の理解を容易にします。
ここに画像の説明を挿入
上の図から、データセット(次のコードのトレイン)の形状は(875,10)、サンプリングポイントは875、フィーチャ(フィーチャ)の数は10(10列)であることがわかります。コードの実装:

def _slide_window(rows, sw_width, sw_steps):
    '''
    函数功能:
    按指定窗口宽度和滑动步长实现单列数据截取
    --------------------------------------------------
    参数说明:
    rows:单个文件中的行数;
    sw_width:滑动窗口的窗口宽度;
    sw_steps:滑动窗口的滑动步长;
    '''
    start = 0
    s_num = (rows - sw_width) // sw_steps # 计算滑动次数
    new_rows = sw_width + (sw_steps * s_num) # 完整窗口包含的行数,丢弃少于窗口宽度的采样数据;
    
    while True:
        if (start + sw_width) > new_rows: # 如果窗口结束索引超出最大索引,结束截取;
            return
        yield start, start + sw_width
        start += sw_steps

上記のデータセットを使用してテストします。

_test_list = []
for start,end in _slide_window(test_concat_file.shape[0], 100, 40):
	'''
	此处可以添加for循环或者其他方式,以实现处理多列数据
	'''
    _test_list.append(test_concat_file['ax'][start:end])
    '''
    此处可添加判断条件,以实现数组堆叠
	'''

生成されたサンプルリストの長さを確認します。

len(_test_list)

出力:

20

最後のサンプルに含まれるサンプリングデータ情報を表示します。

_test_list[19]

出力:

760      0.1245
761    0.124742
762    0.124991
763    0.125238
764    0.125482
         ...   
855    0.185577
856    0.185849
857    0.186137
858    0.186466
859    0.186857
Name: ax, Length: 100, dtype: object

もちろん、それを実現する方法はたくさんありますが、この記事では、使用している2つの方法のみを取り上げ、必要な人を助けることを期待しています。

元の記事を167件公開 賞賛された686件 50,000件以上の表示

おすすめ

転載: blog.csdn.net/weixin_39653948/article/details/105498685