Usando dados de séries temporais de um sensor para ML

8

Eu tenho os seguintes dados para um pequeno projeto paralelo. É de um acelerômetro sentado em cima de uma lavadora / secadora e eu gostaria que ele me dissesse quando a máquina terminasse.

dados

x são os dados de entrada (movimento x / y / z como um valor), y é o rótulo ativado / desativado

Como os valores de x se sobrepõem para y = 1 e y = 0, eu estava pensando em usar x e uma janela rolante de 3 minutos como entradas para um SVM:

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

dados

Essa é uma boa abordagem para esse tipo de problema? Existem alternativas que podem produzir melhores resultados?

Laktak
fonte
Por uma janela rolante de três minutos, você quer dizer que deseja usar a entrada de uma janela de três minutos time = 1, 2, 3 e depois passar para time = 2, 3, 4 e obter um rótulo 0/1 para off / on para cada janela?
StatsSorceress
@StatsSorceress basicamente sim - Eu estou usando uma janela porque os valores x sobrepõem (atualizado)
laktak

Respostas:

7

Você tem dados de séries temporais que são usados ​​para medir a aceleração. Você deve identificar quando a máquina está em seu estado nominal (DESLIGADO) e estado anômalo (LIGADO). Esse problema seria melhor resolvido usando algoritmos de detecção de anomalias. Mas existem muitas maneiras de abordar esse problema.

Preparando seus dados

Todos os métodos dependerão do método de extração de recurso que você selecionar. Supondo que continuemos a usar a janela de tempo de 3 amostras, conforme sugerido. Neste algoritmo, você calculará uma estatística para esse estado nominaly=0 0. Sugiro a média, como suponho que você já esteja fazendo, calcule a média das três acelerações resultantes da amostra. Você ficará com um grande número de valores em um conjunto de treinamentoS definido como

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

Onde s é a média das amostras de árvore em uma janela. s é definido como

sEu=13k=Eu-2Euxk

Onde x é a sua amostra de observações e Eu2.

Em seguida, colete mais dados, se possível, com a máquina ativa, de modo que y=1.

Agora você pode escolher se deseja treinar seu algoritmo em um conjunto de dados de uma classe (detecção pura de anomlay). Um conjunto de dados tendencioso (detecção de anomalias) ou um conjunto de dados bem equilibrado. O saldo do conjunto de dados é a proporção entre as duas classes no seu conjunto de dados. Um conjunto de dados perfeito para um classificador de 2 classes seria 1: 1. 50% dos dados pertencentes a cada classe. Você parece ter um conjunto de dados tendencioso, supondo que não queira desperdiçar muita eletricidade.

Observe que nada impede que você mantenha as amostras vizinhas divididas como uma instância em seu conjunto de dados. Por exemplo:

xEu xEu-1 xEu-2 | yEu

Isso criaria um espaço de entrada tridimensional para uma saída específica, definida para a amostra coletada atualmente.


Um conjunto de dados tendencioso


Solução Fácil

A maneira mais fácil que eu sugeriria. Suponha que você esteja usando uma única estatística para definir o que está acontecendo na janela de 3 amostras. A partir dos dados coletados, obtenha o máximos dos seus pontos nominais (y=0 0) e o mínimo s dos seus pontos anômalos (y=1) Então pegue a marca intermediária entre esses dois e use-a como seu limite.

Se uma nova amostra de teste s^ for maior que o limite, atribua y=1.

Você pode estender isso calculando a média s para todas as suas amostras nominais y=0 0. Em seguida, calcule a média para suas amostras anômalasy=1. Se uma nova amostra se aproximar da média das amostras anômalas, classifique-a comoy=1.

Mas eu quero ser chique!

Existem várias outras técnicas que você pode usar para executar esta tarefa exata.

  • k-vizinhos mais próximos
  • Redes neurais
  • Regressão linear
  • SVM

Simplificando, quase todos os algoritmos de aprendizado de máquina são adequados para essa finalidade. Depende apenas da quantidade de dados disponíveis e de sua distribuição.


Eu realmente quero usar SVM


Nesse caso, mantenha as três amostras completamente separadas. Sua matriz de treinamento terá 3 colunas, conforme discutido acima. E então você terá suas saídasy. Usar o SVM em python é muito fácil: 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)  

Isso treina seu modelo. Então você desejará prever o resultado para uma nova amostra.

clf.predict([[2., 2., 1]])
JahKnows
fonte
Entre em contato se desejar mais informações sobre coisas específicas.
precisa saber é o seguinte
1
1 para a resposta detalhada - vou testar esta, logo que a máquina de lavar gera mais dados;)
laktak
Existem alternativas para 'Preparando seus dados'? Testei meu método antigo e o seu com 3 e 5 valores de entrada, mas sempre tenho problemas nas 'arestas' quando y muda (como y 1/0/1/0/1 em vez de 1/1/1/1 / 1)
precisa saber é o seguinte
Nas bordas? Não sei se entendi o que você quer dizer. Você pode elaborar por favor?
precisa saber é o seguinte
Por exemplo, quando a máquina é desligada, y pode pular de 1 a 0 e voltar várias vezes. Em vez de um final, eu recebo vários. Estou interessado apenas nos horários de início e de término, talvez haja uma abordagem melhor para isso?
precisa saber é