広告 Python 回帰モデル

【Python】ラグ特徴量(時間遅れ変数)による予測精度向上

ラグ特徴量による予測精度向上

どうも。こんにちは。
ケミカルエンジニアのこーしです。

本日は、「ラグ特徴量(時間遅れ変数)による予測精度向上」についてわかりやすく解説します。

時系列データでは、目的変数yを予測する際にラグ特徴量(時間遅れ変数)を説明変数Xにすることで予測精度の向上が見込まれます。

そこで本記事では、目的変数yと最も相関係数が大きくなるラグ特徴量(時間遅れ変数)を探索した後、それらのラグ特徴量を用いて予測精度が向上するかを確認します。

本記事の内容

・最終成果物(Pythonコード)
・サンプルデータの入手
・PLSの実行(元データ)
・ラグ特徴量のデータセット作成
・PLSの実行(ラグ特徴量)
・Random Forest(RF)の回帰分析結果
・参考文献

最終成果物(Pythonコード)

ソースコードはGitHubに公開しています。

PLS Ver.

Random Forest Ver.

回帰モデルは、線形のPLSと非線形のRandom Forest(RF)の2ケースを用意しました。

 

それでは、毎度のごとく脱ブタン塔のサンプルデータを使っていきます。

サンプルデータの入手

脱ブタン塔2

コチラのGitHubページで入手できる「debutanizer_data.csv」を利用します。

脱ブタン塔のプロセスデータであり、プロセスフローは上図の通りです。

説明変数がx1〜x7の7個で、目的変数がyの1個、サンプル数は2394個です。

変数名 詳細 日本語訳
x1 Top Temperature 塔頂温度
x2 Top pressure 塔頂圧力
x3 Reflux flow 還流流量
x4 Flow to next process 次プロセスへの流量
x5 6th tray Temperature 6段目温度
x6 Bottom Temperature1 塔底温度1
x7 Bottom Temperature2 塔底温度2
y Butane(C4) content in the debutanizer column bottom 塔底におけるブタン含有量

 

データの読み込み

「debutanizer_data.csv」と同じフォルダに、「lag_pls_regression.ipynb」というファイルを作成しましょう。

下記のコードでライブラリのインポートとデータの読み込みを行います。

別記事で作成したコードを再利用するため、自作モジュール(regression_tools)をインポートしています。

  • load_data
  • evaluate_performance_std(PLS)
    (evaluate_performance(RF))
  • evaluate_model_std(PLS)
    (evaluate_model(RF))
  • perform_pls_regression(PLS)
    (perform_rf_regression(RF))

自作モジュール(regression_tools)の中身についてはコチラを参照してください。

import pandas as pd
import numpy as np
#自作モジュール
from regression_tools import load_data, evaluate_performance_std, evaluate_model_std, perform_pls_regression

df = load_data()

 

PLSの実行(元データ)

得られたデータセットを説明変数Xと目的変数yに分割し、PLSを実行しましょう!

# 説明変数Xと目的変数yに分割
X = df.iloc[:, :-1]
y = df.iloc[:, -1]

# 関数の実行
best_components, standard_regression_coefficients, beta_train, intercept_train = perform_pls_regression(X, y)

perform_pls_regression関数の中身については、下記の記事で解説しています。

PLSを使ってみよう!
【Python】部分的最小二乗回帰(PLS)を使ってみよう!

続きを見る

 

それでは回帰分析の結果を見てみましょう(一部抜粋)。

トレーニングデータ

トレーニング予測プロット元PLS2

トレーニングトレンド元PLS

 

テストデータ

テスト予測プロット元PLS

テストトレンド元PLS

 

回帰分析結果まとめ(元データ)

元データの回帰分析結果を下表にまとめました。

テストデータの決定係数(R2)がマイナスになっているため、平均値で回帰するよりもパフォーマンスが悪いという結果です。

全然予測できていないですね。。

PLS(元データ) R2 RMSE MAE
トレーニングデータ 0.072 0.136 0.087
テストデータ -0.029 0.185 0.137

ラグ特徴量のデータセット作成

下記の流れでラグ特徴量のデータセットを作成していきます。

  • 各変数に対して0〜30分のラグ特徴量を作成
  • それぞれのラグ特徴量と目的変数yとの相関係数を計算
  • 各変数について相関係数の絶対値が最大のラグを抽出
  • 最も相関の強いラグ特徴量のみを含むデータフレームを作成

pythonコードは下記の通りです。

# データフレームを用意
correlations = pd.DataFrame()

# ラグ0から30までの特徴量を作成し、yとの相関を計算
for col in X.columns:  # yを除く全てのカラムに対して
    for lag in range(31):  # ラグ0から30まで
        X_lagged = X[col].shift(lag)
        corr = X_lagged.corr(y)
        correlations.loc[lag, col] = corr

