売上を予測するための 5 つの機械学習テクニック

売上を予測するための 5 つの機械学習テクニック

売上予測は、機械学習 (ML) の一般的かつ重要な用途です。予測売上は、ベースラインを確立して新しい取り組みの増分影響を判断し、予想される需要に基づいてリソースを計画し、将来の予算を計画するために使用できます。この記事では、売上を予測するために 5 つの異なる ML モデルを実装する方法を説明します。

初期準備

まず、データをロードして、各モデルで使用する構造に変換します。元の形式では、データの各行は 10 店舗の 1 日の売上を表します。私たちの目標は月間売上を予測することなので、まずすべての店舗と日数を合計して月間売上を算出します。

  1. def load_data():
  2. pd.read_csv('D:\Jupyter\dataset\demand-forecasting-kernels-only/train.csv') を返します。
  3.  
  4.  
  5. 月次売上データを定義します。
  6. 毎月のデータ= data.copy()
  7. 月次データ月次データ.date = 月次データ.date.apply(lambda x: str(x)[:-3])
  8. monthly_data monthly_data = monthly_data.groupby('date')['sales'].sum().reset_index()
  9. 月次データ.date = pd .to_datetime(月次データ.date)
  10. 月次データを返す
  11.  
  12. monthly_df =月次売上(売上データ)
  13. 月次_df.head()

新しいデータ フレームでは、各行が特定の月におけるすべての店舗の合計売上を表すようになりました。

月間総売上高を時間の経過とともにプロットすると、月間平均売上高が時間の経過とともに増加していることがわかります。これは、データが定常ではないことを意味します。定常化するために、月間売上の差を計算し、それをデータ フレームに新しい列として追加します。

  1. get_diff(データ):
  2. データ['sales_diff'] = data.sales.diff()
  3. データデータ= data.dropna()
  4.      
  5. data.to_csv('D:/Jupyter/dataset/demand-forecasting-kernels-only/stationary_df.csv')
  6. データを返す
  7.  
  8. 静止_df = get_diff (月次_df)

差分変換の前後のデータを視覚的に表したものが以下です。

差異の前後の定常性を比較する

月間売上を表すデータを取得し、それを固定値に変換したので、さまざまなモデル タイプのデータを設定します。これを実行するには、ARIMA モデリングに使用する構造と、残りのモデルに使用する構造の 2 つの異なる構造を定義します。

Arima モデルでは、日時インデックスと従属変数 (売上の差) 列のみが必要です。

  1. 定義:
  2. dt_data = data.set_index('date').drop('sales', axis = 1 )
  3. dt_data.dropna(= 0 )
  4.      
  5. dt_data.to_csv('D:/Jupyter/dataset/demand-forecasting-kernels-only/arima_df.csv')
  6.      
  7. dt_dataを返す
  8.  
  9. arima_datetime = generate_arima_data (stationary_df)

他のモデルについては、各機能が前月の売上を表す新しいデータフレームを作成します。機能セットに含める月数を決定するには、自己相関プロットと部分自己相関プロットを観察し、ARIMA モデリングでラグを選択するためのルールを使用します。この方法により、ARIMA および回帰モデルの一貫した遡及期間を維持できます。

自己相関と偏自己相関のプロット

上記に基づき、12 か月の遡及期間を選択します。したがって、12 か月ごとに 1 列ずつ、合計 13 列のデータ フレームを生成し、従属変数である売上の差を列 1 として指定します。

  1. def generate_supervised(データ):
  2. supervised_df =データ.copy()
  3.      
  4. #ラグごとに列を作成
  5. iが範囲(1,13)内にある場合:
  6. col_name = 'lag_' + str(i)
  7. supervised_df[col_name] = supervised_df['sales_diff'].shift(i)
  8.      
  9. #null値を削除する
  10. supervised_df supervised_df = supervised_df.dropna().reset_index( drop = True )
  11.      
  12. supervised_df.to_csv('D:/Jupyter/dataset/demand-forecasting-kernels-only/model_df.csv',インデックス= False )
  13.      
  14. supervised_df を返す
  15.  
  16. model_df = generate_supervised (stationary_df)

