Kaggle本
時系列データの扱い3.10
時系列データのバリデーション手法5.3
以下の観点から捉える。
1.時間情報を持つ変数があるかどうか
2.学習データ、テストデータが時系列で分かれているかどうか
3.ユーザーや店舗といった系列ごとに時系列の目的変数があり、ラグ特徴量が取れる形式であるかどうか
ケース1(1に当てはまる場合)
・ユーザーの属性や過去の行動ログが与えられる、
・予測対象は1ヶ月以内に解約するかどうか
・ある時点のユーザーを分割して、学習データテストデータが作成されている。
ケース2(1と2に当てはまる場合)(自分のバイトはこれ)
・ユーザーの属性や過去の行動ログが与えられる
・予測対象は1ヶ月以内に解約するかどうか
・テストデータはある時点のユーザ全体で、学習データとして、過去の各月ごとに月初ごとに存在するユーザーとその月内に退会したかどうかが与えられる。
ケース3(1、2、3に当てはまる場合)
・ユーザーの属性や過去の行動ログの他に、ユーザー過去の利用時間が日毎に与えられる。
・予測対象は日毎の利用時間
・テストデータはある時点のユーザー全体と将来の一定期間の各日の組み合わせで、ユーザーの過去の利用時間から学習データが作成できる。
時系列データをクリーンに扱うには予測する時点より過去の情報のみを使う制約を守って特徴量の作成やバリデーションを行う必要がある。(データが不足しているときなどは例外に使用することもあるが)
ロングフォーマット、ワイドフォーマットを使い分ける。
ワイドフォーマットは時系列的な変化が見やすく、また後述のラグ特徴量を取るときに扱いやすい。一方で、学習を行うときはユーザーごとに目的変数を持つロングフォーマットにする。
ワイド→ロングはDataFramaのstackメソッド
ロング→ワイドはDataFrameのpivotメソッド
3.10.4 ラグ特徴量
店舗、日付、目的変数という形式のデータがあり、将来の各店舗の売上を予測するようなタスクを考える。
直近が単純かつ最も効果の大きい特徴量になるのに加え、周期にしたがってラグを取るのも有効。
ex 顧客の行動が曜日の影響を受け、1週間単位で周期があることが考えられるので1週間前の売り上げ、2週間前の売り上げ、、のようにラグ特徴量を作ることができる。
ex shift関数、移動平均、
リード特徴量(将来の値、天気など)
3.10.5 時点と紐づいた特徴量を作る。
過去の情報のみを使う制約を守ったまま学習、予測を行うために時点と紐づいた特徴量を作り、時点をキーとして学習データと統合する。
ex.不定期にイベントを開催しているときに、イベントの新鮮味や継続して人気のあるイベントかを反映するためにその日が何回目の出現かを特徴量とする。
ex.ログデータをもとに、各ユーザーの過去1週間のサービス利用回数を特徴量とすることを考える。
3.10.6 予測に使えるデータの期間
テストデータのレコードの時点ごとに使える過去の期間が異なる場合に注意する。
ex.テスト期間が1週間の場合
テストデータの期間が分割時点から何期先であるかによって個別にモデルを作成する。
5.3 時系列データのバリデーション手法
5.3.1
テストデータに最も近い期間をバリデーションデータとする、時系列にそったhold-out法(周期性を持つ場合は注意する)
バリデーションで求めた最適な特徴量やパラメータをそのまま使い、バリデーションデータも含めて再学習してモデルを作成する。
(学習データを最初からとする場合、学習データの期間の長さを揃える場合)
古すぎるデータをバリデーションデータとすると余り参考にならないのでどこかで打ち切る必要はある。
時間的な前後関係が余り気にする必要がない場合は単純に時間的に区切って分割する方法をとる。