Pemecahan Masalah Nilai Yang Hilang Secara Real-time Menggunakan AI - CRUDPRO

Pemecahan Masalah Nilai Yang Hilang Secara Real-time Menggunakan AI

Seperti yang Anda ketahui, dunia nyata sama sekali tidak sempurna, dan sebagai akibat dari ketidaksempurnaannya, datasets seringkali tidak lengkap. datasets dengan nilai yang hilang, jenis yang tidak cocok, dan kekurangan lainnya. Nilai yang hilang sering kali perlu dipelajari dengan machine learning agar modelnya cocok dengan benar dan dapat diprediksi.

Data yang hilang dapat menyebabkan representasi sistem yang tidak lengkap untuk beberapa waktu. Hal ini dapat disebabkan oleh malfungsi sensor, kesalahan jaringan, atau bidang data opsional. Jika Anda menggunakan data ini untuk membuat prediksi real-time, salah menafsirkan data yang hilang dapat berakibat fatal. Bayangkan sebuah mobil self-driving, sistem pemanas, atau banyak perangkat pintar dan terhubung lainnya.

Proses penanganan nilai yang hilang dalam datasets statis adalah proses yang terdokumentasi dengan baik. Terkadang Anda hanya menghapus data, tetapi terkadang Anda memiliki data lain yang terkait dengan satu baris data tersebut dan Anda ingin menyimpan dan menggunakannya. Yang terakhir disebut mengganti nilai data yang hilang. Dalam kebanyakan kasus, Anda dapat menggunakan metode dari library Python seperti pandas, scikit-learn, dan tensorflow untuk mengonversi nilai yang hilang ke nilai lain. Metode yang paling umum digunakan adalah statistik karena mudah dan efektif untuk menghitung. Ini bisa berarti, median, modus, atau hanya konstanta. Yang penting nilai yang Anda masukkan tidak banyak mengubah data dan tidak mempengaruhi output. Menggunakan datasets yang diketahui membuat ini mudah jika batas masalah atau diketahui, tetapi bagaimana jika batas masalah terus berubah atau tidak diketahui?

Saat bekerja dengan sistem ML pembelajaran online yang diperbarui secara real time, menetapkan nilai tidak semudah dengan datasets statis. Misalnya, apakah datanya hanyut dan distribusi datanya berubah? Apakah Anda menggunakan windows? Jika demikian, seberapa besar itu? Bagaimana Anda memperbarui nilai dan mencatat perubahan?

Hal-hal dapat menjadi sangat kompleks dan dapat digunakan untuk penetapan nilai yang hilang dalam flow data, seperti penetapan nilai yang hilang secara online menggunakan koefisien Gaussian, deteksi titik perubahan, dan investigasi penetapan nilai yang hilang secara online dalam flow data transien. Ada banyak makalah terbaru tentang itu . Tapi mari kita masuki ini dengan melihat contoh yang lebih sederhana dan tidak alami. Contoh ini menggunakan pendekatan rata-rata bergerak untuk menggantikan nilai yang hilang. Untuk melakukan ini, ia menggunakan Bytewax, pemroses flow stateful asli Python, sehingga Anda dapat memanfaatkan beberapa library biasa seperti Numpy.

Pengaturan Environtment

Mari kita mulai dengan menginstal Bytewax dan Numpy di Environtment Anda.

pip install bytewax numpy

Menulis kode

Bytewax didasarkan pada konsep flow data. flow data terdiri dari sekumpulan operator yang berinteraksi dengan data "mengalir". Jika Anda ingin mendapatkan pemahaman yang lebih baik, kami sarankan untuk memeriksa dokumentasi. Sekarang mari kita mulai dengan membuat file Python bernama missing_vals.py yang menulis flow data. Kode terdiri dari tiga bagian utama, memanfaatkan operator Bytewax dan mekanisme input.

  1. Mekanisme masukan flow data.
  2. Fungsi Stateful Map yang dapat digunakan untuk menyimpan windows dan menghitung rata-rata
  3. Mekanisme output data yang diperbarui

Inputkan Code

