JS時系列予測:最小のフロントエンドのデータ分析

この記事では、ブラウザでデータ分析を行うことがあるのはなぜかを説明します。





ポイントは何ですか?

Reactフロントエンド開発者としての私の仕事では、通常、ダッシュボードやさまざまな種類のデータを扱います。ある時点で、メトリックによる予測を追加する必要がありましたが、チームにはこれを実行できるデータアナリストがいませんでした。





私たちのスタックはReact + Javaです。





問題1

予測するデータが非常に多く、レコードが少ない-数千の可能なデータスライスがありますが、履歴データはほとんどありません。





問題2

バックエンドの人たちはとても忙しいので、彼らは物理的にこのタスクに対処することができませんでした。プロジェクトごとの企業内のJavaインスタンスの制限されたクォータ。すべての専門家は忙しく、調整に時間がかかり、時間がかかり、バックエンドを長時間待つ





そのため、クライアント側で、つまりブラウザで行予測を行うことにしました。私たちはフロントエンド開発者です!





シリーズがまったく予測できることを確認しましょう

これを行うには、データをExcelに移動し、関数の結果を確認しますFORECAST.ETS()



私たちの季節予報はもっともらしいようです。データで適切なものを取得できることを確認したので、予測のためにJS-libを検索できるようになりました。





JSシリーズの予測

フロントで予測を行う(そしてバックエンドの時間を節約する)ことにした場合は、最初から予測を行うのではなく、既成のものを見つける必要があります。





Tensorflow.js RNN , , , . , : 1000+ 40-50 .





ARIMA JS , Nostradamus, -.





:





predict = (
    data,
    a = 0.95,
    b = 0.4,
    g = 0.2,
    p = this.PERIODS_TO_PREDICT,
  ) => {
    const alpha = a;
    const beta = b;
    const gamma = g;

    const predictions = forecast(data, alpha, beta, gamma, this.OBSERVATIONS_PER_SEASON, p);
    return predictions;
  };
      
      



Forecast , p . .





- . , client-side :





  1. , : , “”. , , , , 12 .





  2. 1, - 2 . , 24 (2 ).





  3. , , , , . , (//) . ( ). , , .





  4. , . - , 12 (), , , 24/36/48 .





: , , , (, 2 , 3 , 12), . 3 , - , .





青い線は今年です。 パープルは前のものです。 点線は予報です。
- . - . - .
3つの独立したメトリック(破線)による予測。 青い線は今年です。
( ). - .

-

const adjustParams = (period) => {
      const iter = 10;
      const incr = 1 / iter;
      let bestAlpha = 0.0;
      let bestError = -1;
      let alpha = bestAlpha;
      let bestGamma = 0.0;
      let gamma = bestGamma;
      let bestDelta = 0.0;
      let delta = bestDelta;

      while (alpha < 1) {
        while (gamma < 1) {
          while (delta < 1) {
            const pred = this.predict(data, alpha, delta, gamma, period);
            const error = this.computeMeanSquaredError(data, pred);
            if (error < bestError || bestError === -1) {
              bestAlpha = alpha;
              bestGamma = gamma;
              bestDelta = delta;
              bestError = error;
            }
            delta += incr;
          }
          delta = 0;
          gamma += incr;
        }
        gamma = 0;
        alpha += incr;
      }
      alpha = bestAlpha;
      gamma = bestGamma;
      delta = bestDelta;
      return {
        alpha,
        gamma,
        delta,
        bestError,
      };
    };
      
      



2

Mediumで公開した後 、この問題についてより詳細にアドバイスするようにというリクエストが何人か私に届きました。その結果、サンドボックスリポジトリがあり、そこでどのように機能するかを深く掘り下げることができます。プロジェクトコード






クライアント側でどのようなタスクを解決しましたか?コメントにあなたのストーリーを書いてください!ダニイル・オクロプコフ








All Articles