これで、2 つの別個のデータ構造ができました。1 つは日時インデックスを含む Arima 構造で、もう 1 つは遅延時間機能を含む教師あり構造です。

売上予測のためのARIMAと教師ありデータフレーム

モデリング

すべてのモデルを作成して評価するには、次の機能を実行する一連のヘルパー関数を使用します。

  • トレーニング/テストの分割: データを分割して、過去12か月のデータをテストセットの一部とし、残りのデータをモデルのトレーニングに使用します。
  • データのスケーリング: 最小最大スケーラーを使用して、すべての変数が-1から1の範囲になるようにデータをスケーリングします。
  • スケールの反転: モデルを実行した後、このヘルパー関数を使用してステップ2のスケールを反転します。
  • 予測データフレームを作成する: テストセットでキャプチャされた実際の売上とモデルの予測を含むデータフレームを生成し、成功を定量化できるようにします。
  • モデルのスコアリング: このヘルパー関数は、予測の二乗平均平方根誤差 (RMSE) と平均絶対誤差 (MAE) を保存し、5 つのモデルのパフォーマンスを比較します。

1. 回帰モデル: 線形回帰、ランダムフォレスト回帰、XGBoost

回帰モデルでは、scikit-learn ライブラリの fit-predict 構造を使用できます。したがって、各モデルに対して呼び出す基本モデリング構造を設定できます。以下の関数は、上記で概説したヘルパー関数の多くを呼び出して、データを分割し、モデルを実行し、RMSE スコアと MAE スコアを出力します。

  1. def regressive_model(トレーニングデータ、テストデータ、モデル、モデル名):
  2.      
  3. # ヘルパー関数を呼び出して、X と y のデータとスケールデータを作成します
  4. X_train、y_train、X_test、y_test、スケーラーオブジェクト=
  5. スケールデータ(トレーニングデータ、テストデータ)
  6.      
  7. # 回帰モデルを実行する
  8. mod =モデル 
  9. mod.fit(X_train、y_train) を使います。
  10. 予測= mod .predict(X_test)
  11. # スケーリングを元に戻すためのヘルパー関数を呼び出して予測 DF を作成します
  12. original_df = pd .read_csv('D:/Jupyter/dataset/demand-forecasting-kernels-only/train.csv')
  13. unscaled = undo_scaling (予測、X_test、scaler_object)
  14. unscaled_df = predict_df (スケールなし、original_df)
  15. # ヘルパー関数を呼び出してスコアを印刷し、結果をプロットします
  16. get_scores(スケールなし_df、オリジナル_df、モデル名)
  17. plot_results(スケールなしの DF、元の DF、モデル名)
  18.  
  19. # データをトレーニングセットとテストセットに分ける
  20. トレーニング、テスト= tts (model_df)
  21. # 線形回帰のモデルフレームワークを呼び出す
  22. regressive_model(トレーニング、テスト、LinearRegression()、'LinearRegression')
  23. # ランダムフォレスト回帰のモデルフレームワークを呼び出す
  24. 回帰モデル(訓練、テスト、
  25. ランダムフォレスト回帰( n_estimators = 100 ,
  26. 最大深度= 20 )、
  27. 「ランダムフォレスト」
  28. # XGBoost のモデルフレームワークを呼び出す
  29. regressive_model(train, test, XGBRegressor( n_estimators = 100 ,
  30. 学習率= 0.2 )、
  31. 'XGBoost')

以下の出力は、実際の売上 (青) に重ねた各回帰モデルの予測 (赤) を示しています。結果は似ているように見えますが、以下の比較セクションでわかるように、わずかな違いが売上高に数千ドルの差をもたらす可能性があります。

2. 長期短期記憶(LSTM)

LSTM は、連続データを使用して予測を行うのに特に役立つ、リカレント ニューラル ネットワークの一種です。このために、非常に単純な LSTM を使用します。精度を向上させるために、周期的な特徴と追加のモデルの複雑さを追加できます。

  1. lstm_model(train_data, test_data)を定義します。
  2.      
  3. X_train、y_train、X_test、y_test、 scaler_object = scale_data (train_data、test_data)
  4.      
  5. X_train X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
  6. X_test X_test = X_test.reshape(X_test.shape[0], 1, X_test.shape[1])
  7.     
  8. モデル=シーケンシャル()
  9. モデルを追加します(LSTM(4, batch_input_shape =(1, X_train.shape[1], X_train.shape[2]),
  10. ステートフル= True ))
  11. モデルを追加します(密(1))
  12. モデルを追加します(密(1))
  13. model.compile(損失= 'mean_squared_error' オプティマイザー= 'adam' )
  14. model.fit(X_train, y_train,エポック= 200 ,バッチサイズ= 1 ,詳細= 1 ,
  15. シャッフル= False )
  16. 予測= model.predict (X_test、 batch_size = 1 )
  17.      
  18. オリジナルdf =オリジナルdfをロードする()
  19. unscaled = undo_scaling (予測、X_test、scaler_object、 lstm = True )
  20. unscaled_df = predict_df (スケールなし、original_df)
  21.      
  22. get_scores(スケールなし_df、オリジナル_df、'LSTM')
  23.      
  24. plot_results(スケールなしの DF、元の DF、'LSTM')

結果のプロットは上記の 3 つの回帰プロットと似ているため、以下のエラーが表示されるまで結果を比較し続けます。

LSTMモデルの予測と実際の売上

3. 有馬

ARIMA モデルは上記のモデルとは少し異なります。モデルのトレーニングと動的な予測の生成には、statsmodels SARIMAX パッケージを使用します。 SARIMA モデルはいくつかの部分に分かれています。

  • AR: pと表記され、自己回帰モデルである
  • I: dで表される微分項
  • MA: qと表記され、移動平均モデルである。
  • S: 周期的なコンポーネントを追加できます

以下のコードでは、モデルを定義し、過去 12 か月のデータの動的な予測を実行します。標準の非動的予測の場合、翌月の予測は前月の実際の売上を使用して作成されます。対照的に、動的予測では、前月の予測売上を使用して翌月の予測を作成します。

  1. lstm_model(train_data, test_data)を定義します。
  2.      
  3. X_train、y_train、X_test、y_test、 scaler_object = scale_data (train_data、test_data)
  4.      
  5. X_train X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
  6. X_test X_test = X_test.reshape(X_test.shape[0], 1, X_test.shape[1])
  7.     
  8. モデル=シーケンシャル()
  9. モデルを追加します(LSTM(4, batch_input_shape =(1, X_train.shape[1], X_train.shape[2]),
  10. ステートフル= True ))
  11. モデルを追加します(密(1))
  12. モデルを追加します(密(1))
  13. model.compile(損失= 'mean_squared_error' オプティマイザー= 'adam' )
  14. model.fit(X_train, y_train,エポック= 200 ,バッチサイズ= 1 ,詳細= 1 ,
  15. シャッフル= False )
  16. 予測= model.predict (X_test、 batch_size = 1 )
  17.      
  18. オリジナルdf =オリジナルdfをロードする()
  19. unscaled = undo_scaling (予測、X_test、scaler_object、 lstm = True )
  20. unscaled_df = predict_df (スケールなし、original_df)
  21.      
  22. get_scores(スケールなし_df、オリジナル_df、'LSTM')
  23.      
  24. plot_results(スケールなしの DF、元の DF、'LSTM')

繰り返しますが、結果はかなり良好です。以下でさらに詳しく説明します。

ARIMAモデル予測と実際の売上

比較モデル

モデルのパフォーマンスを比較するために、二乗平均平方根誤差 (RMSE) と平均絶対誤差 (MAE) を調べます。これらのメトリックはどちらもモデルのパフォーマンスを比較するためによく使用されますが、その直感と数学的な意味は若干異なります。

  • MAE: 平均絶対誤差は、予測値が実際の値からどれだけ離れているかを示します。この場合、すべてのエラーの重みは同じになります。
  • RMSE: すべての二乗誤差の合計の平方根をとって RMSE を計算します。二乗すると、誤差が大きいほど全体の誤差に大きな影響を与えますが、誤差が小さいと全体の誤差にはあまり影響しません。

上記のヘルパー関数から、get_scores を使用して各モデルの RMSE スコアと MAE スコアを計算します。これらのスコアは辞書に保存され、保管されます。比較のために、辞書を Pandas データフレームに変換し、結果をプロットします。

  1. デフcreate_results_df():
  2. results_dict = pickle .load(open("model_scores.p", "rb"))
  3.      
  4. results_dict.update(pickle.load(open("arima_model_scores.p", "rb")))
  5.      
  6. restults_df = pd .DataFrame.from_dict(results_dict, orient = 'index' ,
  7. = ['RMSE', 'MAE', 'R2'])
  8.      
  9. restults_df restults_df = restults_df.sort_values( by = 'RMSE' ascending = False ).reset_index()
  10.      
  11. 結果を返す_df
  12.  
  13. 結果= create_results_df ()

これにより、次のデータ フレームが生成されます。

上のグラフではモデルの出力は似ているように見えますが、精度は異なることがわかります。以下に、違いを確認するのに役立つ図を示します。

モデルのパフォーマンスの比較

結論は

全体的に見ると、XGBoost モデルのパフォーマンスが最も優れており、ARIMA モデルと LSTM モデルがそれに続いていることがわかります。上記のモデルはすべて、売上予測にどのように使用できるかを示すために、最も基本的な形式で導出されたものであることに注意することが重要です。モデルは複雑さを最小限に抑えるために微調整されただけです。たとえば、LSTM にはパフォーマンスを向上させるために多くの追加ノードとレイヤーを含めることができます。

ユースケースに適したモデルを決定するには、次の点を考慮する必要があります。

  • モデルの複雑さと解釈可能性の度合い。
  • モデルを調整し、定期的な情報、休日、週末などを含むように機能を設計できます。
  • 結果の使用方法と、データを入力してモデルを更新する方法について学習します。
  • データの過剰適合を避けるために、クロス検証または同様の手法を使用してモデルを調整します。

<<:  Natureサブジャーナル:言語だけでなく、機械翻訳は脳波をテキストに「翻訳」することもできる

>>:  人工知能システムが薬剤耐性菌を殺す新しい抗生物質を発見

ブログ    
ブログ    

推薦する

...

人工知能における非構造化データの役割

人工知能 (AI) システムは人間に似た方法でやり取りするため、一部の人は不安に思うかもしれませんが...

ディープラーニングによる時系列モデルの評価

技術概要:今回は主に教師なし特徴学習とディープラーニングの最近の発展と、時系列モデル問題におけるそれ...

ChatGPT と Stack Overflow: どちらの回答がより良いでしょうか?

米国のパデュー大学が最近発表した「誰の回答が優れているか? ChatGPT と Stack Over...

初め!プログラム可能なメモリスタコンピュータが誕生しました!

[[271164]]人類史上初のプログラム可能なメモリスタ コンピュータが誕生しました。音声コマン...

アニメーション + 原理 + コード、トップ 10 の古典的なソート アルゴリズムを解釈する

ソートアルゴリズムは、「データ構造とアルゴリズム」における最も基本的なアルゴリズムの 1 つです。ソ...

医療提供者はなぜインテリジェントオートメーションに投資する必要があるのでしょうか?

インテリジェント オートメーション (IA) は、人工知能とオートメーションを組み合わせたものです。...

Daguan Data: NLP の概要と自動テキスト分類アルゴリズムの詳細な説明

自然言語処理は人工知能の分野で常に重要なトピックであり、2018年も話題となりました。大量のテキスト...

人工知能の時代において、最近熱い議論を呼んだ「996」に別れを告げることができるでしょうか?

[[263744]] 2019年3月27日、有名なコードホスティングプラットフォームGitHub上...

能力と信頼性の両方を備えることはできますか? GPT-4やGeminiなどのマルチモーダルモデルの評価レポートはこちら

2023 年には、マルチモーダル大規模モデルの飛躍的な発展が見られるでしょう。マルチモーダル大規模言...

...

スマートコックピット、進行中のインタラクティブ革命

今日では、スマートカーは都市ネットワークにおける「デジタルノード」となっています。優れた環境認識能力...

ベクトル監視なしのベクトル画像生成アルゴリズムがCVPR 2021に選出

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

基本に立ち返る: 一歩先を行くために読むべき 5 つのデータ サイエンス論文

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...