L'ingénierie des features FeatureStore est utilisée dans les systèmes de recommandation, la publicité en ligne, le contrôle des risques et l'apprentissage automatique pour réduire la complexité de l'ingénierie des features. Des fonctions standardisées permettent de réaliser l'ingénierie des features via de simples configurations.
Prérequis
Assurez-vous que les préparatifs décrits dans le tableau suivant sont terminés.
Service | Opération |
PAI |
|
MaxCompute |
|
DataWorks |
|
1. Préparatifs
Préparer les données brutes
Cette rubrique utilise quatre tables sources :
Table des utilisateurs (rec_sln_demo_user_table_preprocess_v1) : contient les features de base des utilisateurs, telles que le sexe, l'âge, la ville et le nombre d'abonnés.
Table des comportements (rec_sln_demo_behavior_table_preprocess_v1) : contient les données comportementales, telles que les clics des utilisateurs sur des éléments à des moments précis.
Table des éléments (rec_sln_demo_item_table_preprocess_v1) : contient les features de base des éléments, telles que la catégorie, l'auteur, le nombre cumulé de clics et le nombre cumulé de mentions « J'aime ».
Table élargie des comportements (rec_sln_demo_behavior_table_preprocess_wide_v1) : cette table est formée par la jointure des trois tables précédentes.
Les tables de données sont stockées dans l'espace de travail pai_online_project, visible par tous les utilisateurs. Ces tables ne contiennent que des données de simulation. Vous devez exécuter des instructions SQL dans DataWorks pour synchroniser les données des tables mentionnées ci-dessus depuis l'espace de travail pai_online_project vers votre projet MaxCompute. Procédez comme suit :
Connectez-vous à la console DataWorks.
Dans le volet de navigation de gauche, cliquez sur Data Development and O&M > Data Development.
Sélectionnez l'espace de travail DataWorks que vous avez créé et cliquez sur Go to Data Studio.
-
Placez le curseur sur Create, puis choisissez Create Node > MaxCompute > ODPS SQL. Dans la page qui s'affiche, configurez les paramètres du nœud.
Paramètre
Valeur suggérée
Node Type
ODPS SQL
Path
Business Flow/Workflow/MaxCompute
Name
Saisissez un nom personnalisé.
Cliquez sur Confirm.
-
Dans l'éditeur du nouveau nœud, exécutez les commandes SQL suivantes pour synchroniser les données des tables des utilisateurs, des éléments, des comportements et des comportements élargis du projet pai_online_project vers votre projet MaxCompute. Pour le groupe de ressources, sélectionnez votre groupe de ressources exclusif.
-
Exécutez les instructions SQL suivantes pour synchroniser les données de la table des utilisateurs rec_sln_demo_user_table_preprocess_v1 :
CREATE TABLE IF NOT EXISTS rec_sln_demo_user_table_preprocess_v1 like pai_online_project.rec_sln_demo_user_table_preprocess_v1 STORED AS ALIORC LIFECYCLE 90; INSERT OVERWRITE TABLE rec_sln_demo_user_table_preprocess_v1 PARTITION(ds) SELECT * FROM pai_online_project.rec_sln_demo_user_table_preprocess_v1 WHERE ds >= '20240530' and ds <='20240605'; -
Exécutez les instructions SQL suivantes pour synchroniser les données de la table des comportements rec_sln_demo_behavior_table_preprocess_v1 :
CREATE TABLE IF NOT EXISTS rec_sln_demo_behavior_table_preprocess_v1 like pai_online_project.rec_sln_demo_behavior_table_preprocess_v1 STORED AS ALIORC LIFECYCLE 90; INSERT OVERWRITE TABLE rec_sln_demo_behavior_table_preprocess_v1 PARTITION(ds) SELECT * FROM pai_online_project.rec_sln_demo_behavior_table_preprocess_v1 WHERE ds >= '20240530' and ds <='20240605'; -
Exécutez les instructions SQL suivantes pour synchroniser les données de la table des éléments rec_sln_demo_item_table_preprocess_v1 :
CREATE TABLE IF NOT EXISTS rec_sln_demo_item_table_preprocess_v1 like pai_online_project.rec_sln_demo_item_table_preprocess_v1 STORED AS ALIORC LIFECYCLE 90; INSERT OVERWRITE TABLE rec_sln_demo_item_table_preprocess_v1 PARTITION(ds) SELECT * FROM pai_online_project.rec_sln_demo_item_table_preprocess_v1 WHERE ds >= '20240530' and ds <='20240605'; -
Synchronisez la table élargie des comportements : rec_sln_demo_behavior_table_preprocess_wide_v1
CREATE TABLE IF NOT EXISTS rec_sln_demo_behavior_table_preprocess_wide_v1 like pai_online_project.rec_sln_demo_behavior_table_preprocess_wide_v1 STORED AS ALIORC LIFECYCLE 90; INSERT OVERWRITE TABLE rec_sln_demo_behavior_table_preprocess_wide_v1 PARTITION(ds) SELECT * FROM pai_online_project.rec_sln_demo_behavior_table_preprocess_wide_v1 WHERE ds >= '20240530' and ds <='20240605';
-
Installation du SDK FeatureStore
Exécutez la commande suivante dans un notebook Jupyter (Python 3) :
%pip install https://feature-store-py.oss-cn-beijing.aliyuncs.com/package/feature_store_py-2.0.2-py3-none-any.whl
Importez ensuite les modules nécessaires tout au long de ce guide :
import os
from feature_store_py import FeatureStoreClient
from feature_store_py.fs_datasource import MaxComputeDataSource
from feature_store_py.feature_engineering import (
TableTransform, Condition, DayOf, ComboTransform, Feature,
AggregationTransform, auto_count_feature_transform,
WindowTransform, auto_window_feature_transform
)
2. Processus de transformation de table et de fonctionnalité
Exécutez le code suivant dans un environnement Jupyter Notebook.
-
Définissez la transformation de table.
-
Initialisez le client.
access_key_id=os.environ.get ("ALIBABA_CLOUD_ACCESS_KEY_ID") # Enter your AccessKey ID. access_key_secret=os.environ.get ("ALIBABA_CLOUD_ACCESS_KEY_SECRET") # Enter your AccessKey secret. project='project_name' # Enter your project name. region='cn-hangzhou' # Enter the region in which your project resides. For example, if your project resides in China (Hangzhou), enter cn-hangzhou. fs_client = FeatureStoreClient(access_key_id=access_key_id, access_key_secret=access_key_secret, region=region) -
Spécifiez la source de données.
input_table_name = "rec_sln_demo_behavior_table_preprocess_v1" ds = MaxComputeDataSource(table=input_table_name, project=project) -
Spécifiez le nom de la table de sortie pour la transformation.
output_table_name = "rec_sln_demo_v1_fs_test_v1" -
Définissez la transformation de table.
trans_name = "drop_duplicates" # Name of the table transformation. keys = ["user_id", "item_id"] # Fields for deduplication. sort_keys = ["event_unix_time"] # Sort fields. sort_order = ["desc"] # Order definition. tran_i = TableTransform(trans_name, keys, sort_keys, sort_order)
-
-
Définissez la transformation de fonctionnalité.
feature1 = Feature( name="page_net_type", input=['page', 'net_type'], transform=ComboTransform( separator='_' ) ) feature2 = Feature( name="trim_playtime", type="double", transform="playtime/10" ) -
Générez le pipeline.
pipeline = fs_client.create_pipeline(ds, output_table_name).add_table_transform(tran_i).add_feature_transform([feature1, feature2], keep_input_columns=True) -
Générez et exécutez la transformation.
execute_date = '20240605' output_table = pipeline.execute(execute_date, drop_table=True)Le code précédent implique deux étapes :
Générez les configurations de transformation. Ces configurations spécifient les instructions SQL et les informations requises pour la transformation, telles que les entrées, les sorties, les paramètres et les dépendances.
Exécutez la transformation. La transformation est exécutée sur la base des configurations de l'étape précédente, et les résultats sont stockés dans la table de sortie.
-
Consultez les résultats.
-
Consultez les résultats dans la table générée. Les résultats sont affichés directement au format pandas.DataFrame.
pd_ret = output_table.to_pandas(execute_date, limit=20) -
Affichez le contenu de pd_ret.
pd_ret -
Consultez les configurations générées. Elles incluent la définition de la table d'entrée, le SQL de transformation, les dépendances, les paramètres et la définition de la table de sortie. Une fois enregistrées, ces configurations peuvent être utilisées pour le débogage et les tâches en ligne ultérieures.
transform_info = output_table.transform_info -
Consultez le contenu de transform_info.
transform_info -
Consultez les configurations d'entrée pour la première étape.
pipeline_config = pipeline.pipeline_config -
Consultez le contenu de pipeline_config.
pipeline_config
-
3. Transformation statistique des fonctionnalités
Les fonctionnalités statistiques constituent une méthode courante de prétraitement des données dans l'apprentissage automatique et l'analyse de données, utilisée pour générer des fonctionnalités plus représentatives et interprétables. Ces transformations résument, calculent et extraient des informations à partir des données brutes, permettant aux modèles de mieux comprendre les tendances temporelles, la périodicité et les anomalies. Voici leurs avantages :
Capture des tendances temporelles : dans les données comportementales des utilisateurs, les comportements récents ont souvent un impact plus important sur l'état actuel.
Réduction du bruit : les données brutes peuvent contenir du bruit. Les transformations statistiques utilisent des opérations d'agrégation pour réduire son impact.
Enrichissement des fonctionnalités : les transformations statistiques peuvent générer de nouvelles fonctionnalités, augmentant ainsi la puissance expressive du modèle.
Amélioration des performances du modèle : les fonctionnalités statistiques peuvent améliorer considérablement les performances de prédiction.
Amélioration de l'interprétabilité : les fonctionnalités statistiques sont plus faciles à interpréter, ce qui simplifie le diagnostic et l'analyse des problèmes.
Compression des données : les fonctionnalités statistiques peuvent réduire efficacement la dimensionnalité des données.
Bien que la mise en œuvre des fonctionnalités statistiques soit complexe, vous pouvez créer de nombreuses fonctionnalités statistiques à l'aide des définitions simples décrites ci-dessous.
Définition et exécution d'une seule transformation de fonctionnalité statistique
-
Définissez les noms des tables d'entrée et de sortie.
input_agg_table_name = "rec_sln_demo_behavior_table_preprocess_wide_v1" ds_agg = MaxComputeDataSource(table=input_agg_table_name, project=project) output_agg_table_name = "rec_sln_demo_behavior_test_agg_v1" -
Définissez une fonctionnalité statistique.
feature_agg1 = Feature( name="user_avg_praise_count_1d", input=["praise_count"], transform=AggregationTransform( agg_func="avg", # Name of the aggregate function. Optional values are 'avg', 'sum', 'min', 'max'. condition=Condition(field="event", value="expr", operator="<>"), # Condition: the "event" field is not equal to "expr". group_by_keys="user_id", # The key corresponding to group by. window_size=DayOf(1), # The window size, which is 1 day here. ), ) -
Créez un pipeline et exécutez la transformation de fonctionnalité statistique.
agg_pipeline = fs_client.create_pipeline(ds_agg, output_agg_table_name).add_feature_transform([feature_agg1]) -
Générez et exécutez la transformation.
execute_date = '20240605' print("transform_info = ", agg_pipeline.transform_info) output_agg_table = agg_pipeline.execute(execute_date, drop_table=True) -
Consultez le contenu de transform_info.
transform_info_agg = output_agg_table.transform_info transform_info_agg -
Consultez les résultats.
pd_ret = output_agg_table.to_pandas(execute_date, limit=20) pd_ret
Jointure automatique pour les transformations de fonctionnalités statistiques avec différentes fenêtres
-
Définissez le nom de la table de sortie.
output_agg_table_name_2 = "rec_sln_demo_behavior_test_agg_v2" -
Définissez des fonctionnalités statistiques pour plusieurs fenêtres différentes. Les tailles de fenêtre définies sont de 1, 3, 7, 15 et 30 jours.
feature_agg1 = Feature( name="user_avg_praise_count_1d", input=["praise_count"], transform=AggregationTransform( agg_func="avg", condition=Condition(field="event", value="expr", operator="<>"), group_by_keys="user_id", window_size=DayOf(1), ), ) feature_agg2 = Feature( name="user_avg_praise_count_3d", input=["praise_count"], transform=AggregationTransform( agg_func="avg", condition=Condition(field="event", value="expr", operator="<>"), group_by_keys="user_id", window_size=DayOf(3), ), ) feature_agg3 = Feature( name="user_avg_praise_count_7d", input=["praise_count"], transform=AggregationTransform( agg_func="avg", condition=Condition(field="event", value="expr", operator="<>"), group_by_keys="user_id", window_size=DayOf(7), ), ) feature_agg4 = Feature( name="user_avg_praise_count_15d", input=["praise_count"], transform=AggregationTransform( agg_func="avg", condition=Condition(field="event", value="expr", operator="<>"), group_by_keys="user_id", window_size=DayOf(15), ), ) feature_agg5 = Feature( name="user_avg_praise_count_30d", input=["praise_count"], transform=AggregationTransform( agg_func="avg", condition=Condition(field="event", value="expr", operator="<>"), group_by_keys="user_id", window_size=DayOf(30), ), ) -
Créez un pipeline.
agg_pipeline_2 = fs_client.create_pipeline(ds_agg, output_agg_table_name_2).add_feature_transform([feature_agg1, feature_agg2, feature_agg3, feature_agg4, feature_agg5]) -
Générez et exécutez le pipeline.
execute_date = '20240605' output_agg_table_2 = agg_pipeline_2.execute(execute_date, drop_table=True) -
Consultez les résultats de la transformation.
transform_info_agg_2 = output_agg_table_2.transform_info transform_info_agg_2 -
Consultez les résultats de l'exécution de la table.
pd_ret_2 = output_agg_table_2.to_pandas(execute_date, limit=20) pd_ret_2
Fusion automatique et dérivation de type pour plusieurs processus de transformation de fonctionnalités statistiques
Pour optimiser les calculs, plusieurs fonctionnalités ayant la même taille de fenêtre sont automatiquement fusionnées et calculées dans le même bloc de fenêtre de groupe. Le processus de calcul implique des changements de type. Par exemple, avg transforme le type bigint en type double. Comme il est difficile de se souvenir des types de toutes les fonctionnalités d'entrée, le processus de transformation de fonctionnalité statistique prend en charge la dérivation automatique de type. Le type de la fonctionnalité résultante est automatiquement dérivé lors de la définition de la fonctionnalité.
-
Définissez le nom de la table de sortie.
output_agg_table_name_3 = "rec_sln_demo_behavior_test_agg_v3" -
Définissez davantage de fonctionnalités de différents types.
feature_agg6 = Feature( name="user_expr_cnt_1d", transform=AggregationTransform( agg_func="count", condition=Condition(field="event", value="expr", operator="="), group_by_keys="user_id", window_size=DayOf(1), ) ) feature_agg7 = Feature( name="user_expr_item_id_dcnt_1d", input=['item_id'], transform=AggregationTransform( agg_func="count", condition=Condition(field="event", value="expr", operator="="), group_by_keys="user_id", window_size=DayOf(1), ), ) feature_agg8 = Feature( name="user_sum_praise_count_1d", input=["praise_count"], transform=AggregationTransform( agg_func="sum", condition=Condition(field="event", value="expr", operator="<>"), group_by_keys="user_id", window_size=DayOf(1), ), ) feature_agg9 = Feature( name="user_sum_praise_count_3d", input=["praise_count"], transform=AggregationTransform( agg_func="sum", condition=Condition(field="event", value="expr", operator="<>"), group_by_keys="user_id", window_size=DayOf(3), ), ) -
Créez un pipeline.
agg_pipeline_3 = fs_client.create_pipeline(ds_agg, output_agg_table_name_3).add_feature_transform([feature_agg1, feature_agg2, feature_agg3, feature_agg4, feature_agg5, feature_agg6, feature_agg7, feature_agg8, feature_agg9]) -
Générez et exécutez le pipeline.
execute_date = '20240605' output_agg_table_3 = agg_pipeline_3.execute(execute_date, drop_table=True) -
Consultez les résultats de la transformation.
transform_info_agg_3 = output_agg_table_3.transform_info transform_info_agg_3 -
Consultez les résultats de l'exécution de la table.
pd_ret_3 = output_agg_table_3.to_pandas(execute_date, limit=20) pd_ret_3
Fonctions d'extension automatique intégrées pour prendre en charge l'extension automatique des transformations de fonctionnalités statistiques
La mise en œuvre manuelle de chaque fonctionnalité statistique est complexe en raison du grand nombre de fonctionnalités, qui incluent différentes tailles de fenêtre et de nombreuses combinaisons de fonctions d'agrégation. Le système fournit des fonctions d'extension automatique intégrées. Spécifiez les fonctionnalités d'entrée à compter, et le système génère automatiquement les définitions de centaines de fonctionnalités statistiques.
-
Spécifiez les fonctionnalités d'entrée à compter.
name_prefix = "user_" input_list = ["playtime", "duration", "click_count", "praise_count"] event_name = 'event' event_type = 'expr' group_by_key = "user_id" count_feature_list = auto_count_feature_transform(name_prefix, input_list, event_name, event_type, group_by_key) print("len_count_feature_list = ", len(count_feature_list)) print("count_feature_list = ", count_feature_list) -
Définissez le nom de la table de sortie et créez un pipeline.
output_agg_table_name_4 = "rec_sln_demo_behavior_test_agg_v4" agg_pipeline_4 =fs_client.create_pipeline(ds_agg, output_agg_table_name_4).add_feature_transform(count_feature_list) -
Générez et exécutez le pipeline.
execute_date = '20240605' output_agg_table_4 = agg_pipeline_4.execute(execute_date, drop_table=True) -
Consultez les résultats de la transformation.
transform_info_agg_4 = output_agg_table_4.transform_info transform_info_agg_4 -
Consultez les résultats de l'exécution de la table.
pd_ret_4 = output_agg_table_4.to_pandas(execute_date, limit=20) pd_ret_4
Prise en charge de la transformation simultanée de différentes clés de groupe
Les sections précédentes décrivent la méthode de traitement lorsque toutes les clés de groupe sont identiques. Le système prend également en charge les opérations de transformation sur différentes clés de groupe. Voici un exemple :
-
Définissez le nom de la table de sortie.
input_agg_table_name = "rec_sln_demo_behavior_table_preprocess_wide_v1" ds_agg = MaxComputeDataSource(table=input_agg_table_name, project=project) output_agg_table_name_5 = "rec_sln_demo_behavior_test_agg_v5" -
Définissez des fonctionnalités pour différentes clés de groupe.
feature_agg1 = Feature( name="item__sum_follow_cnt_15d", input=['follow_cnt'], transform=AggregationTransform( agg_func="sum", condition=Condition(field="event", value="expr", operator="="), group_by_keys="item_id", window_size=DayOf(1), ) ) feature_agg2 = Feature( name="author__max_follow_cnt_15d", input=['follow_cnt'], transform=AggregationTransform( agg_func="max", condition=Condition(field="event", value="expr", operator="="), group_by_keys="author", window_size=DayOf(15), ), ) -
Créez un pipeline.
agg_pipeline_5 = fs_client.create_pipeline(ds_agg, output_agg_table_name_5).add_feature_transform([feature_agg1, feature_agg2]) -
Générez et exécutez le pipeline.
execute_date = '20240605' output_agg_table_5 = agg_pipeline_5.execute(execute_date, drop_table=True) -
Consultez les résultats de la transformation.
transform_info_agg_5 = output_agg_table_5.transform_info transform_info_agg_5
4. Transformation de fonctionnalité WindowTransform
La transformation de fonctionnalité statistique précédente suffit pour les scénarios courants d'ingénierie des fonctionnalités. Cependant, dans les scénarios de recommandation à grande échelle, il existe des exigences plus avancées. FeatureStore prend en charge la transformation de fonctionnalité WindowTransform, qui vous permet d'obtenir des fonctionnalités KV et d'utiliser des tables intermédiaires quotidiennes pour optimiser le processus de calcul. Cela réduit le temps de calcul des fonctionnalités et économise les coûts de calcul. Voici ses avantages :
Capture d'interactions non linéaires complexes : les fonctionnalités simples (telles que l'âge et le sexe de l'utilisateur) ne peuvent pas exprimer des préférences utilisateur complexes. Le croisement de fonctionnalités capture des relations d'interaction non linéaires plus complexes entre les utilisateurs et les éléments.
Amélioration de la précision des prédictions : les fonctionnalités croisées peuvent améliorer considérablement les performances des systèmes de recommandation et des systèmes publicitaires.
Réduction de l'espace de stockage : pour les grandes collections d'utilisateurs et d'éléments, le stockage direct des fonctionnalités d'interaction de chaque paire utilisateur-élément n'est pas réalisable. L'extraction et la transformation de fonctionnalités peuvent réduire efficacement le nombre de fonctionnalités à stocker.
Amélioration de l'efficacité de l'inférence : en précalculant et en stockant les fonctionnalités croisées, ces fonctionnalités peuvent être récupérées rapidement lors de l'inférence en temps réel, ce qui améliore la vitesse de réponse.
La transformation de fonctionnalité WindowTransform est présentée dans les sections suivantes :
Processus de calcul de fonction d'agrégation simple
Les fonctions d'agrégation simples incluent count, sum, max et min. Le processus de calcul de ces fonctions d'agrégation est relativement simple. Après un résumé au niveau quotidien, un autre résumé sur plusieurs jours est effectué pour obtenir le résultat final. Cette section présente également les tables intermédiaires quotidiennes et les fonctions définies par l'utilisateur (UDF) (Aperçu des UDF MaxCompute) pour obtenir le résultat de calcul final. Dans le processus de calcul réel, l'exécution de l'ingénierie des fonctionnalités est identique à la transformation de fonctionnalité conventionnelle décrite précédemment. Le SDK Python FeatureStore gère automatiquement la création de tables intermédiaires quotidiennes, la génération d'UDF, le téléchargement des ressources et l'enregistrement automatique des fonctions.
-
Définissez les noms des tables d'entrée et de sortie.
input_window_table_name = "rec_sln_demo_behavior_table_preprocess_wide_v1" ds_window_1 = MaxComputeDataSource(table=input_agg_table_name, project=project) output_window_table_name_1 = "rec_sln_demo_behavior_test_window_v1" -
Définissez les fonctionnalités WindowTransform.
win_feature1 = Feature( name="item__kv_gender_click_7d", input=["gender"], transform=WindowTransform( agg_func="count", condition=Condition(field="event", value="click", operator="="), group_by_keys="item_id", window_size=DayOf(7), ), ) win_feature2 = Feature( name="item__kv_gender_click_cnt_7d", input=["gender"], transform=WindowTransform( agg_func="sum", # Aggregate function. Optional values are 'sum', 'avg', 'max', 'min'. agg_field="click_count", # Perform the aggregate function calculation on this feature. condition=Condition(field="event", value="click", operator="="), group_by_keys="item_id", window_size=DayOf(7), ), ) -
Créez un pipeline et exécutez la transformation de fonctionnalité WindowTransform.
window_pipeline_1 = fs_client.create_pipeline(ds_window_1, output_window_table_name_1).add_feature_transform([win_feature1, win_feature2], keep_input_columns=True) -
Générez et exécutez la transformation.
Ce processus de génération crée une table intermédiaire temporaire quotidienne. À ce stade,
DROP TABLEsupprime uniquement le résultat final et ne supprime pas la table temporaire intermédiaire.execute_date = '20240605' print("transform_info = ", window_pipeline_1.transform_info) output_window_table_1 = window_pipeline_1.execute(execute_date, drop_table=True)De plus, comme les statistiques portent sur plusieurs jours (par exemple, l'exemple précédent compte les données sur 7 jours), la table temporaire intermédiaire calcule généralement les données uniquement pour la dernière partition. Pour cette raison, le système fournit le paramètre
backfill_partitions. Lors de la première exécution du processus, vous pouvez définir ce paramètre surTrue, et le système remplit automatiquement les données pour les jours dépendants. Par exemple, si le comptage implique 7 jours de données, le système complète automatiquement les 7 jours de données. Pour les exécutions routinières ultérieures, vous pouvez définir le paramètre surFalsepour compléter les données uniquement pour la partition du dernier jour.execute_date = '20240506' output_window_table_1 = window_pipeline_1.execute(execute_date, backfill_partitions=True)Lorsque le paramètre
backfill_partitionsest défini surTrue, le système complète automatiquement les données pour les jours dépendants de la table intermédiaire temporaire. Effectuez cette opération lors de la première exécution routinière.Si le nombre de jours à compter est élevé, l'exécution du code précédent prend beaucoup de temps.
-
Consultez les données de la table de destination.
window_ret_1 = output_window_table_1.to_pandas(execute_date, limit=50) window_ret_1 -
Consultez le processus de calcul réel.
window_pipeline_1.transform_infoComme vous pouvez le voir dans le processus de calcul, le système génère une table temporaire intermédiaire quotidienne nommée
rec_sln_demo_behavior_table_preprocess_wide_v1_tmp_daily. Cette table résume les résultats quotidiens et les stocke dans une partition fixe, ce qui évite les calculs répétés.De plus, une UDF nommée
count_kvest utilisée pour calculer le résultat final. Cette UDF classe et résume automatiquement les résultats statistiques dans une carte de résultats, qui est stockée au format chaîne. Cela facilite l'inférence des résultats hors ligne et en ligne ultérieure.
Le contenu précédent présente le processus de calcul des fonctions d'agrégation simples, en utilisant count et sum comme exemples. Bien que ce processus implique des concepts tels que les tables temporaires intermédiaires quotidiennes et les UDF, le flux principal est identique à celui d'une transformation de données conventionnelle et n'ajoute pas de complexité opérationnelle. D'autres fonctions d'agrégation simples, telles que max et min, sont similaires.
Processus de calcul de la fonction d'agrégation avg
Étant donné que la moyenne des moyennes quotidiennes conduit à des calculs inexacts, la fonction d'agrégation avg possède un processus de calcul spécifique. La méthode correcte consiste d'abord à calculer la somme totale (sum_v) et le nombre total (count_v) pour toute la période, puis à calculer la moyenne à l'aide de la formule sum_v/count_v.
Bien que cette fonction d'agrégation soit documentée séparément, ses détails de calcul complexes sont encapsulés dans transform_info. Vous pouvez utiliser cette fonction comme une fonctionnalité conventionnelle pour générer le résultat final.
-
Définissez les noms des tables d'entrée et de sortie.
input_window_table_name = "rec_sln_demo_behavior_table_preprocess_wide_v1" ds_window_1 = MaxComputeDataSource(table=input_window_table_name, project=project) output_window_table_name_2 = "rec_sln_demo_behavior_test_window_v2" -
Définissez la fonctionnalité WindowTransform.
win_feature1 = Feature( name="item__kv_gender_click_avg_7d", input=["gender"], transform=WindowTransform( agg_func="avg", agg_field="click_count", condition=Condition(field="event", value="click", operator="="), group_by_keys="item_id", window_size=DayOf(7), ), ) win_feature2 = Feature( name="item__kv_gender_click_avg_15d", input=["gender"], transform=WindowTransform( agg_func="avg", agg_field="click_count", condition=Condition(field="event", value="click", operator="="), group_by_keys="item_id", window_size=DayOf(15), ), ) -
Créez un pipeline et exécutez la transformation de fonctionnalité WindowTransform.
window_pipeline_2 = fs_client.create_pipeline(ds_window_1, output_window_table_name_2).add_feature_transform([win_feature1, win_feature2]) -
Générez et exécutez la transformation.
execute_date = '20240605' print("transform_info = ", window_pipeline_2.transform_info) output_window_table_2 = window_pipeline_2.execute(execute_date, drop_table=True) -
Consultez les données de la table de destination.
window_ret_2 = output_window_table_2.to_pandas(execute_date, limit=50) window_ret_2
Processus de calcul de fonction pour plusieurs clés de groupe
De même, WindowTransform prend en charge les calculs simultanés avec plusieurs clés de groupe. Le résultat est ensuite joint à gauche à la table d'entrée. Voici un exemple :
-
Définissez les noms des tables d'entrée et de sortie.
input_window_table_name = "rec_sln_demo_behavior_table_preprocess_wide_v1" ds_window_1 = MaxComputeDataSource(table=input_window_table_name, project=project) output_window_table_name_3 = "rec_sln_demo_behavior_test_window_v3" -
Définissez les fonctionnalités WindowTransform.
win_feature1 = Feature( name="item__kv_gender_click_7d", input=["gender"], transform=WindowTransform( agg_func="count", condition=Condition(field="event", value="click", operator="="), group_by_keys="item_id", window_size=DayOf(7), ), ) win_feature2 = Feature( name="item__kv_gender_click_cnt_7d", input=["gender"], transform=WindowTransform( agg_func="sum", agg_field="click_count", condition=Condition(field="event", value="click", operator="="), group_by_keys="item_id", window_size=DayOf(7), ), ) win_feature3 = Feature( name="author__kv_gender_click_15d", input=["gender"], transform=WindowTransform( agg_func="count", condition=Condition(field="event", value="click", operator="="), group_by_keys="author", window_size=DayOf(7), ), ) win_feature4 = Feature( name="author__kv_gender_click_cnt_15d", input=["gender"], transform=WindowTransform( agg_func="sum", agg_field="click_count", condition=Condition(field="event", value="click", operator="="), group_by_keys="author", window_size=DayOf(7), ), ) -
Créez un pipeline et exécutez la transformation de fonctionnalité WindowTransform.
window_pipeline_3 = fs_client.create_pipeline(ds_window_1, output_window_table_name_3).add_feature_transform([win_feature1, win_feature2, win_feature3, win_feature4]) -
Générez et exécutez la transformation.
execute_date = '20240605' print("transform_info = ", window_pipeline_3.transform_info) output_window_table_3 = window_pipeline_3.execute(execute_date, drop_table=True) -
Consultez les données de la table de destination.
window_ret_3 = output_window_table_3.to_pandas(execute_date, limit=50) window_ret_3
Fonctions d'extension automatique intégrées pour prendre en charge l'extension automatique des fonctionnalités WindowTransform
Comme pour les transformations de fonctionnalités statistiques, la mise en œuvre manuelle de chaque fonctionnalité statistique WindowTransform est complexe en raison du grand nombre de fonctionnalités, qui incluent différentes tailles de fenêtre et de nombreuses combinaisons de calculs de fonctions d'agrégation. Le système fournit des fonctions d'extension automatique intégrées. Il vous suffit de spécifier les fonctionnalités d'entrée à compter, et le système génère et complète automatiquement les définitions de centaines de fonctionnalités statistiques.
-
Spécifiez les fonctionnalités d'entrée à compter.
name_prefix = "item" input_list = ['gender'] agg_field = ["click_count"] event_name = 'event' event_type = 'click' group_by_key = "item_id" window_size = [7, 15, 30, 45] window_transform_feature_list = auto_window_feature_transform(name_prefix, input_list, agg_field, event_name, event_type, group_by_key, window_size) print("len_window_transform_feature_list = ", len(window_transform_feature_list)) print("window_transform_feature_list = ", window_transform_feature_list) -
Définissez le nom de la table de sortie et créez un pipeline.
input_window_table_name = "rec_sln_demo_behavior_table_preprocess_wide_v1" ds_window_1 = MaxComputeDataSource(table=input_window_table_name, project=project) output_window_table_name_4 = "rec_sln_demo_behavior_test_window_v4" window_pipeline_4 =fs_client.create_pipeline(ds_window_1, output_window_table_name_4).add_feature_transform(window_transform_feature_list) -
Générez et exécutez la transformation.
execute_date = '20240605' print("transform_info = ", window_pipeline_4.transform_info) output_window_table_4 = window_pipeline_4.execute(execute_date, drop_table=True)
Transformation JoinTransform
Dans le processus d'ingénierie des fonctionnalités précédent, en particulier pour AggregationTransform et WindowTransform, les entrées sont des tables de comportement, et les résultats de sortie sont également stockés dans une table de comportement. Cependant, la table finale utilisée en ligne n'est généralement pas une table de comportement, mais une table de fonctionnalités générée en joignant la table de comportement à d'autres tables, telles qu'une table utilisateur ou une table d'éléments.
Par conséquent, JoinTransform est introduit pour prendre en charge la jointure des fonctionnalités issues d'AggregationTransform et de WindowTransform avec des tables utilisateur ou d'éléments existantes.
Associer JoinTransform à WindowTransform
-
Définissez la table d'entrée WindowTransform.
window_table_name = 'rec_sln_demo_behavior_table_preprocess_wide_v1' ds_window_1 = MaxComputeDataSource(table=window_table_name, project=project) -
Définissez les fonctionnalités WindowTransform.
win_fea1 = Feature( name="item__kv_gender_click_7d", input=["gender"], transform=WindowTransform( agg_func="count", condition=Condition(field="event", value="click", operator="="), group_by_keys="item_id", window_size=DayOf(7), ) ) -
Créez un pipeline.
RemarqueÉtant donné que d'autres tables doivent être jointes ultérieurement, la table de sortie n'est pas spécifiée ici.
win_pipeline_1 = fs_client.create_pipeline(ds_window_1).add_feature_transform([win_fea1]) -
Définissez les tables d'entrée et de sortie JoinTransform.
item_table_name = 'rec_sln_demo_item_table_preprocess_v1' ds_join_1 = MaxComputeDataSource(table=item_table_name, project=project) output_table_name = 'rec_sln_demo_item_table_v1_fs_window_debug_v1' -
Créez un pipeline JoinTransform et connectez-le au pipeline WindowTransform.
join_pipeline_1 = fs_client.create_pipeline(ds_join_1, output_table_name).merge(win_pipeline_1) -
Générez et exécutez la transformation.
execute_date = '20240605' output_join_table_1 = join_pipeline_1.execute(execute_date, drop_table=True) -
Consultez les données de la table de destination.
join_ret_1 = output_join_table_1.to_pandas(execute_date, limit = 50) join_ret_1 -
Consultez le processus de calcul réel.
output_join_table_1.transform_info
Associer JoinTransform à AggregationTransform
-
Définissez la table d'entrée AggregationTransform.
agg_table_name = 'rec_sln_demo_behavior_table_preprocess_wide_v1' ds_agg_1 = MaxComputeDataSource(table=agg_table_name, project=project) -
Définissez les fonctionnalités AggregationTransform.
agg_fea1 = Feature( name="user_avg_praise_count_1d", input=["praise_count"], transform=AggregationTransform( agg_func="avg", condition=Condition(field="event", value="expr", operator="<>"), group_by_keys="user_id", window_size=DayOf(1), ), ) -
Créez un pipeline.
RemarqueÉtant donné que d'autres tables doivent être jointes ultérieurement, la table de sortie n'est pas spécifiée ici.
agg_pipeline_1 = fs_client.create_pipeline(ds_agg_1).add_feature_transform([agg_fea1]) -
Définissez les tables d'entrée et de sortie JoinTransform.
user_table_name = 'rec_sln_demo_user_table_preprocess_v1' ds_join_2 = MaxComputeDataSource(table=user_table_name, project=project) output_table_name_2 = 'rec_sln_demo_user_table_v1_fs_window_debug_v1' -
Créez un pipeline JoinTransform et connectez-le au pipeline AggregationTransform.
join_pipeline_2 = fs_client.create_pipeline(ds_join_2, output_table_name_2).merge(agg_pipeline_1, keep_input_columns=False) -
Générez et exécutez la transformation.
execute_date = '20240605' output_join_table_2 = join_pipeline_2.execute(execute_date, drop_table=True) -
Consultez les données de la table de destination.
join_ret_2 = output_join_table_2.to_pandas(execute_date, limit = 50) join_ret_2 -
Consultez le processus de calcul réel.
output_join_table_2.transform_info
Références
Pour les scénarios d'application, consultez Bonnes pratiques pour l'ingénierie des fonctionnalités.
FeatureStore convient à tous les scénarios nécessitant des fonctionnalités, tels que la recommandation, le contrôle des risques financiers et les scénarios de croissance des utilisateurs. FeatureStore est intégré aux moteurs de source de données courants et aux moteurs de service de recommandation d'Alibaba Cloud. FeatureStore fournit une plateforme efficace et pratique de bout en bout, de l'enregistrement des fonctionnalités au développement et à l'application de modèles. Pour plus d'informations sur FeatureStore, consultez Aperçu.
Si vous avez des questions lors de l'utilisation de FeatureStore, vous pouvez rejoindre le groupe DingTalk 34415007523 pour une assistance technique.