Top Insights (Fonctions ML Snowflake)¶
Top Insights est une fonction ML pour l’analyse des facteurs clés, vous aidant à identifier les facteurs de changement d’une métrique au fil du temps ou à expliquer les différences dans une métrique entre différents secteurs verticaux. Top Insights s’appuie sur un modèle d’arbre de décision qui sépare un ensemble de données en segments ayant un comportement différent par rapport à la métrique que vous souhaitez analyser. Avec quelques lignes de SQL, vous pouvez intégrer Top Insights dans votre BI des flux de travail pour surveiller automatiquement les segments responsables des changements dans n’importe quelle métrique.
Les cas d’utilisation de Top Insights incluent :
Analyse des séries chronologiques : identifier les facteurs de changement d’une métrique au fil du temps. Par exemple, identifiez automatiquement les emplacements, les vendeurs, les clients, les secteurs verticaux et d’autres facteurs responsables d’une récente baisse de revenu.
Analyse verticale : identifier les facteurs à l’origine des différences dans une mesure entre différents secteurs verticaux. Par exemple, pour comprendre quels segments d’utilisateurs sont responsables des différences dans la croissance des nouveaux utilisateurs entre les États-Unis et les pays de la région EMEA, pour aider à façonner des campagnes de marketing ciblées.
À propos de Top Insights¶
Top Insights utilise un modèle d’arbre de décision qui sépare un ensemble de données en segments ayant un comportement différent par rapport à la métrique que vous souhaitez analyser. L’algorithme analyse les différences inter-segments entre la métrique du groupe de contrôle et celle du groupe de test.
Le groupe de contrôle est constitué des points de données que le modèle utilisera comme base de référence.
Le groupe de test est constitué de points d’intérêt à analyser.
Top Insights produit ensuite un certain nombre de combinaisons possibles de contributeurs, qui sont filtrées en fonction de leur importance et de leur caractère distinctif. Top Insights ne renvoie pas de segments redondants.
Les bons ensembles de données candidats à l’analyse avec Top Insights comportent généralement un grand nombre de colonnes ou de dimensions utilisées pour segmenter les données, ce qui rend difficile l’identification intuitive des segments qui influencent une métrique. Les dimensions peuvent être catégoriques (localisation, segment de marché, etc.) ou continues (c’est-à-dire quantitatives, comme la température ou la fréquentation).
Un modèle Top Insights est un objet de niveau schéma. Vous n’avez besoin que d’une seule instance, car l’instance ne contient aucun état.
Astuce
Les dimensions sont déduites comme catégoriques ou continues en fonction de leur type. Les valeurs numériques sont considérées comme des dimensions continues, tandis que les valeurs de chaîne et booléennes sont considérées comme catégoriques. Pour utiliser une valeur numérique comme dimension catégorique, convertissez-la en chaîne.
Privilèges requis¶
Une instance TOP_INSIGHTS est un objet de niveau schéma. Par conséquent, le rôle que vous utilisez pour créer l’instance doit avoir le privilège CREATE SNOWFLAKE.ML.TOP_INSIGHTS sur le schéma où l’instance est créée. Ce privilège est similaire à d’autres privilèges de schéma tels que CREATE TABLE ou CREATE VIEW.
Si vous n’êtes pas le propriétaire de l’instance, vous devez avoir le privilège USAGE sur celle-ci pour pouvoir appeler sa méthode GET_DRIVERS.
Utilisation de Top Insights¶
Pour utiliser Top Insights dans vos requêtes et pipelines, créez d’abord une instance de classe TOP_INSIGHTS (SNOWFLAKE.ML). L’instruction SQL ci-dessous crée une instance nommée my_insights
. La création de l’instance ne nécessite aucun argument.
CREATE SNOWFLAKE.ML.TOP_INSIGHTS IF NOT EXISTS my_insights();
Après avoir créé une instance, vous pouvez utiliser la méthode GET_DRIVERS pour extraire les facteurs clés de l’ensemble de données sur lequel vous souhaitez effectuer des analyses de facteurs clés. Vous transmettez les données d’entrée en une seule fois (une référence vers une seule table, vue ou requête) et fournissez les noms des colonnes de métriques et d’étiquettes dans les données d’entrée comme arguments supplémentaires. Les dimensions catégoriques et continues sont déduites par leur type et n’ont pas besoin d’être spécifiées explicitement.
CALL my_insights!get_drivers (
INPUT_DATA => TABLE(my_table),
LABEL_COLNAME => 'label',
METRIC_COLNAMe => 'sales');
Préparation des données pour Top Insights¶
Pour utiliser Top Insights, assurez-vous d’avoir une colonne d’étiquette booléenne qui distingue les lignes qui font partie du groupe de contrôle (étiquetées FALSE) à partir des lignes du groupe de test (étiquetées TRUE). Cette colonne est généralement dérivée d’autres valeurs de l’ensemble de données, telles qu’un horodatage ou le nom d’un secteur vertical. Il est donc courant de créer une vue pour ce faire. La vue est également un bon endroit pour filtrer les colonnes qui ne font pas partie de votre analyse.
L’exemple ci-dessous, pour l’analyse de séries chronologiques, crée une vue avec une colonne d’étiquette basée sur une plage de dates. Plus précisément, il étiquette les enregistrements du dernier mois comme TRUE (données de test) et tous les enregistrements précédents comme FALSE (données de contrôle). Top Insights peut ensuite analyser les dimensions continues et catégoriques qui expliquent les différences dans les variations mensuelles pour la métrique spécifiée.
CREATE VIEW input_table_time_series_label (
ds, metric, dim_country, dim_vertical, label ) AS
SELECT
ds,
metric,
dim_country,
dim_vertical,
ds >= dateadd(month, -1, current_date) AS label
FROM input_table;
L’exemple suivant, pour l’analyse verticale, crée une vue avec une colonne d’étiquette basée sur le pays. Plus précisément, il étiquette les enregistrements dans des pays nonUS comme TRUE, et étiquette les enregistrements aux USA comme FALSE. Top Insights analysera ensuite les dimensions continues et catégoriques qui expliquent les différences d’une métrique entre ces groupes de population.
CREATE VIEW input_table_vertical_label (
ds, metric, dim_country, dim_vertical, label ) AS
SELECT
ds,
metric,
dim_country,
dim_vertical,
dim_country <> 'USA' as label
FROM input_table;
Interprétation des résultats¶
Top Insights renvoie une ligne pour chaque segment d’intérêt qu’il trouve dans vos données. Chaque ligne contient une description en anglais simple du segment, qui peut contenir plusieurs critères (par exemple, « COUNTRY = France, pas VERTICAL = mode, pas VERTICAL = tech » pourrait décrire un seul segment). Pour chaque segment, Top Insights fournit les valeurs suivantes qui quantifient la contribution du segment aux changements entre le groupe de contrôle et le groupe de test.
Colonne de sortie |
Description |
---|---|
METRIC_CONTROL |
Valeur totale de la métrique au cours de la période de contrôle dans un segment spécifique. |
METRIC_TEST |
Valeur totale de la métrique au cours de la période de test dans un segment spécifique. |
CONTRIBUTION |
L’impact absolu du segment sur le changement de la métrique. |
RELATIVE_CONTRIBUTION |
L’impact du segment en proportion du changement global de la métrique entre le test et le contrôle. |
GROWTH_RATE |
Le changement de la métrique dans le segment en proportion de la métrique dans le groupe témoin du segment. |
La contribution, la contribution relative et le taux de croissance peuvent être négatifs, indiquant qu’un segment a un impact négatif.
Considérations relatives aux clients¶
L’utilisation de Top Insights entraîne des coûts de calcul. Le temps d’exécution varie en fonction du nombre de lignes et de dimensions traitées. Consultez Comprendre le coût du calcul pour obtenir des informations générales sur les coûts de calcul de Snowflake.
Les performances de Top Insights ne bénéficient généralement pas de l’utilisation d’un entrepôt plus grand que nécessaire pour charger toutes les données analysées, qui doivent tenir dans la mémoire. Les ensembles de données qui dépassent environ 1 000 000 de lignes et 1 000 colonnes peuvent épuiser la mémoire. Snowflake recommande d’utiliser un entrepôt optimisé pour Snowpark plutôt qu’un entrepôt standard plus grand. Les entrepôts optimisés pour Snowpark ont plus de mémoire que les entrepôts standards de la taille correspondante.
Bien que les instances de la classe Top Insights soient des objets de niveau schéma, elles ne stockent aucune donnée et ont un impact négligeable sur les coûts de stockage.
Exemples¶
Les exemples suivants montrent comment utiliser Top Insights pour l’analyse de séries chronologiques et l’analyse verticale.
Exemple d’analyse de séries chronologiques¶
Cet exemple recherche les segments contribuant aux différences dans la métrique entre deux périodes, en particulier la manière dont le pays et les dimensions verticales affectent la métrique après 2021.
Créez la table d’entrée contenant des données synthétiques pour cet exemple à l’aide des instructions SQL suivantes.
CREATE OR REPLACE TABLE input_table(
ds DATE, metric NUMBER, dim_country VARCHAR, dim_vertical VARCHAR);
INSERT INTO input_table
SELECT
DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
UNIFORM(1, 10, RANDOM()) AS metric,
'usa' AS dim_country,
'tech' AS dim_vertical
FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
SELECT
DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
UNIFORM(1, 10, RANDOM()) AS metric,
'usa' AS dim_country,
'auto' AS dim_vertical
FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
SELECT
DATEADD(day, seq4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
UNIFORM(1, 10, RANDOM()) AS metric,
'usa' AS dim_country,
'fashion' AS dim_vertical
FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
SELECT
DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
UNIFORM(1, 10, RANDOM()) AS metric,
'usa' AS dim_country,
'finance' AS dim_vertical
FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
SELECT
DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
UNIFORM(1, 10, RANDOM()) AS metric,
'canada' AS dim_country,
'fashion' AS dim_vertical
FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
SELECT
DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
UNIFORM(1, 10, RANDOM()) AS metric,
'canada' AS dim_country,
'finance' AS dim_vertical
FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
SELECT
DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
UNIFORM(1, 10, RANDOM()) AS metric,
'canada' AS dim_country,
'tech' AS dim_vertical
FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
SELECT
DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
UNIFORM(1, 10, RANDOM()) AS metric,
'canada' AS dim_country,
'auto' AS dim_vertical
FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
SELECT
DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
UNIFORM(1, 10, RANDOM()) AS metric,
'france' AS dim_country,
'fashion' AS dim_vertical
FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
SELECT
DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
UNIFORM(1, 10, RANDOM()) AS metric,
'france' AS dim_country,
'finance' AS dim_vertical
FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
SELECT
DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
UNIFORM(1, 10, RANDOM()) AS metric,
'france' AS dim_country,
'tech' AS dim_vertical
FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
SELECT
DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
UNIFORM(1, 10, RANDOM()) AS metric,
'france' AS dim_country,
'auto' AS dim_vertical
FROM TABLE(GENERATOR(ROWCOUNT => 365));
-- Data for the test group
INSERT INTO input_table
SELECT
DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 8, 1)) AS ds,
UNIFORM(300, 320, RANDOM()) AS metric,
'usa' AS dim_country,
'auto' AS dim_vertica
FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
SELECT
DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 8, 1)) AS ds,
UNIFORM(400, 420, RANDOM()) AS metric,
'usa' AS dim_country,
'finance' AS dim_vertical
FROM TABLE(GENERATOR(ROWCOUNT => 365));
Créez une vue avec une colonne d’étiquette basée sur l’horodatage.
CREATE OR REPLACE VIEW input_view AS (
SELECT
metric,
dim_country as country,
dim_vertical as vertical,
ds >= '2021-01-01' AS label
FROM input_table
);
Analysez maintenant ces données en appelant la méthode GET_DRIVERS d’une instance TOP_INSIGHTS.
CREATE OR REPLACE SNOWFLAKE.ML.TOP_INSIGHTS my_insights_model()
CALL my_insights_model!GET_DRIVERS(
INPUT_DATA => TABLE(input_view),
LABEL_COLNAME => 'label',
METRIC_COLNAME => 'metric'
)
La sortie ressemble à ce qui suit :
+---------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+---------------+
| CONTRIBUTOR | METRIC_CONTROL | METRIC_TEST | CONTRIBUTION | RELATIVE_CONTRIBUTION | GROWTH_RATE |
|---------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+---------------|
| ["Overall"] | 128445 | 158456 | 30011 | 1 | 0.2336486434 |
| ["COUNTRY = usa"] | 116238 | 154574 | 38336 | 1.277398287 | 0.3298060875 |
| ["COUNTRY = usa","VERTICAL = finance"] | 64281 | 87423 | 23142 | 0.771117257 | 0.3600130676 |
| ["COUNTRY = usa","VERTICAL = auto"] | 48930 | 66131 | 17201 | 0.5731565093 | 0.3515430206 |
| ["COUNTRY = usa","VERTICAL = tech"] | 1543 | 503 | -1040 | -0.03465396021 | -0.6740116656 |
| ["COUNTRY = canada","VERTICAL = finance"] | 1538 | 482 | -1056 | -0.03518709806 | -0.6866059818 |
| ["COUNTRY = canada","VERTICAL = fashion"] | 1519 | 446 | -1073 | -0.03575355703 | -0.7063857801 |
| ["COUNTRY = france","VERTICAL = auto"] | 1534 | 460 | -1074 | -0.03578687814 | -0.7001303781 |
| ["COUNTRY = usa","not VERTICAL = auto","not VERTICAL = finance"] | 3027 | 1020 | -2007 | -0.06687547899 | -0.6630327056 |
| ["COUNTRY = france","not VERTICAL = fashion","not VERTICAL = tech"] | 3100 | 962 | -2138 | -0.07124054513 | -0.6896774194 |
| ["COUNTRY = france","not VERTICAL = fashion"] | 4687 | 1456 | -3231 | -0.1076605245 | -0.689353531 |
| ["COUNTRY = france"] | 6202 | 1947 | -4255 | -0.1417813468 | -0.68606901 |
| ["not COUNTRY = usa"] | 12207 | 3882 | -8325 | -0.2773982873 | -0.6819857459 |
+---------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+---------------+
Note
Étant donné que les données d’entrée sont générées de manière aléatoire, vos résultats seront différents de ceux ci-dessus.
La sortie est ordonnée par CONTRIBUTION, avec le segment Global toujours en tête. La colonne CONTRIBUTOR contient un tableau de chaînes décrivant le segment ; le reste des colonnes quantifie la manière dont ce segment contribue à la valeur métrique. Pour plus de détails, voir Interprétation des résultats.
Dans l’exemple de sortie ci-dessus, le simple fait d’être aux États-Unis a le plus grand impact sur la mesure. Deux segments supplémentaires, basés sur les secteurs verticaux de la finance et de l’automobile aux États-Unis, ont également un impact considérable. Après cela, la contribution des segments devient négative.
Exemple d’analyse verticale¶
Cet exemple compare l’utilisation du crédit des entreprises de deux régions, USA et EMEA, dans le but de comprendre comment l’utilisation du crédit dans chaque segment diffère selon les régions.
Créez la table d’entrée contenant des données synthétiques pour cet exemple à l’aide des instructions SQL suivantes.
CREATE OR REPLACE TABLE vertical_input_table(
region VARCHAR, industry VARCHAR, num_employee NUMBER, credits FLOAT);
INSERT INTO vertical_input_table
SELECT
'USA' as region,
['technology', 'finance', 'healthcare', 'consumer'][MOD(ABS(RANDOM()), 4)] as industry,
UNIFORM(100, 10000, RANDOM()) as num_employee,
UNIFORM(1000, 3000, RANDOM()) AS credits,
FROM TABLE(GENERATOR(ROWCOUNT => 450));
INSERT INTO vertical_input_table
SELECT
'EMEA' as region,
['technology', 'finance', 'healthcare', 'consumer'][MOD(ABS(RANDOM()), 4)] as industry,
UNIFORM(100, 10000, RANDOM()) as num_employee,
UNIFORM(100, 5000, RANDOM()) AS credits,
FROM TABLE(GENERATOR(ROWCOUNT => 350));
Créez une vue avec une colonne d’étiquette basée sur la région.
CREATE OR REPLACE VIEW vertical_input_view AS (
SELECT
credits,
industry,
num_employee,
region = 'EMEA' AS label
FROM vertical_input_table
);
Analysez maintenant ces données en appelant la méthode GET_DRIVERS d’une instance TOP_INSIGHTS.
CREATE OR REPLACE SNOWFLAKE.ML.TOP_INSIGHTS my_insights_model();
CALL my_insights_model!get_drivers(
INPUT_DATA => TABLE(vertical_input_view),
LABEL_COLNAME => 'label',
METRIC_COLNAME => 'credits'
);
La sortie ressemble à ce qui suit :
+-------------------------------------------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+------------------+|
| CONTRIBUTOR | METRIC_CONTROL | METRIC_TEST | CONTRIBUTION | RELATIVE_CONTRIBUTION | GROWTH_RATE |
|-------------------------------------------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+------------------|
| ["Overall"] | 896672 | 895326 | -1346 | 1 | -0.001501106313 |
| ["not INDUSTRY = consumer","NUM_EMPLOYEE <= 6248.0","NUM_EMPLOYEE > 4235.0"] | 141138 | 70337 | -70801 | 52.601040119 | -0.5016437813 |
| ["NUM_EMPLOYEE <= 6248.0","NUM_EMPLOYEE > 4235.0"] | 188770 | 127320 | -61450 | 45.653789004 | -0.3255284208 |
| ["not INDUSTRY = technology","NUM_EMPLOYEE <= 8670.0","NUM_EMPLOYEE > 7582.5"] | 100533 | 42925 | -57608 | 42.799405646 | -0.5730257726 |
| ["not INDUSTRY = consumer","NUM_EMPLOYEE <= 5562.5","NUM_EMPLOYEE > 4235.0"] | 103851 | 47052 | -56799 | 42.198365527 | -0.54692781 |
+-------------------------------------------------------------------------------------------------------+----------------+-------------+--------------+-----------------------+------------------+
Note
Étant donné que les données d’entrée sont générées de manière aléatoire, vos résultats seront différents de ceux ci-dessus.
La sortie est ordonnée par CONTRIBUTION, avec le segment Global toujours en tête. La colonne CONTRIBUTOR contient un tableau de chaînes décrivant le segment ; le reste des colonnes décrit comment ce segment contribue à la valeur métrique. Pour plus de détails, voir <instance_name>!GET_DRIVERS.
Dans l’exemple de sortie ci-dessus, vous pouvez voir que les segments sont basés sur le secteur d’activité et le nombre d’employés du client. Top Insights sélectionne automatiquement ces plages pour les dimensions continues. Les clients d’une certaine taille (entre 4 000 et 6 000 employés environ) semblent avoir un impact négatif démesuré.
Limites actuelles¶
La mesure d’entrée doit être une observation individuelle ou un agrégat.
Pour les fonctionnalités catégoriques comportant plus de 25 valeurs, Top Insights utilise uniquement les 25 valeurs les plus influentes pour créer des segments.
Le traitement de plus de 100 millions de lignes dans une seule tâche peut épuiser la mémoire, même avec des entrepôts optimisés pour Snowpark.
Avis juridiques¶
Important
Mention légale. Cette fonction Snowflake ML est alimentée par une technologie de machine learning. La technologie de machine learning et les résultats fournis peuvent être inexacts, incorrects ou biaisés. Les décisions basées sur les résultats du machine learning, y compris celles qui sont intégrées dans des pipelines automatiques, devraient être soumises à une supervision humaine et à des processus d’examen pour s’assurer que le contenu généré par le modèle est exact. Les requêtes de fonctions Snowflake Cortex ML seront traitées comme toute autre requête SQL et peuvent être considérées comme des métadonnées.
Métadonnées. Lorsque vous utilisez des fonctions Snowflake Cortex ML, Snowflake enregistre les messages d’erreur génériques renvoyés par une fonction ML. Ces journaux d’erreurs nous aident à résoudre les problèmes qui surviennent et à améliorer ces fonctions pour mieux répondre à vos demandes.
Pour plus d’informations, voir la FAQ relative à la confiance et à la sécurité concernant l’AI de Snowflake.