[PYTHON] Procédure d'apprentissage automatique de base: ② Préparer les données

introduction

La dernière fois, dans Procédure d'apprentissage automatique de base: ① Modèle de classification, j'ai organisé la procédure de création d'un modèle de classification vraiment basique. Cependant, le lieu de préparation des données était cassé. Donc, cette fois, je voudrais organiser la procédure pour créer le tableau suivant à l'aide de BigQuery et l'importer dans l'environnement Python.

id result product1 product2 product3 product4 product5
001 1 2500 1200 1890 530 null
002 0 750 3300 null 1250 2000

Environnement analytique

Google BigQuery Google Colaboratory

Données cibles

Les données d'achat sont stockées dans la structure de tableau ci-dessous.

id Nom du magasin Date d'achat Biens achetés Prix d'achat Nombre d'achats
001 〇〇 magasin 2020-01-10 product1 2500 1
002 ☓☓ magasin 2020-01-10 product1 750 3
002 ☓☓ magasin 2020-01-10 product2 1000 2

Le nom de la table est le suivant sur le BQ. (Divisé en tables par jour) myproject.mydataset.transaction_ date

Malheureusement, les noms d'éléments ne peuvent pas être donnés en japonais, mais par souci de clarté, ils sont ici en japonais. Veuillez changer le nom en fonction de chaque environnement.

1. Que faire sur BigQuery

J'ai écrit que je le ferais sur BigQuery, mais toutes les opérations réelles sont effectuées à partir de Python (Google Colaboratory). Notebook est également utile pour garder une trace de ce que vous avez fait.

Pour utiliser BigQuery à partir de Colaboratory, vous pouvez facilement vous authentifier avec les deux lignes suivantes. Lorsque l'URL s'affiche, accédez-y avec votre propre compte, émettez un mot de passe à usage unique et collez-le dans la cellule affichée dans Notebook.


from google.colab import auth
auth.authenticate_user()

1-1. Traitement des données d'achat

Passons maintenant au processus d'agrégation des données d'achat d'origine par personne et par produit.

from google.cloud import bigquery

#Ici, la période cible est janvier 2020.
from_day = "20200101"
to_day = "20200131"

query=f"""
SELECT
 id,Biens achetés, SUM(Prix d'achat)AS montant total
 FROM `myproject.mydataset.transaction_*`
 WHERE _table_suffix between `{from_day}` and `{to_day}`
"""

#Nom de la table du jeu de données du projet à afficher
project = "myproject"
client = bigquery.Client(project=project)
dataset = "mydataset"
ds = client.dataset(dataset )
table = "tmp"

job_config = bigquery.QueryJobConfig()
job_config.destination = ds.table(table)
job_config.write_disposition="WRITE_TRUNCATE" #Lors de l'écrasement d'une table. Si vous souhaitez ajouter"WRITE_APPEND"
job_config.allow_large_results=True #Autorisez-vous des résultats à grande échelle? Fondamentalement vrai
job_config.use_legacy_sql=False #Utilisez-vous l'ancien SQL? Fondamentalement faux
job = client.query(query, job_config=job_config)

result = job.result()

Désormais, lorsque l'exécution est terminée sans aucune sortie, le résultat de l'exécution est affiché dans myproject.mydataset.tmp. Les paramètres de job_config sont un peu gênants, mais écrivons d'abord tout en sachant en quoi consiste chaque paramètre. (Une fois que vous vous y êtes habitué, vous pouvez le copier)

Si vous l'exécutez jusqu'à présent, vous verrez le tableau suivant.

id Biens achetés montant total
001 product1 2500
001 product2 1200
002 product1 750
002 product2 3300

1-2. Traitement vers une table individuelle

Ensuite, je voudrais créer un tableau croisé dynamique du prix d'achat id x à charger dans le modèle d'apprentissage automatique.

Si vous utilisez Pandas avec Python, il est facile d'utiliser pivot_table, mais en fonction de la période cible, etc., la taille des données est de plusieurs Go ou plusieurs dizaines de Go, et il faut plus de temps pour importer et traiter les données, donc même la conversion de tableau croisé dynamique Je le fais avec BigQuery.


new_columns=[]

#Créer une liste de "produits achetés" à tenir horizontalement et la convertir en bloc de données
new_column="Biens achetés"
query = f'SELECT DISTINCT {new_column} FROM `{project}.{dataset}.{tmp}` ORDER BY {new_column}'
df_product = client.query(query).to_dataframe()

##Générez automatiquement du SQL à tenir horizontalement en bouclant la trame de données du produit acheté
for index, row in df_product.iterrows():
	item_frag = []
	condition_frag = []

	for i, v in zip(row.index, row.values):
		formula=f"{i}='{v}'"
		condition_frag.append(formula)
		item_frag.append(v)

	item=''.join(item_frag)
	condition=' AND '.join(condition_frag)
	query_frag = f'SUM(IF(({condition}),"Prix d'achat",0)) AS {new_column}_{item}'
	new_columns.append(query_frag)

# new_Interroger une liste appelée colonnes_Passer aux parties de la chaîne
query_parts = ',\n'.join(new_columns)
query = f'SELECT id + query_parts + FROM `{project}.{dataset}.{tmp}` GROUP BY id'

#Nom de la table de destination de sortie
table2="pivoted_table"

#L'exécution de BigQuery est la même que ci-dessus
job_config = bigquery.QueryJobConfig()
job_config.destination = ds.table(table2)
job_config.write_disposition="WRITE_TRUNCATE" #Lors de l'écrasement d'une table. Si vous souhaitez ajouter"WRITE_APPEND"
job_config.allow_large_results=True #Autorisez-vous des résultats à grande échelle? Fondamentalement vrai
job_config.use_legacy_sql=False #Utilisez-vous l'ancien SQL? Fondamentalement faux
job = client.query(query, job_config=job_config)

