Dataikuでの時系列予測におけるPython処理の例

本記事では、Dataikuを用いた時系列予測のプロセスにおいて、Python機能を活用してデータの準備および分割を行う方法を解説します。時系列データを適切に処理し、効果的な予測を行うためには、学習データとテストデータを適切に分割することが重要です。
はじめに
本記事では、Dataikuを用いた時系列予測のプロセスにおいて、Python機能を活用してデータの準備および分割を行う方法を解説します。時系列データを適切に処理し、効果的な予測を行うためには、学習データとテストデータを適切に分割することが重要です。
1. テストデータの生成
時系列予測では、将来のデータを事前に生成し、モデルがどのようなパターンを予測するかを検証することが重要です。Code recipesを開きpythonをクリックします。
Inputに加工したいデータ、Outputの加工後に出力するためのテーブルを用意します。
その後Pyhonのエディタが展開され、コードを入力することができます。以下のコードでは、既存のデータを基に未来の7日間のデータを生成します。コードの入力が完了したらRunボタンを教えて、処理を開始します。
import dataiku
import pandas as pd, numpy as np
from dataiku import pandasutils as pdu
# Read recipe inputs
historical_data = dataiku.Dataset("historical_data")
historical_data_df = historical_data.get_dataframe()
# 'data' 列を日付型に変換
historical_data_df['data'] = pd.to_datetime(historical_data_df['data'])
# 'data' でデータを昇順にソート
historical_data_df = historical_data_df.sort_values(by='data')
# 最新の日付を取得
latest_date = historical_data_df['data'].max()
# 未来のデータ日付範囲を生成(最新日付から次の日付以降の7日分)
test_data_dates = pd.date_range(start=latest_date + pd.Timedelta(days=1), periods=7)
# 未来データ用にカテゴリを取得
unique_categories = historical_data_df['category'].unique()
# 未来のデータフレームを作成
test_data = pd.DataFrame([(date, category) for date in test_data_dates for category in unique_categories],
columns=['data', 'category'])
# 未来データに元のデータのカラムを追加し、値を空にする
test_data = test_data.reindex(columns=historical_data_df.columns, fill_value=None)
# 元のデータと未来データを結合
combined_data = pd.concat([historical_data_df, test_data], ignore_index=True)
# 出力データセットに代入
generated_data_df = combined_data
# Write recipe outputs
generated_data = dataiku.Dataset("generated_data")
generated_data.write_with_schema(generated_data_df)
このコードでは、以下の処理を行っています。
- データの読み込み:Dataikuのデータセットを取得
- 日付の変換とソート:データを時系列順に並べる
- 未来のデータ生成:最新日付から7日分の未来データを作成
- カテゴリの適用:元のデータのカテゴリを未来データにも適用
- データセットの保存:生成したデータをDataikuに書き込む
この処理により、予測モデルが学習するための適切なテストデータを準備できます。
2. データの分割
データを適切に学習・検証・テストの3つの期間に分割することで、モデルの評価精度を向上させます。1と同じようにPythonを開き、コードを実行していきます。以下のコードでは、学習期間を365日(1年)、検証期間を7日、テスト期間を7日と設定し、データを分割します。
import dataiku
import pandas as pd
from dataiku import pandasutils as pdu
# Dataikuのデータセットを読み込む
prepared_data = dataiku.Dataset("prepared_data")
df = prepared_data.get_dataframe()
# 'data' を日付型に変換
df['data'] = pd.to_datetime(df['data'])
# 年末年始の期間(12月23日~1月5日)を除外
df = df[~(
((df['data'].dt.month == 12) & (df['data'].dt.day >= 23)) |
((df['data'].dt.month == 1) & (df['data'].dt.day <= 5))
)]
# 'data' でデータを昇順にソート
df = df.sort_values(by='data')
# 各期間の日数を設定
test_period_days = 7 # テスト:最新1週間
validate_period_days = 7 # 検証:テスト直前の1週間
train_period_days = 365 # 学習:検証直前の1年間
# データセット内の最新の日付を取得
latest_date = df['data'].max()
# テストデータの抽出
test_data_start_date = latest_date - pd.Timedelta(days=test_period_days - 1)
test_data_end_date = latest_date
test_data = df[
(df['data'] >= test_data_start_date) &
(df['data'] <= test_data_end_date)
]
# 検証データの抽出
validate_data_end_date = test_data_start_date - pd.Timedelta(days=1)
validate_data_start_date = validate_data_end_date - pd.Timedelta(days=validate_period_days - 1)
validate_data = df[
(df['data'] >= validate_data_start_date) &
(df['data'] <= validate_data_end_date)
]
# 学習データの抽出
train_data_end_date = validate_data_start_date - pd.Timedelta(days=1)
train_data_start_date = train_data_end_date - pd.Timedelta(days=train_period_days - 1)
train_data = df[
(df['data'] >= train_data_start_date) &
(df['data'] <= train_data_end_date)
]
# Dataikuデータセットへの書き込み
train_dataset = dataiku.Dataset("train_dataset")
train_dataset.write_with_schema(train_data)
validate_dataset = dataiku.Dataset("validate_dataset")
validate_dataset.write_with_schema(validate_data)
test_dataset = dataiku.Dataset("test_dataset")
test_dataset.write_with_schema(test_data)
このコードでは、
1.データの取得と前処理
2.学習・検証・テストの3つの期間に分割
3.Dataikuのデータセットとして保存 を実行しています。
まとめ
本記事では、Dataikuでの時系列予測におけるPythonを活用したデータ処理について解説しました。学習期間1年、予測期間1週間という設定により、短期予測に適したデータセットを作成され今後の運用に適したフローとなりました。Dataikuのビジュアル機能とPythonを組み合わせることで、より柔軟なデータ処理と予測モデルの開発が可能になります。