[PYTHON] [Kaggle] J'ai essayé l'ingénierie de quantité de caractéristiques de données de séries chronologiques multidimensionnelles à l'aide de tsfresh

0. Introduction

Soudainement, les données chronologiques sont difficiles à gérer, n'est-ce pas? De plus, je pense que plus vous avez de variables, plus vous risquez de vous briser le cœur. Mais, "Une fois que vous avez extrait les caractéristiques des données de séries chronologiques, vous pouvez faire autre chose!" Je pense qu'il y a beaucoup de monde.

Cette fois, nous allons introduire ** tsfresh **, une bibliothèque qui semble être utile pour l'ingénierie de la quantité de caractéristiques des données de séries chronologiques multidimensionnelles.

J'ai évoqué l'article suivant.

1. Installez tsfresh

Je l'ai installé via pip. Vous ne pouvez pas installer à partir de pip sans mettre à jour pip, veuillez donc mettre à jour pip.

pip install --upgrade pip

Mettre à niveau le pip avec

pip install tsfresh

Installez tsfresh avec.

pip install pandas==0.21 

Veuillez changer comme.

Voici la version que j'utilise.

2. Préparez des données de pseudo séries chronologiques

Trouver des données de séries chronologiques multidimensionnelles était un problème, nous allons donc cette fois utiliser une pseudo-transformation de l'ensemble de données qui peut être téléchargé à partir de tsfresh. (Si vous disposez déjà de vos propres données, veuillez les ignorer.)

Tout d'abord, je peux saisir la procédure avec ces pseudo données, mais le résultat qui en ressort n'est pas du tout intéressant, donc si vous avez vos propres données, je vous recommande de les utiliser.

UEA & UCR Time Series Classification Repository Il semble y avoir beaucoup de données chronologiques qui semblent intéressantes ...

Commencez par charger les données.

In[1]



import pandas as pd
import numpy as np

from tsfresh.examples.har_dataset import download_har_dataset, load_har_dataset

download_har_dataset()
df = load_har_dataset()
print(df.shape)
df.head()

Si vous cochez avec, vous pouvez voir que ces données ont 7352 points d'échantillonnage et 128 variables (128 dimensions).

Ensuite, découpez seulement 100 points d'échantillonnage et 50 variables.

In[2]


df = df.iloc[0:100, 0:50]
print(df.shape)
df.head()

Cette fois, "Il y a cinq sujets et 10 variables de données chronologiques sont acquises à partir d'un capteur attaché au corps pour classer si les sujets sont des enfants ou des adultes." Imaginez une situation comme celle-ci.

Étant donné que le but de ce temps est de voir à travers le flux de l'ingénierie de la quantité d'entités La correspondance des valeurs est foirée. Bien sûr, il ne peut pas être classé par ces données.

In[3]


# id:5 et 10 variables

#Chacune des 10 variables est attribuée à chaque individu (sujet).
df_s1 = df.iloc[:,0:10].copy()
df_s2 = df.iloc[:,10:20].copy()
df_s3 = df.iloc[:,20:30].copy()
df_s4 = df.iloc[:,30:40].copy()
df_s5 = df.iloc[:,40:50].copy()

#Créez une colonne avec chaque identifiant individuel comme valeur.
df_s1['id'] = 'sub1'
df_s2['id'] = 'sub2'
df_s3['id'] = 'sub3'
df_s4['id'] = 'sub4'
df_s5['id'] = 'sub5'

#Réécrivez le nom de variable de chaque colonne.
columns = ['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x9', 'x10', 'id']
df_s1.columns = columns
df_s2.columns = columns
df_s3.columns = columns
df_s4.columns = columns
df_s5.columns = columns

df_s1.head()

image.png

Il y a 5 trames de données comme celle-ci.

3. Transformez les données de séries chronologiques en une trame de données correspondante

Selon les Documents officiels, ** extract_features () **, qui est la fonction principale de cet article, a un argument. Le format de passage est spécifié. Le type de données est le type d'objet pandas dataframe, mais il existe trois formats.

--Flat DataFrame

Ce qui précède sont les trois types. Cette fois, je vais le formater dans ce premier format.

id	time	x	y
A	t1	x(A, t1)	y(A, t1)
A	t2	x(A, t2)	y(A, t2)
A	t3	x(A, t3)	y(A, t3)
B	t1	x(B, t1)	y(B, t1)
B	t2	x(B, t2)	y(B, t2)
B	t3	x(B, t3)	y(B, t3)