result = job.result()

Le processus de création de SQL pour le tableau croisé dynamique est un peu compliqué car il boucle deux fois, mais je veux créer le SQL suivant.

SELECT
 id,
SUM(IF((Biens achetés='product1'),Prix d'achat,0)) AS Biens achetés_product1,
SUM(IF((Biens achetés='product2'),Prix d'achat,0)) AS Biens achetés_product2,
SUM(IF((Biens achetés='product3'),Prix d'achat,0)) AS Biens achetés_product3,
...
FROM `myproject.mydataset.tmp`
GROUP BY id

C'est un SQL standard qui fait pivoter une table, mais la partie SUM (IF (~)) de celle-ci est automatiquement créée en fonction du nombre de produits. Jusqu'à présent, le tableau suivant est enregistré sous myproject.mydataset.pivoted_table.

id product1 product2 product3 product4 product5
001 2500 1200 1890 530 null
002 750 3300 null 1250 2000

2. Importez Python dans l'environnement

Enfin, importez les données créées par BigQuery dans l'environnement Python avec Pandas Dataframe. Cependant, comme je l'ai déjà importé avec Dataframe au milieu de la conversion Pivot, il est encore temps d'écrire un programme. .. ..

query = f'SELECT * FROM `{project}.{dataset}.{table2}`'
df = client.query(query).to_dataframe()

en conclusion

En disant "procédure de machine learning de base", cette fois j'ai commencé par les opérations avec BigQuery. Depuis Colaboratory, l'authentification est facile, je pense donc que l'obstacle au fonctionnement de BigQuery est faible.

BigQuery est encore assez puissant, mais de nouvelles fonctionnalités sont publiées chaque jour. Je veux faire bon usage des nouvelles fonctions.

Recommended Posts

Procédure d'apprentissage automatique de base: ② Préparer les données
Procédure d'apprentissage automatique de base: ④ Apprentissage du classificateur + apprentissage d'ensemble
Ensemble de données pour l'apprentissage automatique
Apprentissage automatique dans Delemas (acquisition de données)
Prétraitement dans l'apprentissage automatique 2 Acquisition de données
Prétraitement dans l'apprentissage automatique 4 Conversion de données
Comment collecter des données d'apprentissage automatique
Python: prétraitement en machine learning: acquisition de données
Python: prétraitement dans l'apprentissage automatique: conversion de données
Prétraitement dans l'apprentissage automatique 1 Processus d'analyse des données
[Memo] Apprentissage automatique
Classification de l'apprentissage automatique
Procédure d'apprentissage automatique de base: ③ Comparez et examinez la méthode de sélection de la quantité de caractéristiques
Exemple d'apprentissage automatique
Astuces de fourniture de données utilisant deque dans l'apprentissage automatique
[Python] Analyse de données, pratique du machine learning (Kaggle) -Prétraitement des données-
Division des données de formation en apprentissage automatique et apprentissage / prédiction / vérification
J'ai commencé l'apprentissage automatique avec le prétraitement des données Python
Histoire de l'analyse de données par apprentissage automatique
Résumé du didacticiel d'apprentissage automatique
Apprentissage automatique sur le surapprentissage
Apprentissage automatique ⑤ Résumé AdaBoost
Apprentissage automatique: supervisé - AdaBoost
Régression logistique d'apprentissage automatique
À propos du prétraitement des données des systèmes utilisant l'apprentissage automatique
Outil MALSS (basique) qui prend en charge l'apprentissage automatique en Python
Machine de vecteur de support d'apprentissage automatique
Étudier l'apprentissage automatique ~ matplotlib ~
Procédure d'apprentissage privée Python
Régression linéaire d'apprentissage automatique
Mémo du cours d'apprentissage automatique
Apprentissage automatique (TensorFlow) + Lotto 6
Apprenez en quelque sorte le machine learning
Prédiction de données chronologiques par AutoML (apprentissage automatique automatique)
xgboost: modèle d'apprentissage automatique efficace pour les données de table
Bibliothèque d'apprentissage automatique Shogun
Défi de lapin d'apprentissage automatique
Introduction à l'apprentissage automatique
Apprentissage automatique: k-voisins les plus proches
Qu'est-ce que l'apprentissage automatique?
Collectez des données d'apprentissage automatique en grattant des bases de données publiques biosourcées
Introduction à l'apprentissage automatique avec scikit-learn - De l'acquisition de données à l'optimisation des paramètres
Vérification des performances du prétraitement des données pour l'apprentissage automatique (données numériques) (partie 2)
Utilisation d'icrawler plus simple pour la collecte de données d'apprentissage automatique
Prétraitement dans l'apprentissage automatique 3 Données de valeur manquante / aberrante / de déséquilibre
Comment utiliser l'apprentissage automatique pour le travail? 03_Procédure de codage Python
Vérification des performances du prétraitement des données pour l'apprentissage automatique (données numériques) (partie 1)
Modèle d'apprentissage automatique prenant en compte la maintenabilité
L'apprentissage automatique appris avec Pokemon
Prétraitement japonais pour l'apprentissage automatique
Apprentissage amélioré 7 Sortie du journal des données d'apprentissage
Une introduction à l'apprentissage automatique
Techniques liées à l'apprentissage automatique / à la classification
Machine Learning: Supervision - Régression linéaire
Bases de l'apprentissage automatique (mémoire)
[Apprentissage automatique] Comprendre la forêt aléatoire
Apprentissage automatique avec Python! Préparation
Bloc-notes de ressources d'étude d'apprentissage automatique
Apprentissage automatique ② Résumé Naive Bayes
Résumé de l'article sur l'apprentissage automatique (auto-écrit)