JS Time Series Forecasting : analyse des données pour le plus petit front-end

Dans cet article, je vais expliquer pourquoi il est acceptable de faire parfois des analyses de données dans le navigateur.





À quoi ça sert?

Dans mon travail de développeur React Front-end, je travaille généralement avec des tableaux de bord et divers types de données. À un moment donné, nous avons dû ajouter des prédictions par métriques, et l'équipe n'avait pas d'analystes de données capables de le faire.





Notre pile est React + Java.





Problème 1

Très grande quantité de données à prévoir et peu d'enregistrements - des milliers de tranches de données possibles, mais peu de données historiques.





Problème 2

Les gars du backend sont très occupés, donc ils ne pouvaient physiquement pas faire face à cette tâche. Quota limité d'instances Java dans l'entreprise par projet. Tous les experts sont occupés, il faut beaucoup de temps pour se coordonner, prendre beaucoup de temps, attendre longtemps pour le backend





Par conséquent, nous avons décidé de faire une prédiction de ligne côté client - dans le navigateur. Nous sommes des développeurs front-end !





Vérifions que la série peut être prédite du tout

Pour ce faire, nous allons conduire les données dans Excel et examiner les résultats de la fonction FORECAST.ETS()



. Nos prévisions saisonnières semblent plausibles. Nous avons vérifié qu'il est possible d'obtenir quelque chose d'adéquate sur nos données, nous pouvons donc maintenant rechercher des JS-libs pour des prédictions !





Prédictions de la série JS

Si vous décidez de faire des prédictions en amont (et de gagner du temps pour les backends), alors vous devez trouver quelque chose de tout fait et ne pas faire de prédictions à partir de zéro.





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 , - , .





La ligne bleue est l'année en cours.  Le violet est le précédent.  La ligne pointillée est la prévision.
- . - . - .
Prévision par trois métriques indépendantes (lignes pointillées).  La ligne bleue est l'année en cours.
( ). - .

-

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

Après avoir publié sur  Medium, plusieurs personnes m'ont écrit pour me demander de les conseiller plus en détail à ce sujet, et par conséquent, j'ai un référentiel sandbox dans lequel vous pouvez approfondir son fonctionnement. Code du projet .






Quelles tâches avez-vous résolues côté client ? Écrivez votre histoire dans les commentaires!

Traduit par Daniil Okhlopkov .








All Articles