From f6960bb9eecc9156d19faa502faf84fe6ce8bd85 Mon Sep 17 00:00:00 2001 From: AgentDS Date: Sat, 9 Dec 2023 02:06:12 -0500 Subject: [PATCH] add feddata visualization code and readme tutorial --- README.md | 38 ++++++++ fedlab/utils/dataset/functional.py | 86 ++++++++++++++++++ .../imgs/feddata-scatterplot-vis.png | Bin 0 -> 19341 bytes .../imgs/train_vis-noniid-labeldir.png | Bin 0 -> 32845 bytes 4 files changed, 124 insertions(+) create mode 100644 tutorials/Datasets-DataPartitioner-tutorials/imgs/feddata-scatterplot-vis.png create mode 100644 tutorials/Datasets-DataPartitioner-tutorials/imgs/train_vis-noniid-labeldir.png diff --git a/README.md b/README.md index 645ef350..338db335 100644 --- a/README.md +++ b/README.md @@ -276,6 +276,44 @@ Non-iid partition used in [[1]](#1). Data example for 4 clients could be shown a +### Partition Visualization + +For data distribution visualization in data partition, we provide `fedlab.utils.dataset.functional.feddata_scatterplot()` for users' convenience. + +Visualization for synthetic partition code below: +```python +import numpy as np +from matplotlib import pyplot as plt +from fedlab.utils.dataset.functional import feddata_scatterplot + +sample_num = 15 +class_num = 4 +clients_num = 3 +num_per_client = int(sample_num/clients_num) +labels = np.random.randint(class_num, size=sample_num) # generate 15 labels, each label is 0 to 3 +rand_per = np.random.permutation(sample_num) +# partition synthetic data into 3 clients +data_indices = {0: rand_per[0:num_per_client], + 1: rand_per[num_per_client:num_per_client*2], + 2: rand_per[num_per_client*2:num_per_client*3]} +title = 'Data Distribution over Clients for Each Class' +fig = feddata_scatterplot(labels.tolist(), + data_indices, + clients_num, + class_num, + figsize=(6, 4), + max_size=200, + title=title) +plt.show(fig) +fig.savefig(f'imgs/feddata-scatterplot-vis.png') +``` +

+ + +Visualization result for CIFAR-10 Dirichlet Non-IID with $\alpha=0.6$ on 5 clients: +

+ + ## Performance & Insights We provide the performance report of several reproduced federated learning algorithms to illustrate the correctness of FedLab in simulation. Furthermore, we describe several insights FedLab could provide for federated learning research. Without loss of generality, this section's experiments are conducted on partitioned MNIST datasets. The conclusions and observations in this section should still be valid in other data sets and scenarios. diff --git a/fedlab/utils/dataset/functional.py b/fedlab/utils/dataset/functional.py index 03c24556..10551211 100644 --- a/fedlab/utils/dataset/functional.py +++ b/fedlab/utils/dataset/functional.py @@ -14,6 +14,9 @@ import numpy as np import pandas as pd +import seaborn as sns +import pandas as pd +from matplotlib import pyplot as plt import warnings from collections import Counter @@ -599,3 +602,86 @@ def partition_report(targets, data_indices, class_num=None, verbose=True, file=N print(stats_df) return stats_df + + +def feddata_scatterplot( + targets, + client_dict, + num_clients, + num_classes, + figsize=(6, 4), + max_size=200, + title=None, +): + """Visualize the data distribution for each client and class in federated setting. + + Args: + targets (_type_): List of labels, with each entry as integer number. + client_dict (_type_): Dictionary contains sample index list for each client, ``{ client_id: indices}`` + num_clients (_type_): Number of total clients + num_classes (_type_): Number of total classes + figsize (tuple, optional): Figure size for scatter plot. Defaults to (6, 4). + max_size (int, optional): Max scatter marker size. Defaults to 200. + title (str, optional): Title for scatter plot. Defaults to None. + + Returns: + Figure: matplotlib figure object + + Examples: + First generate data partition: + + >>> sample_num = 15 + >>> class_num = 4 + >>> clients_num = 3 + >>> num_per_client = int(sample_num/clients_num) + >>> labels = np.random.randint(class_num, size=sample_num) # generate 15 labels, each label is 0 to 3 + >>> rand_per = np.random.permutation(sample_num) + >>> # partition synthetic data into 3 clients + >>> data_indices = {0: rand_per[0:num_per_client], + ... 1: rand_per[num_per_client:num_per_client*2], + ... 2: rand_per[num_per_client*2:num_per_client*3]} + + + Now generate visualization for this data distribution: + >>> title = 'Data Distribution over Clients for Each Class' + >>> fig = feddata_scatterplot(labels.tolist(), + ... data_indices, + ... clients_num, + ... class_num, + ... figsize=(6, 4), + ... max_size=200, + ... title=title) + >>> plt.show(fig) # Show the plot + >>> fig.savefig(f'feddata-scatterplot-vis.png') # Save the plot + """ + palette = sns.color_palette("Set2", num_classes) + report_df = partition_report( + targets, client_dict, class_num=num_classes, verbose=True + ) + sample_stats = report_df.values[:, 1 : 1 + num_classes] + min_max_ratio = np.min(sample_stats) / np.max(sample_stats) + data_tuples = [] + for cid in range(num_clients): + for k in range(num_classes): + data_tuples.append((cid, k, sample_stats[cid, k] / np.max(sample_stats))) + + df = pd.DataFrame(data_tuples, columns=["Client", "Class", "Samples"]) + plt.figure(figsize=figsize) + scatter = sns.scatterplot( + data=df, + x="Client", + y="Class", + size="Samples", + hue="Class", + palette=palette, + legend=False, + sizes=(max_size * min_max_ratio, max_size), + ) + + # Customize the axes and layout + plt.xticks(range(num_clients), [f"Client {cid+1}" for cid in range(num_clients)]) + plt.yticks(range(num_classes), [f"Class {k+1}" for k in range(num_classes)]) + plt.xlabel("Clients") + plt.ylabel("Classes") + plt.title(title) + return plt.gcf() diff --git a/tutorials/Datasets-DataPartitioner-tutorials/imgs/feddata-scatterplot-vis.png b/tutorials/Datasets-DataPartitioner-tutorials/imgs/feddata-scatterplot-vis.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0e9cc1d90149ae11395011a327ef884f2c4ffe GIT binary patch literal 19341 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