Se connecter

Informatique

Programmation

Sujet : Analyse de données provenant de capteur
1
createurdechaos
Niveau 10
05 juin 2020 à 11:39:05

Salut, je m'adresse à ceux faisant ou ayant fait de la fouille de données et de l'apprentissage.

J'ai un jeu de données dont les individus sont des mesures d'accélérations (x,y,z) gyromètres (x,y,z) et orientation oculaires sur une personne performant plusieurs activités au cours du temps.

Mon but est de faire un classifieur permettant de reconnaitre l'activité à partir des mesures.

Le pas de mesure est de 20 millisecondes (sur 15 jours, j'ai donc des millions de lignes) et je trouve pas ça pertinent de considérer uniquement une mesure ponctuelle mais plutôt une fenêtre d'un instant t à un autre.

Mais dans ce cas ma question c'est comment je devrais appliquer les méthodes que je connais (composantes principales , KNN, Bayes etc) à des plages de fenêtres (qui ne sont plus des lignes mais des matrices) ?

blackapplex
Niveau 10
05 juin 2020 à 14:11:53

Je peux te proposer une solution, mais il y a plein de façon de faire:
- Si j'ai bien compris, en entrée t'as une fenêtre de N valeurs sur M caractéristiques, en sortie t'as une classe (donc un vecteur de score de dimension K classes et tu prends l'argmax)
- Tu formates bien ces données (vecteur entrée => vecteur sortie), pour chaque entrée/fenêtre (vecteur N*M), t'associes l'activité correspondante (vecteur de dimension K avec 0 sur l'activité non-faite et 1 sur l'activité en cours)
- Tu crées un modèle et ses métaparamètres (5-KNN / SVM / MLP (N*M) => 200 => 200 => K etc.)
- Tu entraines ton modèle à prédire la sortie à partir de l'entrée

Si t'as une convergence/un score plus élevé que le choix aléatoire, c'est qu'à priori t'as des données cohérentes et des labels cohérents. Sinon il faut retravailler tes données.

Ensuite, tu peux effectuer des prétraitements sur tes séries temporelles pour améliorer les performances. Tu peux normaliser les données, utiliser des moyennes glissantes si t'as une forte variance. Tu peux ajouter du bruit pendant l'entrainement pour améliorer la robustesse du modèle, tu peux ajouter la norme des vecteurs à partir des autres données pour pas que le modèle ait à la recalculer lui même si c'est une info utile. Tu peux aussi passer tes données en coordonnées polaires. Si tu penses que l'ACP peut aider, fais en une sur le vecteur principal de N*M et ajoute les premières composantes au features permettant de classifier.

blackapplex
Niveau 10
05 juin 2020 à 14:18:53

Si t'as trop de données pour ta machine, n'utilises qu'une partie dans un premier temps. Sur des séries temporelles tu peux aussi compresser tes données en calculant la moyenne et la variance sur des intervalles. Sur une données x qui a 1 million de valeurs, tu calcules la moyenne et la variance par pas de 1000 avec une taille de 1000 (tu prends 1000 tous les 1000) et ça te donne deux données x.mean et x.var qui feront 2000 valeurs à elles, et tu fais des classifieurs de séries temporelles sur ça.

Il y a surement des méthodes plus élaborées, je suis pas un pro de séries temporelles.

createurdechaos
Niveau 10
05 juin 2020 à 14:41:16

Je te remercie pour cette réponse.

J'avais pensé à la deuxième solution, prendre des fenêtre de temps comme individu et réduire le nombre de données (moyenne et variance comme tu l'as dis), cela me permet aussi de rajouter d'autres caractéristiques: Nombre de "pic" par intervalle, largeur des pics etc mais j'avais peur que faire ça entraine une trop grosse perte d'information

Enfin, là c'est plus spécifique à ce domaine, mais est ce que prendre la norme de l'accélération angulaire et linéaire et ne considérer que celles là (on passe de 6 à 2 caractéristique) c'est quelque chose qui se fait.

Dernière question: Le jeu présente 13 activités différentes dont certaines peuvent intuitivement se rapprocher (jeuxvideo et télévision par exemple). Peut on faire l'hypothèse que certaines activités sont équivalentes ? (quitte à refaire ce classement si il n'est pas bon)

blackapplex
Niveau 10
05 juin 2020 à 15:03:14

