Menggunakan data deret waktu dari sensor untuk ML

8

Saya memiliki data berikut untuk proyek sampingan kecil. Ini dari accelerometer yang duduk di atas mesin cuci / pengering dan saya ingin memberi tahu saya ketika mesin selesai.

data

x adalah data input (gerakan x / y / z sebagai satu nilai), y adalah label on / off

Karena nilai x tumpang tindih untuk y = 1 dan y = 0, saya berpikir untuk menggunakan x dan jendela 3 menit bergulir sebagai input untuk SVM:

xyz60=res.xyz.resample("60S").max()
X["x"]=xyz60
X["max3"]=xyz60.rolling(window=3, min_periods=1).max()

data

Apakah ini pendekatan yang baik untuk masalah seperti ini? Adakah alternatif yang mungkin menghasilkan hasil yang lebih baik?

laktak
sumber
Dengan jendela bergulir tiga menit, maksud Anda Anda ingin menggunakan input dari waktu jendela tiga menit = 1, 2, 3 dan kemudian pindah ke waktu = 2, 3, 4, dan dapatkan label 0/1 untuk off / on untuk setiap jendela?
StatsSorceress
@StatsSorceress pada dasarnya ya - Saya menggunakan jendela karena nilai x tumpang tindih (diperbarui)
laktak

Jawaban:

7

Anda memiliki data deret waktu yang digunakan untuk mengukur akselerasi. Anda harus mengidentifikasi kapan mesin dalam kondisi nominal (OFF) dan status anomali (ON). Masalah ini akan lebih baik diselesaikan dengan menggunakan algoritma deteksi anomali. Tapi, ada banyak cara yang bisa Anda gunakan untuk mengatasi masalah ini.

Mempersiapkan data Anda

Semua metode akan bergantung pada metode ekstraksi fitur yang Anda pilih. Dengan asumsi kami terus menggunakan jendela 3 sampel waktu seperti yang Anda sarankan. Dalam algoritma ini Anda akan menghitung statistik untuk kondisi nominal ini . Saya akan menyarankan maksud karena saya menganggap Anda sudah melakukan, ambil rata-rata dari tiga sampel percepatan yang dihasilkan. Anda kemudian akan dibiarkan dengan sejumlah besar nilai dalam set pelatihan didefinisikan sebagaiy=0S

S={s0,s1,...,sn}

di mana adalah mean dari sampel pohon di jendela. didefinisikan sebagaiss

ssaya=13k=saya-2sayaxk

di mana adalah observasi sampel Anda dan .xsaya2

Kemudian kumpulkan lebih banyak data jika memungkinkan dengan mesin aktif sehingga .y=1

Sekarang Anda dapat memilih apakah Anda ingin melatih algoritma Anda pada dataset satu kelas (deteksi anomlay murni). Dataset bias (deteksi anomali) atau dataset yang seimbang. Saldo dataset adalah rasio antara dua kelas dalam dataset Anda. Dataset yang sempurna untuk klasifikasi 2 kelas adalah 1: 1. 50% dari data milik masing-masing kelas. Anda tampaknya memiliki dataset yang bias, dengan asumsi Anda tidak ingin membuang banyak listrik.

Perhatikan bahwa tidak ada yang menghentikan Anda dari menjaga sampel tetangga dipecah sebagai contoh dalam dataset Anda. Sebagai contoh:

xsaya xsaya-1 xsaya-2 | ysaya

Ini akan membuat ruang input 3 dimensi untuk output spesifik yang ditentukan untuk sampel yang saat ini diambil.


Dataset yang Bias


Solusi mudah

Cara termudah yang saya sarankan. Asumsikan Anda menggunakan statistik tunggal untuk menentukan apa yang terjadi di seluruh jendela 3 sampel. Dari data yang dikumpulkan dapatkan maksimum dari poin nominal Anda ( ) dan minimum dari poin anomali Anda ( ). Kemudian ambil tanda setengah di antara keduanya dan gunakan itu sebagai ambang Anda.sy=0sy=1

Jika sampel uji baru lebih besar dari ambang maka tetapkan .s^y=1

Anda dapat memperpanjang ini dengan menghitung rata-rata untuk semua sampel nominal Anda . Kemudian hitung rata-rata untuk sampel anomali Anda . Jika sampel baru jatuh lebih dekat ke rata-rata dari sampel anomali kemudian mengklasifikasikannya sebagai .sy=0y=1y=1

Tapi saya ingin menjadi mewah!

Ada sejumlah teknik lain yang dapat Anda gunakan untuk melakukan tugas yang tepat ini.

  • k-Tetangga Terdekat
  • Jaringan Saraf Tiruan
  • Regresi linier
  • SVM

Sederhananya, hampir setiap algoritma pembelajaran mesin sangat cocok untuk tujuan ini. Itu tergantung pada seberapa banyak data tersedia untuk Anda dan distribusinya.


Saya benar-benar ingin menggunakan SVM


Jika demikian, biarkan ketiga sampel tetap terpisah. Matriks pelatihan Anda akan memiliki 3 kolom seperti yang dibahas di atas. Dan kemudian Anda akan memiliki output . Menggunakan SVM dalam python sangat mudah: http://scikit-learn.org/stable/modules/svm.html .y

from sklearn import svm

X = [[0, 0, 0], [1, 1, 1], ..., [1, 0, 1]] 
y = [0, 1, ..., 1]
clf = svm.SVC()
clf.fit(X, y)  

Ini melatih model Anda. Maka Anda akan ingin memprediksi hasil untuk sampel baru.

clf.predict([[2., 2., 1]])
JahKnows
sumber
Beritahu saya jika Anda menginginkan informasi lebih lanjut tentang hal-hal tertentu.
JahKnows
1
+1 untuk jawaban terinci - Saya akan menguji ini segera setelah mesin cuci menghasilkan lebih banyak data;)
laktak
Apakah ada alternatif untuk 'Mempersiapkan data Anda'? Saya telah menguji metode lama saya dan Anda dengan nilai input 3 dan 5 tetapi saya selalu memiliki masalah di 'tepi' ketika y berubah (seperti y 1/0/1/0/1 bukan 1/1/1/1 / 1).
laktak
Di tepi? Saya tidak yakin saya mengerti apa yang Anda maksud. Bisakah Anda menjelaskan lebih lanjut?
JahKnows
Misalnya ketika mesin mati, Anda dapat melompat dari 1 ke 0 dan kembali beberapa kali. Alih-alih satu kali akhir saya mendapatkan beberapa. Saya hanya tertarik pada waktu mulai dan akhir, apakah mungkin ada pendekatan yang lebih baik untuk itu?
laktak