# 各カラムに対して相関係数の絶対値が最大のラグを抽出
best_lags = correlations.abs().idxmax()

# 最も相関が強いラグ特徴量だけを含むデータセットを作成
df_lag = pd.DataFrame()
for col, lag in best_lags.items():
    df_lag[f'{col}_lag_{lag}'] = X[col].shift(lag)

# NaN値を削除
df_lag['y'] = y
df_lag.dropna(inplace=True)

# 結果を表示
df_lag

上記コードを実行すると、下図のようなラグ特徴量のデータセットが作成できました。

ラグ特徴量データセット

 

目視確認 Ver.

ちなみに、結果にいまいち自信がもてない場合は、目視で確認しながら実行する方法があります。

下記の記事でラグ特徴量(時間遅れ変数)の相関係数をチェックする可視化ツールを作成しています。

Streamlitライブラリを用いて、簡単に可視化ツールを作成することができます。

lag_correlation
【Python】ラグ特徴量(時間遅れ変数)の相関係数

続きを見る

また、Stremlit Shareで可視化ツールを公開しているので、一旦コチラを見てください。

最も相関係数の絶対値が大きくなるラグ特徴量(時間遅れ変数)を探索してみると下表の通りです。

説明変数 ラグ(時間遅れ) [分]
x1 21
x2 11
x3 13
x4 8
x5 20
x6 22
x7 22

この数値を使ってラグ特徴量のデータセットを作成するpythonコードは下記の通りです。

先ほど作成したものと全く同じラグ特徴量のデータセットが得られます。

# ラグの値(目視確認)
lags = [21, 11, 13, 8, 20, 22, 22]

# 新しいデータフレームを作成
df_lag = pd.DataFrame(index=X.index)

# 各変数に対して指定されたラグを適用
for i, lag in enumerate(lags, start=1):
    df_lag[f'x{i}_lag_{lag}'] = X[f'x{i}'].shift(lag)

# 目的変数 y もデータフレームに追加
df_lag['y'] = y

# NaN値を含む行を削除
df_lag.dropna(inplace=True)

# 結果を表示
df_lag

 

PLSの実行(ラグ特徴量)

得られたラグ特徴量のデータセット(df_lag)を説明変数Xと目的変数yに分割し、PLSを実行しましょう!

# 説明変数Xと目的変数yに分割
X_lag = df_lag.iloc[:, :-1]
y_lag = df_lag.iloc[:, -1]

# 関数の実行
best_components, standard_regression_coefficients, beta_train, intercept_train = perform_pls_regression(X_lag, y_lag)

それでは、元データと同様に回帰分析の結果を見てみましょう(一部抜粋)。

トレーニングデータ

トレーニング予測プロットラグ

トレーニングトレンドラグ

 

テストデータ

テストデータ予測プロットラグ

テストデータトレンドラグ

 

回帰分析結果のまとめ(ラグ特徴量)

元データとラグ特徴量のデータセットによる回帰分析結果を下表にまとめました。

ラグ特徴量(時間遅れ変数)を考慮することで予測精度が劇的に改善していることがわかります。

PLS(元データ) R2 RMSE MAE
トレーニングデータ 0.072 0.136 0.087
テストデータ -0.029 0.185 0.137
PLS(ラグ特徴量) R2 RMSE MAE
トレーニングデータ 0.626 0.086 0.062
テストデータ 0.533 0.125 0.091

 

Random Forest(RF)の回帰分析結果

詳細は割愛しますが、Random Forest(RF)でも同様のことをやってみましょう。

pythonコードはコチラ(GitHub)に記載しています。

それでは、回帰分析結果のみ下表に示します。

RF(元データ) R2 RMSE MAE
トレーニングデータ 0.438 0.106 0.072
テストデータ -0.048 0.186 0.145
RF(ラグ特徴量) R2 RMSE MAE
トレーニングデータ 0.708 0.076 0.054
テストデータ 0.552 0.122 0.090

PLSと同様、Random Forestでもラグ特徴量を考慮することで予測精度が劇的に改善していることがわかります。

 

参考文献

Kaggleで勝つデータ分析の技術

ラグ特徴量(時間遅れ変数)について簡単に解説してくれています。

 

化学のためのPythonによるデータ解析・機械学習入門

部分的最小二乗回帰(PLS)や回帰分析結果のまとめ方はこちらの書籍を参考にしました。

 

Pythonで学ぶ実験計画法入門

ランダムフォレスト回帰については、こちらの書籍を参考にしました。

 

  • この記事を書いた人
  • 最新記事

こーし

■ケミカルエンジニア
■化学メーカー勤務
■現場配属の生産技術
■化学工学技士、統計検定1級など
■化学工学 × データサイエンス
pythonと数理統計学を勉強中!

-Python, 回帰モデル
-, ,