Privacy Preservation in the Age of Synthetic Data - Part I

Yashwardhan RathoreYashwardhan Rathore
Yashwardhan Rathore
October 18, 2023
Privacy Preservation in the Age of Synthetic Data - Part I
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

In the age of data-driven decisions, preserving individual privacy is crucial. With the rapid growth of data usage, protecting sensitive information, especially in datasets with confidential details like finance or health data, is vital. As synthetic data techniques like GANs and GPT models become prominent, ensuring data privacy becomes a top concern. Synthetic data holds immense promise in mitigating privacy risks, but its effectiveness hinges on applying robust privacy risk metrics. 

In this blog, we delve into the necessity of privacy risk metrics on synthetic data post-generation and the theoretical and practical implementation of these metrics, drawing intriguing parallels with real-world datasets. In an era where data breaches and privacy concerns make headlines all too often, understanding and implementing effective privacy risk metrics are pivotal. But what do privacy metrics entail, and why are they indispensable when working with synthetic data? We demystify the intricacies of k-anonymity, l-diversity, and t-closeness – the cornerstones of privacy assessment – and uncover their roles in fortifying privacy standards and harnessing synthetic datasets' full potential. 

Whether you're a data scientist, a privacy advocate, or simply curious about the delicate interplay between data utility and confidentiality, this exploration offers insights into our data-rich world.

The Need for Privacy Risk Metrics on Synthetic Data: 

Consider a scenario where a financial institution aims to develop predictive models for credit scoring while adhering to privacy regulations. The bank holds a treasure trove of customer data containing confidential financial records. In an effort to maintain compliance and prevent data leakage, the bank employs synthetic data generation techniques to create a simulated dataset for model training. However, merely generating synthetic data is not enough; ensuring that individuals' privacy remains intact is paramount. Synthetic data is a double-edged sword—it has the potential to offer anonymized insights while still preserving the distributional properties of the original data. Yet, without privacy risk metrics, the organization cannot ascertain the level of protection offered by the synthetic dataset. 

Privacy metrics such as k-anonymity, l-diversity, and t-closeness systematically measure and evaluate the extent to which individual identities and sensitive attributes remain secure in the synthetic dataset. By quantifying the privacy risk, organizations can confidently gauge the effectiveness of their synthetic data generation processes and make informed decisions about the data's usability.

Understanding Privacy Metrics: 

k-Anonymity, l-Diversity, and t-Closeness

To quantify the level of privacy protection offered by synthetic datasets, we dive deep into the theoretical foundations of three essential privacy metrics: k-anonymity, l-diversity, and t-closeness. These metrics form the bedrock of evaluating the effectiveness of synthetic data in preserving privacy while maintaining data utility.

1. k-Anonymity: Striving for Indistinguishability within Groups at its core, k-anonymity is a privacy metric designed to thwart re-identification attacks by ensuring that each record in a dataset is indistinguishable from at least 'k' other records. In simpler terms, it requires that a group of 'k' individuals share the same attributes, making it impossible to single out an individual within that group. Achieving k-anonymity involves generalizing or suppressing attributes to create equivalence classes, which contain 'k' or more individuals. The premise is that the larger the value of 'k,' the more challenging it becomes to re-identify an individual as they blend into a larger crowd. While k-anonymity enhances privacy, it can potentially sacrifice data utility as excessive generalization may obscure important information. 

An example to explain k-Anonymity : 

Imagine you have a dataset that contains information about people's ages, genders, and incomes. Let's say you want to share this data for research purposes, but you don't want anyone to figure out who the individuals are. Here's where k-anonymity comes in. Think of 'k' as a magic number representing a group of people. Let's say we choose 'k' to be 5. To achieve k-anonymity, we must ensure that within every group of 5 or more people, at least 5 individuals share the same ages, genders, and income ranges. 

