En utilisant une approche de classification K-NN pour données de séries chronologiques?
-
16-10-2019 - |
Question
I ai un ensemble de données qui contient des données de séries chronologiques du débit d'eau au fil du temps. J'ai un débitmètre relié à un robinet de cuisine, et je suis en train de cluster ou classer les événements d'utilisation de l'eau spécifiques.
Les données sont recueillies à chaque seconde, et dans chaque rangée je donne une valeur pour la quantité de gallons qui coule à travers mon débitmètre.
Par exemple, je suis en train de classer quelqu'un se laver les mains, remplir une théière, la vaisselle, etc ...
Est-ce quelque chose que je peux utiliser un k-NN Classification Approche de regrouper ces événements? Si une approche basée sur le regroupement n'est pas bon, quelle autre méthode de classification serait bon pour ce type de données?
Si je lance quelques expériences, je peux classer chaque événement et la transformer en un problème d'apprentissage supervisé. Mais à l'heure actuelle, aucun des événements d'eau sont classés.
Une version très abrégée de mon apparence ensemble de données comme suit:
EDIT
water = pd.DataFrame(shower1)
rng = pd.date_range('2016-09-01 00:00:00', '2016-09-30 23:59:58', freq='S')
water = water.reindex(rng,fill_value=0.0)
water = water['shower1']
df = pd.DataFrame({'time_stamp':rng,'water_amount':water})
starts = (df['water_amount']>0)&(df['water_amount'].shift(1)==0) #find all starts of events
n_events = sum(starts) #total number of events
df.loc[starts,'event_number'] = range(1,n_events+1) #numerate starts from 1 to n
df['event_number'] = df['event_number'].fillna(method='pad').fillna(-1) #forward fill all the values
df.loc[df['water_amount']==0,'event_number']=-1 #set all event numbers to -1 where the water amount is 0
df.groupby('event_number').agg({'time_stamp':'first',
'water_amount':'sum'}) #feature matrix
La solution
Il semble assez clair de regarder les données lorsque un événement commence et se termine (essentiellement chaque fois qu'il ya une séquence de valeurs positives). Ainsi, au lieu de commencer par quelques modèles compliqués, je vous suggère de calculer quelques caractéristiques simples (comme la longueur de l'événement, la quantité totale d'eau, quantité / secondes, le temps de l'événement précédent, le temps de la journée en quelques secondes du début de l'enregistrement) pour chaque événement, puis essayer un algorithme de regroupement sur de nouvelles données. k-NN pourrait même produire quelque chose de significatif. Mais un résumé statistique des caractéristiques peut vous donner probablement déjà une meilleure idée de la façon d'aborder plus cela.
EDIT1
import pandas as pd
import numpy as np
rng = pd.date_range('2017-01-01 14:00:00', '2017-01-01 14:01:00', freq='S')
water = [0,0,0.2,0.3,0.4,0,0,0.3,0.2,0.5]*6+[0]
df = pd.DataFrame({'time_stamp':rng,'water_amount':water,'event_number':np.zeros(len(water))})
j = 1
for k in range(len(df)):
if df.ix[k,'water_amount']== 0:
df.ix[k,'event_number'] = -1
else:
if df.ix[k-1,'water_amount'] > 0:
df.ix[k,'event_number'] = df.loc[k-1,'event_number']
else:
df.ix[k,'event_number'] = j
j = j+1
df.groupby('event_number').agg({'time_stamp':'first',
'water_amount':'sum'}) #feature matrix
EDIT2
rng = pd.date_range('2017-01-01 14:00:00', '2017-01-01 14:01:00', freq='S')
water = [0,0,0.2,0.3,0.4,0,0,0.3,0.2,0.5]*6+[0]
df = pd.DataFrame({'time_stamp':rng,'water_amount':water})
starts = (df['water_amount']>0)&(df['water_amount'].shift(1)==0) #find all starts of events
n_events = sum(starts) #total number of events
df.loc[starts,'event_number'] = range(1,n_events+1) #numerate starts from 1 to n
df['event_number'] = df['event_number'].fillna(method='pad').fillna(-1) #forward fill all the values
df.loc[df['water_amount']==0,'event_number']=-1 #set all event numbers to -1 where the water amount is 0
df.groupby('event_number').agg({'time_stamp':'first',
'water_amount':'sum'}) #feature matrix
Autres conseils
Ne pas oublier prétraiter vos données.
Par exemple, faire caractéristique extraction n
- quantité totale d'eau
- Durée
- variance