Pada artikel ini, saya akan menjelaskan mengapa terkadang melakukan analisis data di browser boleh saja.
Apa gunanya?
Dalam pekerjaan saya sebagai pengembang React Front-end, saya biasanya bekerja dengan dashboard dan berbagai macam data. Pada titik tertentu, kami perlu menambahkan prediksi berdasarkan metrik, dan tim tidak memiliki analis data yang dapat melakukan ini.
Tumpukan kami adalah React + Java.
Soal 1
Jumlah data yang sangat besar untuk diprediksi dan sedikit catatan - ribuan kemungkinan irisan data, tetapi sedikit data historis.
Soal 2
Orang-orang backend sangat sibuk, sehingga mereka secara fisik tidak dapat mengatasi tugas ini. Kuota terbatas instance Java di perusahaan per proyek. Semua ahli sibuk, butuh waktu lama untuk berkoordinasi, butuh waktu lama, tunggu lama untuk backend
Oleh karena itu, kami memutuskan untuk melakukan prediksi baris di sisi klien - di browser. Kami adalah pengembang front-end!
Mari kita periksa apakah seri itu bisa diprediksi sama sekali
Untuk melakukan ini, kami akan mengarahkan data ke Excel dan melihat hasil fungsi FORECAST.ETS()
. Prakiraan musiman kami terlihat masuk akal. Kami telah memverifikasi bahwa mungkin untuk mendapatkan sesuatu yang memadai pada data kami, jadi kami sekarang dapat mencari JS-libs untuk prediksi!
Prediksi Seri JS
Jika Anda memutuskan untuk membuat prediksi di depan (dan menghemat waktu backend), maka Anda perlu menemukan sesuatu yang sudah jadi, dan tidak membuat prediksi dari awal.
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 :
, : , “”. , , , , 12 .
1, - 2 . , 24 (2 ).
, , , , . , (//) . ( ). , , .
, . - , 12 (), , , 24/36/48 .
: , , , (, 2 , 3 , 12), . 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
Setelah menerbitkan di Medium, beberapa orang menulis kepada saya dengan permintaan untuk memberi tahu mereka secara lebih rinci tentang masalah ini, dan sebagai hasilnya, saya memiliki repositori kotak pasir tempat Anda dapat menggali lebih dalam tentang cara kerjanya. Kode proyek .
Tugas apa yang Anda selesaikan di sisi klien? Tulis ceritamu di komentar!
Diterjemahkan oleh Daniil Okhlopkov .