For instance, in your original dataset, you might have five people: Alice (30, Female, $50,000), Bob (28, Male, $45,000), Carol (32, Female, $48,000), David (29, Male, $47,000), and Emma (31, Female, $49,000). If we group them, you can see that Alice, Carol, and Emma have the same age range (around 30), gender (Female), and income range (around $48,000). This group of three individuals meets the k-anonymity requirement of 'k' being 5, because they share similar attributes, making it tough to identify one person within the group. Making these groups, or "equivalence classes," makes it much harder for someone to figure out who each person is. However, remember that while k-anonymity boosts privacy, too much grouping might make the data less useful for certain detailed analyses.



import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans


# Data for the individuals and their attributes
names = ['Alice', 'Bob', 'Carol', 'David', 'Emma']  # Names of individuals
ages = [30, 28, 32, 29, 31]  # Ages of individuals
incomes = [50000, 45000, 48000, 47000, 49000]  # Incomes of individuals


# Combine attributes for clustering
attributes = np.array(list(zip(ages, incomes)))


# Perform K-means clustering with k = 2 (2 clusters to represent 'k' of 5)
kmeans = KMeans(n_clusters=2, n_init=10)
kmeans.fit(attributes)
labels = kmeans.labels_


# Define your own colors for the clusters
cluster_colors = ['blue', 'green']


# Create a scatter plot with color coding for clusters
plt.figure(figsize=(6, 4))


# Create separate scatter plots for each cluster and provide labels
for label in set(labels):
    cluster_indices = np.where(labels == label)[0]
    cluster_names = [names[i] for i in cluster_indices]
    cluster_ages = [ages[i] for i in cluster_indices]
    cluster_incomes = [incomes[i] for i in cluster_indices]
    cluster_color = cluster_colors[label]
    plt.scatter(cluster_ages, cluster_incomes, c=[cluster_color], label=f'Cluster {label + 1}: {", ".join(cluster_names)}', s=100)


# Create scatter plots for individuals within clusters
for i, name in enumerate(names):
    cluster_color = cluster_colors[labels[i]]
    plt.scatter(ages[i], incomes[i], c=[cluster_color], s=100)


plt.xlabel('Age')
plt.ylabel('Income')
plt.title('K-Anonymity Visualisation')
plt.legend()
plt.show()

2. l-Diversity: Enhancing Privacy through Attribute Diversity Building upon the foundation of k-anonymity, l-diversity introduces an additional layer of privacy by ensuring that within each equivalence class, there are at least 'l' distinct values for sensitive attributes. In other words, l-diversity strives to prevent attribute disclosure attacks, where an adversary could infer sensitive information by exploiting the homogeneity of sensitive attributes within a group. By requiring a certain degree of diversity, l-diversity hinders attackers from drawing conclusions about the distribution of sensitive attributes within the equivalence classes. However, achieving l-diversity can be challenging, as it demands a careful balance between privacy protection and data utility. 

An example to explain l-Diversity :

Picture a scenario where you want to share information about people's medical conditions while keeping their identities hidden. While k-anonymity groups individuals based on similar attributes, it might not be enough to fully protect sensitive data. This is where l-diversity steps in. Imagine 'l' as a special rule that ensures each data group contains various medical conditions.

Let's say we have a group of people with similar ages, genders, and incomes, just like before. Now, let's add one more detail: their medical conditions. In the original dataset, we have Alice, who has diabetes, Bob with asthma, Carol with allergies, David with hypertension, and Emma with arthritis. With l-diversity, we want to ensure that within each group, like the one we formed for k-anonymity, there's a mix of different medical conditions. For example, if we have a group of three individuals (Alice, Bob, and Carol), we can see they have different medical conditions: diabetes, asthma, and allergies. This diversity in medical conditions helps protect against attackers who might try to guess someone's condition based on shared attributes. But just like with k-anonymity, it's a delicate balance. Too much diversity might make the data too vague, while too little might compromise privacy.



import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans


# Data for the individuals and their attributes
names = ['Alice', 'Bob', 'Carol', 'David', 'Emma']  # Names of individuals
ages = [30, 28, 32, 29, 31]  # Ages of individuals
incomes = [50000, 45000, 48000, 47000, 49000]  # Incomes of individuals
medical_conditions = ['Diabetes', 'Asthma', 'Allergies', 'Hypertension', 'Arthritis']  # Medical conditions of individuals


