Utilisation des données de séries temporelles d'un capteur pour ML

8

J'ai les données suivantes pour un petit projet parallèle. Cela vient d'un accéléromètre posé sur une laveuse / sécheuse et j'aimerais qu'il me dise quand la machine est terminée.

Les données

x est les données d'entrée (mouvement x / y / z comme une valeur), y est l'étiquette activée / désactivée

Parce que les valeurs de x se chevauchent pour y = 1 et y = 0, je pensais utiliser x et une fenêtre mobile de 3 minutes comme entrées pour un SVM:

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

Les données

Est-ce une bonne approche pour ce genre de problème? Existe-t-il des alternatives qui pourraient produire de meilleurs résultats?

laktak
la source
Par une fenêtre déroulante de trois minutes, voulez-vous dire que vous souhaitez utiliser la saisie à partir d'une fenêtre de trois minutes time = 1, 2, 3 puis passer à time = 2, 3, 4 et obtenir une étiquette 0/1 pour off / on pour chaque fenêtre?
StatsSorceress
@StatsSorceress fondamentalement oui - j'utilise une fenêtre car les valeurs x se chevauchent (mise à jour)
laktak

Réponses:

7

Vous disposez de données de séries chronologiques qui sont utilisées pour mesurer l'accélération. Vous devez identifier lorsque la machine est dans son état nominal (OFF) et son état anormal (ON). Ce problème serait mieux résolu en utilisant des algorithmes de détection d'anomalies. Mais, il y a tellement de façons que vous pouvez aborder ce problème.

Préparer vos données

Toutes les méthodes reposeront sur la méthode d'extraction d'entités que vous sélectionnez. En supposant que nous continuons à utiliser la fenêtre de temps de 3 échantillons comme vous l'avez suggéré. Dans cet algorithme, vous calculerez une statistique pour cet état nominaly=0. Je suggérerais la moyenne, comme je suppose que vous le faites déjà, de prendre la moyenne des trois accélérations résultantes de l'échantillon. Vous serez alors laissé avec un grand nombre de valeurs dans un ensemble d'entraînementS défini comme

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

s est la moyenne des échantillons d'arbres dans une fenêtre. s est défini comme

sje=13k=je-2jeXk

X est votre échantillon d'observations et je2.

Collectez ensuite plus de données si cela est possible avec la machine active de telle sorte que y=1.

Vous pouvez maintenant choisir si vous souhaitez former votre algorithme sur un ensemble de données à une classe (détection d'anomlay pur). Un ensemble de données biaisé (détection d'anomalies) ou un ensemble de données bien équilibré. L'équilibre de l'ensemble de données est le rapport entre les deux classes de votre ensemble de données. Un ensemble de données parfait pour un classificateur à 2 classes serait 1: 1. 50% des données appartenant à chaque classe. Vous semblez avoir un ensemble de données biaisé, en supposant que vous ne voulez pas gaspiller beaucoup d'électricité.

Notez que rien ne vous empêche de conserver les échantillons voisins divisés en tant qu'instance dans votre jeu de données. Par exemple:

Xje Xje-1 Xje-2 | yje

Cela créerait un espace d'entrée en trois dimensions pour une sortie spécifique qui est définie pour l'échantillon actuellement prélevé.


Un ensemble de données biaisé


Solution facile

La façon la plus simple que je suggérerais. Supposons que vous utilisez une seule statistique pour définir ce qui se passe dans la fenêtre d'exemple 3. À partir des données collectées, obtenez le maximums de vos points nominaux (y=0) et le minimum s de vos points anormaux (y=1). Ensuite, prenez la marque à mi-chemin entre ces deux et utilisez-la comme seuil.

Si un nouvel échantillon de test s^ est supérieur au seuil, puis attribuez y=1.

Vous pouvez étendre cela en calculant la moyenne s pour tous vos échantillons nominaux y=0. Calculez ensuite la moyenne de vos échantillons anormauxy=1. Si un nouvel échantillon se rapproche de la moyenne des échantillons anormaux, classifiez-le commey=1.

Mais je veux devenir chic!

Il existe un certain nombre d'autres techniques que vous pouvez utiliser pour effectuer cette tâche exacte.

  • k-voisins les plus proches
  • Les réseaux de neurones
  • Régression linéaire
  • SVM

Autrement dit, presque tous les algorithmes d'apprentissage automatique sont bien adaptés à cette fin. Cela dépend simplement de la quantité de données dont vous disposez et de sa distribution.


Je veux vraiment utiliser SVM


Si tel est le cas, gardez les trois échantillons complètement séparés. Votre matrice de formation comportera 3 colonnes, comme indiqué ci-dessus. Et puis vous aurez vos sortiesy. L'utilisation de SVM en python est très simple: http://scikit-learn.org/stable/modules/svm.html .

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)  

Cela forme votre modèle. Ensuite, vous voudrez prédire le résultat pour un nouvel échantillon.

clf.predict([[2., 2., 1]])
JahKnows
la source
Faites-moi savoir si vous voulez plus d'informations sur des choses spécifiques.
JahKnows
1
+1 pour la réponse détaillée - Je vais tester cela dès que la machine à laver génère plus de données;)
laktak
Existe-t-il des alternatives à la «préparation de vos données»? J'ai testé mon ancienne méthode et la vôtre avec 3 et 5 valeurs d'entrée mais j'ai toujours des problèmes sur les 'bords' quand y change (comme y 1/0/1/0/1 au lieu de 1/1/1/1 / 1).
laktak
Aux bords? Je ne suis pas sûr de comprendre ce que tu veux dire. Pouvez-vous élaborer s'il vous plaît?
JahKnows
Par exemple, lorsque la machine s'éteint, y peut passer de 1 à 0 et revenir plusieurs fois. Au lieu d'une heure de fin, j'en ai plusieurs. Je ne suis intéressé que par les heures de début et de fin, y a-t-il peut-être une meilleure approche pour cela?
laktak