Untuk input, buat flow titik data random melalui fungsi generator yang dapat dipanggil di awal proses Bytewax. Blok kode berikut juga berisi import jika Anda mengikuti cuplikan kode dan memindahkannya ke file lain.

import random
import numpy as np
from bytewax import Dataflow, inputs, parse, run_cluster
def random_datapoints():
    for epoch in range(100):
        if epoch % 5 == 0:
            yield f'data', np.nan
        else:
            yield f'data', random.randrange(0, 10)

Generator input di atas akan menghasilkan nilai nan numpynan untuk setiap item kelima dalam loop. Jika tidak, bilangan bulat dari 0 hingga 10 akan dihasilkan.

Code Stateful Map

Sebelum masuk ke kode Anda, penting untuk memahami operator Stateful Map. Stateful Map adalah konversi satu-ke-satu dari nilai dalam pasangan (key, value), tetapi Anda dapat melihat status persisten dari setiap kunci saat Anda melakukan konversi. Operator Stateful Map memiliki dua bagian: fungsi pembangun dan fungsi mapper peta. Fungsi pembangun dipanggil untuk setiap key baru dan pembuat peta dipanggil untuk setiap titik data baru. Ada penjelasan bagus di dokumen API untuk detail lebih lanjut tentang cara kerjanya.

flow = Dataflow()
flow.stateful_map(lambda key: builder_function, updater_function)

Dalam contoh ini, hanya ada satu flow data, jadi dalam hal ini kuncinya akan sama untuk seluruh flow. Jadi, di bawah ini, saya telah menulis beberapa kode yang membuat objek WindowedArray dengan fungsi pembangun dan menetapkan rata-rata menggunakan fungsi pembaruan.

class WindowedArray:
    """Windowed Numpy Array.
    Create a numpy array to run windowed statistics on.
    """
    def __init__(self, window_size):
        self.last_n = np.empty(0, dtype=object)
        self.n = window_size
    def _push(self, value):
        self.last_n = np.insert(self.last_n, 0, value)
        try:
            self.last_n = np.delete(self.last_n, self.n)
        except IndexError:
            pass
    def impute_value(self, value):
        self._push(value)
        if np.isnan(value):
            new_value = np.nanmean(self.last_n)
        else:
            new_value = value
        return self, (value, new_value)

Mari kita bedah kode di atas. Ketika kelas WindowedArray diinisialisasi, itu membuat array Numpy kosong dengan dtype objek. Ini memungkinkan Anda untuk menambahkan bilangan bulat dan nilai Nan. Untuk setiap titik data baru yang diterima, instruksikan operator Stateful Map untuk memeriksa apakah nilainya nan dan gunakan metode impute_value untuk menghitung rata-rata. Itu juga menambahkan nilai ke jendela (last_n).

Kode output

Selanjutnya adalah mekanisme output. Ini digunakan melalui operator penangkapan di library Bytewax. Tidak canggih, hanya mengeluarkan data dan nilai input sesuai kebutuhan.

def inspector(epoch, data):
    metric, (value, imputed) = data
    print(f"data: {value}, imputed value if required {imputed}")

Kode flow data

Kemudian bangun flow data menggunakan operator dan fungsi yang didefinisikan di atas. Kode berikut membuat objek flow data, menambahkan operator dan fungsinya masing-masing, lalu membuat cluster yang berisi input untuk menentukan kode yang memproses data.

flow = Dataflow()
# ("metric", value)
flow.stateful_map(lambda key: Windowed_Array(10), Windowed_Array.impute_value)
# ("metric", (old value, new value))
flow.capture()
if __name__ == "__main__":
    for epoch, item in run_cluster(
        flow, inputs.fully_ordered(random_datapoints()),
        **parse.cluster_args()):
        inspector(epoch, item)

itu dia! Untuk menjalankan kode, jalankan saja kode di mesin Anda seperti file Python biasa.

~ python missing_vals.py

Apakah Anda bekerja dengan data streaming seperti Bytewax? Kunjungi halaman GitHub proyek Anda untuk lebih banyak contoh.