@applejxd

雑記帳

LightGBM で時系列データ分析

目次

CSV ファイルの読み込み

import pandas as pd

# 学習・バリデーションデータの読み込み
train =  pd.read_csv('/path/to/training/data.csv')
# 説明変数(target カラム以外)
train_x = train.drop(['target'], axis=1)
# 目的変数(targetカラム)
train_y = train['target']

# 予測データの読み込み
test_x = pd.read_csv('/path/to/est/data.csv')

前処理

数値変数は欠損値処理・標準化等行わないでそのままでOK. カテゴリ変数は label encoding する.

from sklearn.preprocessing import LabelEncoder

# カテゴリ変数のカラム名
cat_cols = {"Category_hoge", "Category_fuga"}

for c in cat_cols:
    le = LabelEncoder()
    # 学習データに基づいて定義する
    le.fit(train_x[c])
    train_x[c] = le.transform(train_x[c])
    test_x[c] = le.transform(test_x[c])

バリデーションデータの用意

1例として時期を4分割してクロスバリデーションする場合

import numpy as np

# 分割数
n_fold = 4

# 時間に沿って変数periodを設定
# 学習・バリデーションデータ:0~3, 予測データ:4
train_x['period'] = np.arange(0, len(train_x)) // (len(train_x) // n_fold)
train_x['period'] = np.clip(train_x['period'], 0, n_fold-1)
test_x['period'] = n_fold

# 1 のバリデーションに 0を
# 2 のバリデーションに 0,1 を, ...
va_period_list = list(range(1, n_fold))
for va_period in va_period_list:
    # bool:学習データかどうか
    is_tr = train_x['period'] < va_period
    # bool:バリデーションデータかどうか
    is_va = train_x['period'] == va_period
    # 学習データとバリデーションデータに分離
    tr_x, va_x = train_x[is_tr].copy(), train_x[is_va].copy()
    tr_y, va_y = train_y[is_tr].copy(), train_y[is_va].copy()

    # 以降でモデル定義とバリデーションを実施

モデル定義と予測

特徴量エンジニアリング

ハイパーパラメータの調整