# Combine attributes for clustering
attributes = np.array(list(zip(ages, incomes)))


# Perform K-means clustering with k = 2 (2 clusters for visualization)
kmeans = KMeans(n_clusters=2, n_init=10)
kmeans.fit(attributes)
labels = kmeans.labels_


# Define your own list of colors for medical conditions and clusters
condition_colors = ['blue', 'green', 'orange', 'red', 'purple']
cluster_colors = ['lightblue', 'lightgreen']


# Create a scatter plot with color coding for clusters and medical conditions
plt.figure(figsize=(6,4))


# Create separate scatter plots for each medical condition and provide labels
for i, condition in enumerate(medical_conditions):
    condition_indices = [j for j, cond in enumerate(medical_conditions) if cond == condition]
    condition_names = [names[j] for j in condition_indices]
    condition_ages = [ages[j] for j in condition_indices]
    condition_incomes = [incomes[j] for j in condition_indices]
    plt.scatter(condition_ages, condition_incomes, c=[condition_colors[i]], label=f'{condition}', s=100)


# Create a scatter plot with color coding for clusters
for i, name in enumerate(names):
    plt.scatter(ages[i], incomes[i], c=[cluster_colors[labels[i]]], s=100, marker='x')  # Use a different marker for clusters


plt.xlabel('Age')
plt.ylabel('Income')
plt.title('L-Diversity Clustering')
plt.legend()
plt.tight_layout()
plt.show()

In essence, l-diversity goes beyond just blending people together; it ensures that even within the groups, there's a range of different sensitive attributes, making it even harder for anyone to figure out personal details.

3. t-Closeness: Balancing Privacy and Similarity to Original Data While k-anonymity and l-diversity focus on obscuring individual identities and sensitive attributes, t-closeness takes a different approach. It aims to ensure that the distribution of sensitive attribute values in each equivalence class is not significantly different from the overall dataset's distribution. In simpler terms, t-closeness guards against information leakage by ensuring that the synthetic data maintains a certain level of similarity to the original data. This metric acknowledges that excessively altering attribute distributions can lead to data that lacks practical utility.

An example to explain t-Closeness :

With t-closeness, we aim to ensure that within each group, the distribution of different medical conditions is similar to what we see in the whole dataset. 

Imagine the original data shows that diabetes is a common condition, followed by asthma, allergies, hypertension, and arthritis in that order. If we're creating synthetic data, t-closeness ensures that the proportions of these conditions within each group match the proportions in the overall dataset. So, if diabetes makes up 40% of the original data, a synthetic group should also have around 40% diabetes cases, and so on. 

For instance, consider our familiar group of Alice, Bob, and Carol. If the original data had more cases of asthma and allergies than diabetes, t-closeness ensures that the synthetic group maintains a similar distribution. This helps prevent situations where the synthetic data strays too far from reality while still protecting individual privacy. 


import matplotlib.pyplot as plt


# Data for medical conditions and their proportions in the original dataset
conditions = ['Diabetes', 'Asthma', 'Allergies', 'Hypertension', 'Arthritis']
original_proportions = [0.40, 0.15, 0.10, 0.20, 0.16]  # Proportions in the original dataset


# Proportions in the synthetic group (example values)
synthetic_proportions = [0.35, 0.20, 0.15, 0.15, 0.15]


# Create a bar chart to compare the distribution of medical conditions
plt.figure(figsize=(6,4))
plt.bar(conditions, original_proportions, color='green', alpha=0.7, label='Original Data')
plt.bar(conditions, synthetic_proportions, color='purple', alpha=0.7, label='Synthetic Group')
plt.xlabel('Medical Conditions')
plt.ylabel('Proportion')
plt.title('T-Closeness Visualization')
plt.legend()
plt.show()

In short, t-closeness acts as a bridge between safeguarding privacy and preserving the overall picture of the original data, making sure that synthetic data stays both useful and true to life.

Stay tuned for the upcoming Part II of this blog series.

See how AryaXAI improves
ML Observability

Learn how to bring transparency & suitability to your AI Solutions, Explore relevant use cases for your team, and Get pricing information for XAI products.