Sử dụng dữ liệu chuỗi thời gian từ một cảm biến cho ML


8

Tôi có dữ liệu sau đây cho một dự án phụ nhỏ. Đó là từ một gia tốc kế ngồi trên máy giặt / máy sấy và tôi muốn nó nói cho tôi biết khi nào máy hoàn thành.

dữ liệu

x là dữ liệu đầu vào (chuyển động x / y / z là một giá trị), y là bật / tắt nhãn

Vì các giá trị x trùng nhau cho y = 1 và y = 0, tôi đã nghĩ đến việc sử dụng x và cửa sổ 3 phút lăn làm đầu vào cho một SVM:

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

dữ liệu

Đây có phải là một cách tiếp cận tốt cho loại vấn đề này? Có những lựa chọn thay thế có thể tạo ra kết quả tốt hơn?


Bằng một cửa sổ ba phút, bạn có nghĩa là bạn muốn sử dụng đầu vào từ thời gian cửa sổ ba phút = 1, 2, 3 và sau đó chuyển sang thời gian = 2, 3, 4 và nhận nhãn 0/1 cho tắt / bật cho mỗi cửa sổ?
Số liệu thống kê

@StatsSorceress về cơ bản là có - Tôi đang sử dụng một cửa sổ vì các giá trị x chồng chéo (cập nhật)
laktak

Câu trả lời:


7

Bạn có dữ liệu chuỗi thời gian được sử dụng để đo gia tốc. Bạn cần xác định khi máy ở trạng thái danh nghĩa (TẮT) và trạng thái dị thường (BẬT). Vấn đề này sẽ được giải quyết tốt nhất bằng cách sử dụng các thuật toán phát hiện bất thường. Nhưng, có rất nhiều cách để bạn có thể tiếp cận vấn đề này.

Chuẩn bị dữ liệu cho bạn

Tất cả các phương pháp sẽ dựa vào phương pháp trích xuất tính năng bạn chọn. Giả sử chúng tôi tiếp tục sử dụng 3 cửa sổ thời gian mẫu như bạn đề xuất. Trong thuật toán này, bạn sẽ tính toán một thống kê cho trạng thái danh nghĩa này . Tôi sẽ đề xuất ý nghĩa như tôi giả sử bạn đang làm, lấy trung bình của ba gia tốc kết quả mẫu. Sau đó, bạn sẽ được để lại một số lượng lớn các giá trị trong tập huấn luyện được xác định lày= =0S

S= ={S0,S1,...,Sn}

Trong đó là giá trị trung bình của các mẫu cây trong cửa sổ. được định nghĩa làSS

STôi= =13Σk= =Tôi-2Tôixk

Trong đó là các quan sát mẫu của bạn và .xTôi2

Sau đó thu thập thêm dữ liệu nếu có thể với máy hoạt động sao cho .y= =1

Bây giờ bạn có thể chọn nếu bạn muốn đào tạo thuật toán của mình trên bộ dữ liệu một lớp (phát hiện anomlay thuần túy). Một bộ dữ liệu thiên vị (phát hiện bất thường) hoặc một bộ dữ liệu cân bằng. Số dư của tập dữ liệu là tỷ lệ giữa hai lớp trong tập dữ liệu của bạn. Một bộ dữ liệu hoàn hảo cho phân loại 2 lớp sẽ là 1: 1. 50% dữ liệu thuộc về mỗi lớp. Bạn dường như có một bộ dữ liệu thiên vị, giả sử bạn không muốn lãng phí nhiều điện.

Xin lưu ý rằng không có gì ngăn bạn giữ các mẫu lân cận được phân tách làm ví dụ trong tập dữ liệu của bạn. Ví dụ:

xTôi xTôi-1 xTôi-2 | yTôi

Điều này sẽ tạo không gian đầu vào 3 chiều cho một đầu ra cụ thể được xác định cho mẫu hiện được lấy.


Một bộ dữ liệu thiên vị


Giải pháp dễ dàng

Cách dễ nhất mà tôi muốn đề xuất. Giả sử bạn đang sử dụng một thống kê duy nhất để xác định những gì đang xảy ra trong suốt 3 cửa sổ mẫu. Từ dữ liệu thu thập được, lấy tối đa của điểm danh nghĩa của bạn ( ) và tối thiểu của điểm bất thường ( ). Sau đó lấy dấu nửa chừng giữa hai cái này và sử dụng nó làm ngưỡng của bạn.Sy= =0Sy= =1

Nếu một mẫu thử nghiệm mới lớn hơn ngưỡng thì gán .S^y= =1

Bạn có thể mở rộng điều này bằng cách tính trung bình cho tất cả các mẫu danh nghĩa của bạn . Sau đó tính giá trị trung bình cho các mẫu dị thường của bạn . Nếu một mẫu mới rơi gần với giá trị trung bình của các mẫu dị thường thì phân loại nó là .Sy= =0y= =1y= =1

Nhưng tôi muốn có được ưa thích!

Có một số kỹ thuật khác bạn có thể sử dụng để thực hiện nhiệm vụ chính xác này.

  • Hàng xóm gần nhất
  • Mạng lưới thần kinh
  • Hồi quy tuyến tính
  • SVM

Nói một cách đơn giản, hầu như mọi thuật toán học máy đều phù hợp với mục đích này. Nó chỉ phụ thuộc vào lượng dữ liệu có sẵn cho bạn và phân phối của nó.


Tôi thực sự muốn sử dụng SVM


Nếu đây là trường hợp giữ ba mẫu hoàn toàn tách biệt. Ma trận đào tạo của bạn sẽ có 3 cột như đã thảo luận ở trên. Và sau đó bạn sẽ có đầu ra của bạn . Sử dụng SVM trong python rất dễ dàng: http://scikit-learn.org/urdy/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)  

Điều này đào tạo mô hình của bạn. Sau đó, bạn sẽ muốn dự đoán kết quả cho một mẫu mới.

clf.predict([[2., 2., 1]])

Hãy cho tôi biết nếu bạn muốn biết thêm thông tin về những điều cụ thể.
JahKnows

1
+1 cho câu trả lời chi tiết - Tôi sẽ kiểm tra điều này ngay khi máy giặt tạo ra nhiều dữ liệu hơn;)
laktak

Có sự thay thế nào cho 'Chuẩn bị dữ liệu của bạn' không? Tôi đã thử nghiệm phương thức cũ của tôi và của bạn với 3 và 5 giá trị đầu vào nhưng tôi luôn gặp sự cố ở 'cạnh' khi y thay đổi (như y 1/0/1/0/1 thay vì 1/1/1/1 / 1).
laktak

Ở các cạnh? Tôi không chắc tôi hiểu ý của bạn. Bạn có thể giải thích?
JahKnows

Ví dụ: khi máy tắt, y có thể nhảy từ 1 đến 0 và quay lại nhiều lần. Thay vì một lần kết thúc, tôi nhận được một số. Tôi chỉ quan tâm đến thời gian bắt đầu và kết thúc, có lẽ có một cách tiếp cận tốt hơn cho điều đó?
laktak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.