Continuant de plus tôt,

In[4]


df = pd.concat([df_s1, df_s2, df_s3, df_s4, df_s5], axis=0)
print(df['id'].nunique())
df.head()

Comme, une fois connecté,

image.png

Ce sera. Le nombre d'identifiants uniques est de 5, ils sont donc concaténés sans aucun problème.

Vous pouvez maintenant le passer à la fonction extract_features ().

4. Extraire des fonctionnalités avec extract_features ()

Pour la trame de données précédente

In[5]


from tsfresh import extract_features

df_features = extract_features(df, column_id='id')
df_features.head()

Lorsque vous postulez image.png

Le montant de la fonctionnalité est calculé comme ceci. Il existe 754 de ces fonctionnalités pour une variable. Je pense qu'il y en a beaucoup, mais je pense que c'est utile si vous pensez que la difficulté de gérer les données de séries chronologiques est résolue.

Ce que signifie chaque quantité de caractéristiques est La documentation a un aperçu des fonctionnalités extraites (https://tsfresh.readthedocs.io/en/latest/text/list_of_features.html). Il semble que la quantité de caractéristiques (statistiques) qui nécessite des paramètres soit calculée par plusieurs paramètres.

5. Filtrer les fonctionnalités avec select_features ()

Dans la documentation, après avoir extrait les fonctionnalités comme décrit ci-dessus, [Filtrer les fonctionnalités] (https://tsfresh.readthedocs.io/en/latest/text/feature_filtering.html) est recommandé. La fonction de filtrage de ces fonctionnalités est ** select_features () **. Cette fonction utilise un test d'hypothèse statistique pour sélectionner des entités de sorte que seules les entités susceptibles d'avoir une différence statistiquement significative en fonction de cette caractéristique.

avant ça,

In[6]


from tsfresh.utilities.dataframe_functions import impute

df_features = impute(df_features)

Ce faisant, les valeurs ingérables telles que NaN et l'infini sont complétées dans la quantité de caractéristiques obtenue précédemment.

De plus, select_features () réduit les fonctionnalités en fonction de la variable dépendante y, préparez donc les données d'une manière pseudo. Ce y doit être pandas.Series ou numpy.array, comme vous pouvez le voir dans le code source (https://tsfresh.readthedocs.io/en/latest/_modules/tsfresh/feature_selection/selection.html) .. Cette fois,

In[7]


from tsfresh import select_features

X = df_features
y = [0, 0, 0, 1, 1]
y = np.array(y)

Préparez une trame de données X avec des fonctionnalités extraites et un tableau numpy de y alloué de manière appropriée.

Et

In[8]


X_selected = select_features(X, y)
print(X_selected.shape)
X_selected

Quand tu fais

Bien.

image.png

Rien ne sort brillamment. C'est vrai, car les données sont appropriées ... Avec des données appropriées, vous devriez être en mesure de bien sélectionner le montant de la fonction. (Ceux qui pourraient (ou ne pouvaient pas) sélectionner le montant de la fonctionnalité à partir de leurs propres données seraient ravis de pleurer si vous pouviez nous donner un commentaire.)

Bonus. J'ai essayé de compresser dimensionnellement la quantité d'entités par analyse en composantes principales (ACP)

Parce que ça se termine par ça Cette fois, au lieu de sélectionner la quantité de caractéristiques à l'aide du test d'hypothèse statistique, j'ai essayé la compression de dimension avec PCA. C'est comme créer une instance appelée pca, l'ajuster et la transformer à l'aide de cette instance.

In[9]


from sklearn.decomposition import PCA
pca = PCA(n_components=4)
pca.fit(df_features)
X_PCA = pca.transform(df_features)

Lorsqu'il est transformé en bloc de données et affiché,

In[10]


X_PCA = pd.DataFrame( X_PCA )
X_PCA.head()

image.png

Ce sera.

plus loin, Python: Essayez l'analyse des composants principaux (PCA) avec scikit-learn Si vous essayez de trouver le taux de cotisation / taux de cotisation cumulé en vous référant à

In[11]


print('Taux de contribution de chaque dimension: {0}'.format(pca.explained_variance_ratio_))
print('Taux de cotisation cumulé: {0}'.format(sum(pca.explained_variance_ratio_)))

out[11]


Taux de contribution de chaque dimension: [0.30121012 0.28833114 0.22187195 0.1885868 ]
Taux de cotisation cumulé: 0.9999999999999999

Ce sera. peut-être, Il peut être possible de compresser les fonctionnalités avec PCA au lieu de sélectionner les fonctionnalités.

Bien qu'il s'agisse d'un jeu de puissance, si vous utilisez cette série de flux, il semble que vous puissiez échapper aux tracas propres à la série chronologique.

De là [Kaggle] Construction du modèle de base, traitement du pipeline Vous pouvez faire diverses choses comme créer un modèle de base comme celui-ci.

Ensuite, je vais l'essayer avec des données de séries chronologiques multidimensionnelles réelles.

Recommended Posts

[Kaggle] J'ai essayé l'ingénierie de quantité de caractéristiques de données de séries chronologiques multidimensionnelles à l'aide de tsfresh
J'ai essayé d'utiliser l'API de Sakenowa Data Project
Différenciation des données de séries chronologiques (discrètes)
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
[Kaggle] J'ai essayé le sous-échantillonnage en utilisant un apprentissage déséquilibré
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
J'ai essayé l'analyse de séries chronologiques! (Modèle AR)
[Kaggle] J'ai essayé l'apprentissage d'ensemble avec LightGBM
[Pour les débutants] Script dans les 10 lignes (5. Rééchantillonnage des données de séries chronologiques à l'aide de pandas)
J'ai essayé d'effectuer une analyse de cluster de clients à l'aide des données d'achat
Acquisition de données chronologiques (quotidiennes) des cours des actions
Lissage des séries temporelles et des données de forme d'onde 3 méthodes (lissage)
Voir les détails des données de séries chronologiques dans Remotte
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé DBM avec Pylearn 2 en utilisant des données artificielles
[Dernière méthode] Visualisation des données de séries chronologiques et extraction de modèles fréquents à l'aide du profil Pan-Matrix
Détection d'anomalies des données de séries chronologiques par LSTM (Keras)
J'ai essayé de regrouper les données ECG en utilisant la méthode K-Shape
J'ai essayé de lire les données d'un fichier en utilisant Node.js.
J'ai essayé d'utiliser Python (3) au lieu d'un calculateur de fonctions
J'ai essayé d'utiliser paramétré
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser la mimesis
J'ai essayé d'utiliser anytree
J'ai essayé d'utiliser aiomysql
J'ai essayé d'utiliser Summpy
J'ai essayé d'utiliser coturn
J'ai essayé d'utiliser Pipenv
J'ai essayé d'utiliser matplotlib
J'ai essayé d'utiliser "Anvil".
J'ai essayé d'utiliser Hubot
J'ai essayé d'utiliser ESPCN
J'ai essayé d'utiliser openpyxl
J'ai essayé d'utiliser Ipython
J'ai essayé d'utiliser PyCaret
J'ai essayé d'utiliser cron
J'ai essayé d'utiliser face_recognition
J'ai essayé d'utiliser Jupyter
J'ai essayé d'utiliser doctest
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser jinja2
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser la fenêtre de temps
J'ai essayé la même analyse de données avec kaggle notebook (python) et PowerBI en même temps ②
J'ai essayé de comparer la précision des modèles d'apprentissage automatique en utilisant kaggle comme thème.
J'ai essayé la même analyse de données avec kaggle notebook (python) et PowerBI en même temps ①
J'ai essayé de rechercher des vidéos à l'aide de l'API de données Youtube (débutant)
J'ai essayé de refactoriser le modèle CNN de TensorFlow en utilisant TF-Slim
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
Bibliothèque tsfresh qui extrait automatiquement les caractéristiques des données de séries chronologiques
Graphique des données de séries chronologiques en Python à l'aide de pandas et matplotlib
Une histoire de regroupement de données de séries chronologiques d'échange
J'ai essayé la reconnaissance de caractères manuscrits des caractères runiques avec CNN en utilisant Keras
J'ai essayé d'analyser les données scRNA-seq en utilisant l'analyse des données topologiques (TDA)
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc
J'ai essayé d'utiliser des données PDF de soins médicaux en ligne basés sur la propagation d'une nouvelle infection à coronavirus
[J'ai essayé d'utiliser Pythonista 3] Introduction