線形回帰を使ったシンプルな需要予測

線形回帰

$y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_p x_p + \epsilon$

ここで:

  • $y$は目的変数
  • $x_1,x_2,…,x_p$は説明変数
  • $\beta_0はy軸の切片$
  • $\beta_1,\beta_2,…,\beta_p$は各説明変数の係数
  • $\epsilonは誤差項$

線形回帰の目的は、観測データに最も適合する線(または高次元の場合は超平面)を見つけることです。

実際のy値とモデルによって予測されるy値との差の二乗和を最小化することによって見つけられます。

$\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i – \hat{y}_i)^2 $

ここで:

  • $MSE$は平均二乗誤差
  • $y_i$は$i$番目の実際の$y$値
  • $\hat{y}_i$は$i$番目の予測された$y$値
  • $n$はデータポイントの数

$MSE$を最小化することで、
$\beta$の値(係数)を最適化できます。

予測モデルを使用して未来の需要を予測する関数

Parameters:

  • data: 過去の需要データ。リストまたはNumPy配列を想定。
  • days_ahead: 何日後の需要を予測するか。

Returns:

  • forecasted_value: 予測された需要値
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

def demand_forecast(data, days_ahead):
    X = [data[i: i+5] for i in range(len(data)-5)]
    y = data[5:]

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    model = LinearRegression()
    model.fit(X_train, y_train)

    predictions = model.predict(X_test)
    mse = mean_squared_error(y_test, predictions)
    print(f"Test MSE: {mse}")

    forecasted_input = data[-5:] # 最後の5日間のデータ
    for _ in range(days_ahead):
        next_day = model.predict([forecasted_input[-5:]])
        forecasted_input.append(next_day[0])

    forecasted_value = forecasted_input[-1]

    return forecasted_value

data = [100, 110, 105, 120, 130, 140, 135, 145, 160, 170, 175, 180]
forecast = demand_forecast(data, 1)
print(f"Forecasted demand for next day: {forecast}")

実行結果

Test MSE: 35.25317352782804
Forecasted demand for next day: 192.21572958313527

厳密な実装

・前処理
・モデル選択
・特徴量エンジニアリング