Comment Générer des Données Synthétiques : Guide Complet Utilisant l'Échantillonnage Bayésien et les Distributions Univariées
Guide Complet pour la Génération de Données Synthétiques : Échantillonnage Bayésien et Distributions Univariables La génération de données synthétiques est une solution puissante lorsque les observations réelles sont rares, coûteuses ou difficiles à recueillir. Elle permet de créer des données artificielles qui reflètent les propriétés statistiques des observations réelles. Dans cet article, nous explorerons deux techniques pour générer des données synthétiques : l'échantillonnage bayésien et l'échantillonnage de distributions univariables. Nous montrerons également comment générer des données uniquement à partir des connaissances d'experts. Tous les exemples pratiques sont réalisés à l'aide des bibliothèques bnlearn et distfit. Introduction aux Données Synthétiques Au cours de la dernière décennie, la quantité de données a explosé, mais il est devenu évident que la qualité des données est plus importante que la quantité. De meilleures données permettent de tirer des conclusions plus précises et de prendre des décisions mieux informées. Dans de nombreux domaines tels que la santé, la finance, la cybersécurité et les systèmes autonomes, les données réelles peuvent être sensibles, coûteuses, déséquilibrées ou difficiles à recueillir, surtout pour des scénarios rares ou particuliers. Là où les données réelles manquent, les données synthétiques offrent une alternative précieuse. Des entreprises comme Gartner prédissent même que les données synthétiques surpasseront bientôt les données réelles. Il existe principalement deux catégories de création de données synthétiques : probabilistes et génératives. Cet article se concentre sur les méthodes probabilistes, où le but est d'estimer la distribution sous-jacente pour reproduire un jeu de données existant ou en générer un nouveau à partir des connaissances d'un expert. Comprendre les Fonctions de Densité de Probabilité (PDF) Les fonctions de densité de probabilité (PDF) décrivent la probabilité qu'une variable continue prenne une valeur spécifique. Elles ont des formes caractéristiques, comme des courbes en cloche, des décroissances exponentielles ou des répartitions uniformes. Pour générer des données synthétiques, il est essentiel que la forme de la PDF corresponde au comportement de la variable réelle. L'outil distfit peut aider à trouver la meilleure distribution théorique en analysant un large éventail de distributions univariées, en ajustant celles-ci aux variables du jeu de données et en les classant selon des métriques de qualité d'ajustement telles que la statistique Kolmogorov-Smirnov ou le log-vraisemblance. Cela permet de sélectionner la meilleure distribution sans s'appuyer sur l'intuition ou des essais infructueux. Génération de Données Synthétiques Continues Nous allons explorer deux approches pour la génération de données synthétiques continues, avec l'hypothèse que les variables sont indépendantes les unes des autres. L'une part d'un jeu de données existant, tandis que l'autre se base uniquement sur les connaissances d'experts. 1. Génération de Données Continues Synthétiques à Partir d’un Jeu de Données Existants Nous utiliserons le jeu de données de maintenabilité prédictive, qui comprend des mesures de variables continues telles que laTorque (couple). Le premier pas consiste à charger le jeu de données et à visualiser les mesures de Torque. ```python from distfit import distfit import matplotlib.pyplot as plt Importer le jeu de données df = distfit().import_example(data='predictive_maintenance') Visualisation des mesures de Torque dfit = distfit() dfit.lineplot(df['Torque [Nm]'], xlabel='Temps', ylabel='Couple [Nm]', title='Mesures de Couple') ``` La plage de valeurs des 10 000 points de mesure est principalement entre 20 et 50 Nm, avec quelques valeurs critiques au-delà. Ensuite, nous utiliserons distfit pour rechercher la meilleure distribution univariée qui s'adapte à ces mesures. ```python dfit = distfit(distr='popular', n_boots=100) dfit.fit_transform(df['Torque [Nm]']) fig, ax = plt.subplots(1, 2, figsize=(25, 10)) dfit.plot(chart='PDF', n_top=10, ax=ax[0]) dfit.plot(chart='CDF', n_top=10, ax=ax[1]) plt.show() ``` La distribution Loggamma est identifiée comme la meilleure (voir Figure 4). Avec les paramètres estimés (c=835.7, loc=-1900.07, scale=288.36), nous pouvons générer 200 échantillons synthétiques. python X = dfit.generate(200) dfit.lineplot(X, xlabel='Temps', ylabel='Couple [Nm] Synthétique', title='Données Synthétiques') Ce modèle offre de nombreuses opportunités, notamment pour tester l'efficacité des pipelines d'apprentissage automatique sous des conditions opérationnelles rares ou critiques, ou pour augmenter la taille d'un jeu de données réduit. 2. Génération de Données Continues Synthétiques à Partir des Connaissances d’Experts Supposons que des experts décrivent la façon dont les opérations de machinerie varient au cours de la journée. Ils nous fournissent les suivantes informations : Matin : La plupart des opérations commencent à 8 heures, atteignent leur pic vers 10 heures, avec peu d'opérations avant 8 heures. Après-midi : Les opérations diminuent progressivement et s'arrêtent vers 18 heures, avec un petit pic autour de 13-14 heures. Nous pouvons modéliser ces opérations en utilisant une distribution Normale pour le matin et une distribution Gamma généralisée pour l'après-midi. ```python import numpy as np from scipy.stats import norm, gengamma import matplotlib.pyplot as plt Définir les paramètres np.random.seed(1) normal_samples = norm.rvs(10, 1, 8000) # Matin gamma_dist = gengamma(a=1.4, c=1, scale=0.8, loc=13) gamma_samples = gamma_dist.rvs(size=2000) # Après-midi Combinaison des échantillons X = np.concatenate((normal_samples, gamma_samples)) np.random.shuffle(X) Tracer l'histogramme plt.figure(figsize=(20, 15)) plt.hist(X, bins=100, color='#607B8B', linewidth=1, edgecolor='#5A5A5A') plt.grid(True) plt.xlabel('Heure', fontsize=22) plt.ylabel('Intensité des Opérations de Machinerie', fontsize=22) plt.title('Distribution des Opérations de Machinerie au Cours de la Journée', fontsize=22) plt.show() ``` L'histogramme obtenu (voir Figure 8) montre des pics à 10 heures et 13-14 heures, respectant ainsi les observations des experts. Génération de Données Synthétiques Catégorielles Dans cette section, nous explorons la génération de données synthétiques catégorielles, en supposant que les variables sont dépendantes les unes des autres. Les modèles bayésiens sont particulièrement adaptés pour ce type de tâche. 1. Génération de Données Catégorielles Synthétiques à Partir d’un Jeu de Données Existants Nous utiliserons à nouveau le jeu de données de maintenabilité prédictive, mais cette fois en nous concentrant sur les variables catégorielles. ```python import bnlearn as bn Charger le jeu de données df = bn.import_example('predictive_maintenance') cols = ['Type', 'Machine failure', 'TWF', 'HDF', 'PWF', 'OSF', 'RNF'] df = df[cols] Apprendre la structure Bayésienne model = bn.structure_learning.fit(df, methodtype='hc', scoretype='bic') model = bn.independence_test(model, df, test='chi_square', prune=True) Tracer le DAG bn.plot(model, edge_labels='pvalue', params_static={'maxscale': 4, 'figsize': (15, 15), 'font_size': 14, 'arrowsize': 10}) ``` Le DAG (Directed Acyclic Graph) obtenu (voir Figure 9) représente les relations causales entre les variables. Par exemple, PWF (défaillance de la puissance) est la variable racine, et Machine failure (défaillance de la machine) est la variable cible, qui dépend de plusieurs facteurs. Ensuite, nous utilisons l'apprentissage paramétrique pour estimer les distributions conditionnelles (CPTs) des variables individuelles. ```python model = bn.parameter_learning.fit(model, df, methodtype='bayes') Afficher les CPTs bn.print_CPD(model) Générer des données synthétiques X = bn.sampling(model, n=100, methodtype='bayes') print(X) ``` 2. Génération de Données Catégorielles Synthétiques à Partir des Connaissances d’Experts Cette méthode est utile lorsque nous n'avons pas de jeu de données, mais uniquement des connaissances d'experts. Les experts peuvent nous fournir les informations suivantes : Défaillances de machine : Principalement liées à une température de processus élevée ou à un couple élevé. Défaillance par surcharge : En cas de couple ou de portail usé élevé. Température de processus : Influencée par la température de l'air. Nous construisons le DAG manuellement avec ces informations. ```python import bnlearn as bn from pgmpy.factors.discrete import TabularCPD Définir les relations causales edges = [ ('Temperature de Processus', 'Défaillance de Machine'), ('Couple', 'Défaillance de Machine'), ('Couple', 'Défaillance par Surcharge (OSF)'), ('Portail Usé', 'Défaillance par Surcharge (OSF)'), ('Temperature de l’Air', 'Temperature de Processus'), ('Défaillance par Surcharge (OSF)', 'Défaillance de Machine'), ] Créer le DAG DAG = bn.make_DAG(edges) Définir les CPTs cpt_temp_air = TabularCPD(variable='Temperature de l’Air', variable_card=2, values=[[0.7], [0.3]]) cpt_portail_usé = TabularCPD(variable='Portail Usé', variable_card=2, values=[[0.8], [0.2]]) cpt_couple = TabularCPD(variable='Couple', variable_card=2, values=[[0.9], [0.1]]) cpt_temp_processus = TabularCPD(variable='Temperature de Processus', variable_card=2, values=[[0.7, 0.2], [0.3, 0.8]], evidence=['Temperature de l’Air'], evidence_card=[2]) cpt_osf = TabularCPD(variable='Défaillance par Surcharge (OSF)', variable_card=2, values=[[0.9, 0.5, 0.7, 0.1], [0.1, 0.5, 0.3, 0.9]], evidence=['Couple', 'Portail Usé'], evidence_card=[2, 2]) cpt_defaillance_machine = TabularCPD(variable='Défaillance de Machine', variable_card=2, values=[[0.9, 0.7, 0.6, 0.3, 0.8, 0.5, 0.4, 0.2], [0.1, 0.3, 0.4, 0.7, 0.2, 0.5, 0.6, 0.8]], evidence=['Temperature de Processus', 'Couple', 'Défaillance par Surcharge (OSF)'], evidence_card=[2, 2, 2]) Mettre à jour le DAG avec les CPTs model = bn.make_DAG(DAG, CPD=[cpt_temp_air, cpt_portail_usé, cpt_couple, cpt_temp_processus, cpt_osf, cpt_defaillance_machine]) Générer des données synthétiques X = bn.sampling(model, n=100, methodtype='bayes') print(X) ``` Bibliothèque bnlearn La bibliothèque bnlearn est conçue pour surmonter les défis de l'analyse bayésienne, en proposant des fonctionnalités avancées pour la découverte causale et l'apprentissage de structures. Avantages et Limites des Données Synthétiques Les données synthétiques sont essentielles pour le modélage lorsque les données réelles manquent, sont sensibles ou incomplètes. Cependant, ellesprésentent aussi des limites. Elles peuvent ne pas capturer toute la complexité et variabilité des phénomènes réels, ce qui peut entraîner des modèles qui ne généralisent pas bien. Elles peuvent également introduire des biais si les hypothèses ou les modèles sont incorrects. Il est crucial de réaliser des vérifications approfondies et des validations pour garantir que les données générées correspondent aux attentes du domaine et ne trompent pas l'analyse ultérieure. Conclusion La génération de données synthétiques est une technique puissante qui combine des modèles probabilistes et des connaissances d'experts. Les méthodes basées sur les distributions univariables et l'échantillonnage bayésien sont particulièrement adaptées, respectivement, pour des variables continues indépendantes et des variables catégorielles dépendantes. Grâce à des outils comme bnlearn et distfit, il est possible de créer des jeux de données synthétiques de haute qualité qui permettent de tester et d'améliorer des pipelines d'apprentissage automatique et d'autres modèles de prédiction. Cependant, une attention particulière doit être portée à la validation et au contrôle des biais pour assurer la fiabilité et la généralisation des modèles. Bibliographie Gartner, Maverick Research: Forget About Your Real Data — Synthetic Data Is the Future of AI, Leinar Ramos, Jitendra Subramanyam, 24 juin 2021. E. Taskesen, distfit Python library, How to Find the Best Theoretical Distribution for Your Data. AI4I 2020 Predictive Maintenance Dataset. (2020). UCI Machine Learning Repository. License Creative Commons Attribution 4.0 International (CC BY 4.0). E. Taskesen, bnlearn for Python library. An Extensive Starter Guide For Causal Discovery Using Bayesian Modeling. Connectez-vous ! N'hésitez pas à me suivre pour plus d'articles et de ressources sur la génération de données synthétiques et l'analyse bayésienne.