Back to Headlines

新しい見出し 実データが乏しい場合の解決策:ベイジアンサンプリングと単変量分布を使用した合成データ生成ガイド この記事では、実データが不足している場合にどのように合成データを生成するかを解説します。具体的には、ベイジアンサンプリングと単変量分布サンプリングという2つの強力な手法について、実践的な例を交えて詳しく紹介します。特に、予測保守のためのデータセットを使用して、連続値とカテゴリカル値の両方を持つ合成データの生成方法を説明します。これにより、テストやモデル評価におけるより現実的なシナリオを再現することが可能になります。

3ヶ月前

合成データの生成:ベイジアンサンプリングと単変量分布を用いた包括的なガイド デジタル時代には、データが組織の成功を牽引しています。しかし、観測結果が少ない、コストがかかり、または収集が難しい場合、どうすればよいでしょうか?そういったケースで合成データの出番です。合成データとは、実際の観測値の統計的特性を模倣した人工的に生成されたデータのことです。本記事では、ベイジアンサンプリングや単変量分布サンプリングといった、合成データを生成する2つの強力な手法について紹介します。また、専門家の知識のみからデータを生成するプロセスも説明します。この記事の手順例は、bnlearnとdistfitライブラリを用いて作成されています。 1. 継続的な値を持つ独立変数を模倣する合成データの生成 まず、既存のデータセットから、各変数に対応する最適な理論的分布を推定し、合成データを生成します。予防保全データセット [3] を使用し、トルク測定値の分布を模倣します。このデータセットには5つの継続的な値を持つ変数があり、其中之一がトルクです。トルクの正常範囲は20~50 Nmであり、それ以上の値は機械の負荷を示す可能性があります。 手順例 ```python 必要なライブラリをインポート from distfit import distfit import matplotlib.pyplot as plt distfitライブラリの初期化 dfit = distfit(distr='popular', n_boots=100) データセットのロード df = dfit.import_example(data='predictive_maintenance') モデルの適合 dfit.fit_transform(df['Torque [Nm]']) PDF/CDFのプロット 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() ``` 最も適切な分布はLoggammaであることがわかります。これを使って200個の合成データを生成します。 ```python 合成データの生成 X = dfit.generate(200) データのプロット dfit.lineplot(X, xlabel='時間', ylabel='生成トルク [Nm]', title='合成データ') ``` 2. 専門家の知識を基に継続的な値を持つ独立変数の合成データを生成 次に、データセットがない場合の合成データ生成について説明します。予防保全用に機械の操作時間が与えられ、以下のような専門家からの情報を基にモデルを構築します: 午前8時頃に人々が仕事に着き、機械の操作が午前10時頃にピークを迎えます。 午後になると、操作は徐々に減り、18時頃に停止します。 午後13~14時頃にも小さなピークが見られます。 これらの情報を基に、Normal分布を用いて午前の操作、Generalized Gamma分布を用いて午後の操作をモデル化します。 ```python import numpy as np from scipy.stats import norm, gengamma 再現性のためにシードを設定 np.random.seed(1) 正規分布からサンプリング normal_samples = norm.rvs(10, 1, 8000) 一般化ガンマ分布からサンプリング dist = gengamma(a=1.4, c=1, scale=0.8, loc=13) gamma_samples = dist.rvs(size=2000) サンプルを結合とシャッフル X = np.concatenate((normal_samples, gamma_samples)) np.random.shuffle(X) ヒストグラムの作成と表示 bar_properties={'color': '#607B8B', 'linewidth': 1, 'edgecolor': '#5A5A5A'} plt.figure(figsize=(20, 15)); plt.hist(X, bins=100, **bar_properties) plt.grid(True) plt.xlabel('時間', fontsize=22) plt.ylabel('機械操作の強度', fontsize=22) ``` 結果は、専門家知識に基づく機械の動作分布をよく反映しています。 3. 既存のカテゴリカルデータセットを模倣する合成データの生成 今度は、既存のカテゴリカルデータセットと各特徴量間の依存関係を模倣した合成データを生成します。予防保全データセットを再び使用し、Category LearningとParameter Learningを行います。 手順例 ```python 必要なライブラリをインストール !pip install bnlearn ライブラリのインポート import bnlearn as bn データセットのロード df = bn.import_example('predictive_maintenance') 関連のあるカテゴリカル変数だけを選択 cols = ['Type', 'Machine failure', 'TWF', 'HDF', 'PWF', 'OSF', 'RNF'] df = df[cols] 構造学習 model = bn.structure_learning.fit(df, methodtype='hc', scoretype='bic') 独立性テストによるエッジの重みの計算 model = bn.independence_test(model, df, test='chi_square', prune=True) DAGの表示 bn.plot(model, edge_labels='pvalue', params_static={'maxscale': 4, 'figsize': (15, 15), 'font_size': 14, 'arrowsize': 10}) dotgraph = bn.plot_graphviz(model, edge_labels='pvalue') dotgraph.view(filename='bnlearn_predictive_maintenance.pdf') ``` 得られたDAGは、専門家が提供した知識と一致しています。次に、各ノードの条件付き確率分布(CPD)を推定し、合成データを生成します。 ```python パラメータ学習 model = bn.parameter_learning.fit(model, df, methodtype='bayes') 合成データの生成 X = bn.sampling(model, n=100, methodtype='bayes') print(X) ``` 4. 専門家の知識を基に依存関係のあるカテゴリカルデータの合成データを生成 最後に、データセットが不存在でも専門家知識のみから依存関係のあるデータを生成する方法を紹介します。予防保全システムの機械故障を理解するための使用例を以下に示します。 手順例 ```python 因果関係を定義 edges = [('Process Temperature', 'Machine Failure'), ('Torque', 'Machine Failure'), ('Torque', 'Overstrain Failure (OSF)'), ('Tool Wear', 'Overstrain Failure (OSF)'), ('Air Temperature', 'Process Temperature'), ('Overstrain Failure (OSF)', 'Machine Failure')] DAGの作成 DAG = bn.make_DAG(edges) DAGの表示 bn.plot(DAG) dotgraph = bn.plot_graphviz(DAG) dotgraph.view(filename='bnlearn_predictive_maintanance_expert.pdf') 各ノードのCPTを設定 cpt_air_temp = TabularCPD(variable='Air Temperature', variable_card=2, values=[[0.7], [0.3]]) cpt_toolwear = TabularCPD(variable='Tool Wear', variable_card=2, values=[[0.8], [0.2]]) cpt_torque = TabularCPD(variable='Torque', variable_card=2, values=[[0.9], [0.1]]) cpt_process_temp = TabularCPD(variable='Process Temperature', variable_card=2, values=[[0.7, 0.2], [0.3, 0.8]], evidence=['Air Temperature'], evidence_card=[2]) cpt_osf = TabularCPD(variable='Overstrain Failure (OSF)', variable_card=2, values=[[0.9, 0.5, 0.7, 0.1], [0.1, 0.5, 0.3, 0.9]], evidence=['Torque', 'Tool Wear'], evidence_card=[2, 2]) cpt_machine_fail = TabularCPD(variable='Machine Failure', 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=['Process Temperature', 'Torque', 'Overstrain Failure (OSF)'], evidence_card=[2, 2, 2]) DAGにCPTを更新 model = bn.make_DAG(DAG, CPD=[cpt_process_temp, cpt_machine_fail, cpt_torque, cpt_osf, cpt_toolwear, cpt_air_temp]) 合成データの生成 X = bn.sampling(model, n=100, methodtype='bayes') print(X) ``` 結論 合成データは、実際のデータが利用できない、敏感すぎる、または不完全な場合のモデリングにおいて重要な役割を果たします。予防保全の分野での使用例を示しましたが、プライバシーの管理やサイバーセキュリティにおけるレアイベントのモデリングなど、他の分野でも広く利用できます。本記事では、確率密度関数(PDF)とベイジアンサンプリングを用いた合成データの生成方法について説明しました。PDFは継続的な変数の生成に用いられ、変数同士の独立性を仮定します。一方、ベイジアンサンプリングはカテゴリカルデータの生成に適しており、変数間の依存関係を模倣することができます。 ただし、生成された合成データには限界も存在します。実世界の現象の複雑さと多様性を十分に捉えることができず、モデルが一般化することができないことがあります。また、誤った仮定や単純化されたモデル、パラメータの不適切な推定により、バイアスが導入される可能性もあります。このような理由から、生成データが域内の期待に合致しており、分析に影響を与えないことを確認するための厳しい検証とバリデーションが必要です。 参考文献 Gartner, Maverick Research: Forget About Your Real Data — Synthetic Data Is the Future of AI, Leinar Ramos, Jitendra Subramanyam, 24 June 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. Licensed under a 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. bnlearnライブラリの概要 bnlearnライブラリは、因果関係の発見とベイジアンネットワークのモデリングに特化したツールです。このライブラリを使うことで、データの依存関係を効率的に学習し、合成データを生成することができます。bnlearnはHillClimbSearchやBayesian Information Criterion (BIC)など、各種アルゴリズムを用いて最適なDAGを見つける機能を提供しています。また、他のベイジアン分析実装と比較して、より直感的なAPIと豊富な可視化オプションが特徴となっています。

Related Links

新しい見出し 実データが乏しい場合の解決策:ベイジアンサンプリングと単変量分布を使用した合成データ生成ガイド この記事では、実データが不足している場合にどのように合成データを生成するかを解説します。具体的には、ベイジアンサンプリングと単変量分布サンプリングという2つの強力な手法について、実践的な例を交えて詳しく紹介します。特に、予測保守のためのデータセットを使用して、連続値とカテゴリカル値の両方を持つ合成データの生成方法を説明します。これにより、テストやモデル評価におけるより現実的なシナリオを再現することが可能になります。 | ヘッドライン | HyperAI超神経