J'ai jamais entrainé sur ce domaine en particulier, donc empiriquement je sais pas si prendre que les normes suffisent, je recommande de tenter et de voir. Mais ce qui se fait très souvent, c'est d'ajouter des caractéristiques pour simplifier la tâche à l'algorithme. L'avantage d'ajouter des caractéristiques, c'est que ça ne crée pas de perte d'information, l'inconvénient c'est que ça augmente un peu les traitements.

Tu peux faire toutes les hypothèses que tu veux, mais je ne recommenderai pas d'enlever des informations au niveau des labels. Si tu prends un réseau de neurone à plusieurs couches par exemple, le fait qu'il y ait 50 classes identiques n'est pas très génant puisqu'il fera cette analyse de proximité des classes dans la couche avant la couche de sortie. Evidemment si c'est très proche, il pourra se tromper entre toutes les classes et avoir un score proche de 0, mais ça ne le gènera pas pour apprendre à reconnaitre le comportement. Si tu veux changer des informations, tu peux le faire au niveau des métriques, et considérer qu'une prédiction vers jeuxvidéo et télévision sont identiques, ça évitera que tu vois des mauvais scores pour des choses similaires (mais tu ne sauras pas si ton modèle est capable de différencier jeuxvidéo et télévision, donc si c'est ça qui t'intéresses c'est dommage).

Eventuellement sur le vecteur de sortie, plutôt que d'avoir des 1 et des 0, tu peux mettre 0.5 à télévison quand t'as 1 à jeuxvidéo et 0.5 à jv quand t'as 1 à tv. Je doute que ça affecte massivement les scores.

Ce que tu peux faire c'est analyser ta matrice de confusion sur les classes de sorties, tu verras bien où sont les erreurs du modèle. Notamment si t'as une erreur à un endroit inattendu ça peut valoir le coup de reregarder tes données d'origine pour voir si tes prétraitements ont pas supprimé une information importante (une moyenne + variance sur une plage de données peuvent supprimer une information de hausse-baisse cyclique sur un faible intervalle, typiquement si je cours à chaque pas que je pose ça fait un cycle). Et si c'est le cas, il faut rajouter un prétraitement qui détecte cette information.

godrik
Niveau 22
05 juin 2020 à 15:45:28

j'ai des collegues qui ont fait des trucs comme ca. souvent random forest est l'algo qui marchait le mieux pour eux.

En general un preprocessing intelligent des donnee etait plus important que l'algo de learning en lui meme.

futurmononoke
Niveau 10
05 juin 2020 à 16:27:39

Ce topic tombe bien j'ai une question, pour ce genre de cas où les données se font sur des intervalles (de temps etc) peut on envisager de subdiviser le dataset en intervalles (5 secondes par exemple) et de faire de la reconnaissance d'image sur les courbes ?

blackapplex
Niveau 10
05 juin 2020 à 18:14:25

Le 05 juin 2020 à 16:27:39 futurmononoke a écrit :
Ce topic tombe bien j'ai une question, pour ce genre de cas où les données se font sur des intervalles (de temps etc) peut on envisager de subdiviser le dataset en intervalles (5 secondes par exemple) et de faire de la reconnaissance d'image sur les courbes ?

Transformer tes courbes en image? Tu peux l'envisager. Je sais pas ce que ça peut donner. Concrètement ça revient à transformer un x en fonction du temps (un vecteur de dimension N pour 5 secondes) en une image (une matrice de (N*n) * (M*m)), avec M l'amplitude regardée et n et m les résolutions d'analyse. En gros tu discrétises l'amplitude.

C'est un preprocessing, c'est à tester, le succès dépend des données. Si ton x peut aller de -1000 à 1000 et que tu veux analyser des variations de 0.1, tu vas avoir des microvariations que tu peux traiter avec un preprocessing efficace sur une série temporelle mais que tu sauras pas voir sur l'image que tu génères. Un algorithme qui traite directement la valeur il peut s'en foutre que tu ailles de -1milliards à +1milliard à un moment et que tu ailles de -5 à +5 à un autre, typiquement les random forests dont parlait godrik c'est des grosses machines à mettre des seuils partout et à prendre des décisions, donc ils peuvent générer deux systèmes pour deux amplitudes différentes là où un réseau de convolution sur des images ne sera qu'un système.
Faudrait faire un réseau pour une grosse amplitude, un autre pour une petite, ou alors faudrait rajouter l'amplitude comme paramètre du MLP de la couche finale. C'est de la rustine j'ai le sentiment que ce sera pas un preprocessing très efficace. Vaut mieux utiliser des CNN 1D ou des RNN, ou juste des modèles plus classiques.

godrik
Niveau 22
05 juin 2020 à 18:48:49

Regarde le SOA sur les questions de reconnaissance de gesture a partir de wiimote ou a partir de capteur de smart watch. Il y a plein de travail sur la reconnaissance de condition medical a partir de ECG, EEG, etc.

@blackapplex,
de memoire, les gens qui font ce genre de chose n'ont pas assez de donnee pour entrainer un reseau de neuronnes. Les gens que je connais qui faisaient ca avait peut etre de l'ordre de 100 echantilons par mouvement qu'ils essayent de reconnaitre. Et ils disaient que CNN ne marchait pas a cause de ca. Apres j'imagine que ca depend de ton cas d'application precis, et perso j'y connais rien.

blackapplex
Niveau 10
05 juin 2020 à 20:23:35

@godrik
Il a dit qu'il avait un pas de 20 millisecondes sur 15 jours et des millions de lignes donc c'est peut-être applicable. Après même si ça marche, entre les CNN, les Random Forest, SVM, RNN, un bon préprocessing etc.. c'est difficile de savoir ce qui va le mieux marcher sans avoir les données, sans avoir déjà expérimenté et sans tester.
A la fin de mon cours sur la fouille de données, la seule critique que j'avais à faire à mon prof c'est qu'on connaissait plein de modèles et de traitement des données mais qu'il ne nous avait pas appris lesquels marchaient le mieux selon les données. Et à l'usage je le comprends, oui les CNN sont efficaces sur l'image mais sur des données plus numériques il y a pas vraiment de règles en fait.

Random forest ça fait en général bien le taffe, mais les réseaux sont utiles quand t'as des millions de données donc un simple CNN 1D ici peut aussi être intéressant.

blackapplex
Niveau 10
05 juin 2020 à 22:59:20

D'ailleurs un détail, si sur les données tu enregistres 15 jours h24, il faudra peut-être faire du rééchantillonnage sinon il suffit qu'un système dise que tu dormes h24 pour avoir 30% de succès.
Et d'ailleurs, en plus des informations de séries temporelles, il vaudra aussi mieux injecter l'heure et la minute si tu les as, voir même le jour de la semaine (gaffe au surapprentissage quand même)

createurdechaos
Niveau 10
07 juin 2020 à 12:59:26

Le 05 juin 2020 à 22:59:20 blackapplex a écrit :
D'ailleurs un détail, si sur les données tu enregistres 15 jours h24, il faudra peut-être faire du rééchantillonnage sinon il suffit qu'un système dise que tu dormes h24 pour avoir 30% de succès.
Et d'ailleurs, en plus des informations de séries temporelles, il vaudra aussi mieux injecter l'heure et la minute si tu les as, voir même le jour de la semaine (gaffe au surapprentissage quand même)

L'heure étant très dépendant de expérimentateur je ne savais pas si c'était une bonne idée. En regardant la littérature liée au jeu de données je ne sais pas si elle est significative et j'ai peur que ça rajoute un fort biais vis à vis des données d'apprentissage.

Pour échantillonnage ça va, les lunettes n'ont été porté que quelques heures durant chaque journées. Je suis à 3 millions de lignes, et on passe à 10-1 00 milles lignes après découpage en fenêtres.

J'ai essayé un KNN, en traçant la courbe de précision j'obtiens un maximum de 70% pour 10 nombres de voisins ce qui est pas satisfaisant pour moi. Il faudrait que je revois la sélection des variables ou que je regarde avec un autre classifieur si ce n'est pas du au fait que le data set présente des classes équivalentes (video game et TV par exemple).

createurdechaos
Niveau 10
07 juin 2020 à 13:05:30

J'ai pris une autre liberté vis à vis du dset, le fichier original présente l'activité "At home" en plus des autres qui chevauchent temporellement toute les activité que l'on pratique à la maison, je ne l'ai pas prise en compte. L'activité "Eat" se fait systématiquement en même temps qu'une autre activité sédentaire (même date même instant et même valeur de capteur que l'activité parallèle), là aussi je ne l'ai pas prise en compte.

1
Sujet : Analyse de données provenant de capteur
   Retour haut de page
Consulter la version web de cette page