ai-privacy-toolkit/notebooks/dataset_assessment_nursery.ipynb
andersonm-ibm 782edabd58
Add dataset privacy risk assessment example notebook. (#73)
* Add dataset assessment notebook and reference to module from project README

Signed-off-by: Maya Anderson <mayaa@il.ibm.com>
2023-05-04 12:21:42 +03:00

402 lines
58 KiB
Text

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"# Using AI privacy dataset assessment"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"In this tutorial we will show how to perform privacy risk analysis of synthetic datasets for ML models using the dataset assessment module.\n",
"\n",
"This will be demonstrated using the Nursery dataset (original dataset can be found here: https://archive.ics.uci.edu/ml/datasets/nursery).\n",
"\n",
"The method `get_nursery_dataset_pd()` preprocesses the data such that all categorical features are one-hot encoded, and all the features are scaled."
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## Load data\n",
"Load the nursery dataset with preprocessing and divided into a training and a test (holdout) dataset."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import sys\n",
"sys.path.insert(0, os.path.abspath('..'))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from apt.utils.dataset_utils import get_nursery_dataset_pd\n",
"\n",
"(x_train, y_train), (x_test, y_test) = get_nursery_dataset_pd(raw=False)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"### A simplistic synthetic data generator\n",
"We are using here a simple synthetic data generator just for testing purposes."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"from sklearn.neighbors import KernelDensity\n",
"from sklearn.model_selection import GridSearchCV\n",
"from sklearn.decomposition import PCA\n",
"import numpy as np\n",
"\n",
"\n",
"def kde(n_samples, n_components, original_data):\n",
" \"\"\"\n",
" Simple synthetic data generator: estimates the kernel density of data using a Gaussian kernel and then generates\n",
" samples from this distribution\n",
" \"\"\"\n",
" digit_data = original_data\n",
" pca = PCA(n_components=n_components, whiten=False)\n",
" data = pca.fit_transform(digit_data)\n",
" params = {'bandwidth': np.logspace(-1, 1, 20)}\n",
" grid = GridSearchCV(KernelDensity(), params, cv=5)\n",
" grid.fit(data)\n",
"\n",
" kde_estimator = grid.best_estimator_\n",
"\n",
" new_data = kde_estimator.sample(n_samples, random_state=0)\n",
" new_data = pca.inverse_transform(new_data)\n",
" return new_data"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"Generate synthetic data based on the training data provided using the above simple synthetic data generator."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"from apt.utils.datasets import ArrayDataset\n",
"\n",
"NUM_SYNTH_SAMPLES = 1000\n",
"num_synth_components = 4\n",
"synthetic_data = ArrayDataset(\n",
" kde(NUM_SYNTH_SAMPLES, n_components=num_synth_components, original_data=x_train))\n",
"original_data_members = ArrayDataset(x_train, y_train)\n",
"original_data_non_members = ArrayDataset(x_test, y_test)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Run dataset assessment attacks using the DatasetAssessmentManager\n",
"Run all the dataset assessment attacks and get all their scores."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"from apt.risk.data_assessment.dataset_assessment_manager import DatasetAssessmentManager\n",
"\n",
"mgr = DatasetAssessmentManager()\n",
"[score_g, score_h] = mgr.assess(original_data_members, original_data_non_members, synthetic_data)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"You can look at the detailed scores of all the attacks:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[DatasetAttackScoreMembershipKnnProbabilities(dataset_name='dataset', risk_score=0.5247189047081302, result=DatasetAttackResultMembership(member_probabilities=array([0.01112053, 0.03040544, 0.00952443, ..., 0.0425625 , 0.01733997,\n",
" 0.0203852 ]), non_member_probabilities=array([0.01553551, 0.01538259, 0.01611245, ..., 0.01016964, 0.01561895,\n",
" 0.01174237])), roc_auc_score=0.5247189047081302, average_precision_score=0.8141482366545616, assessment_type='MembershipKnnProbabilities'),\n",
" DatasetAttackScoreWholeDatasetKnnDistance(dataset_name='dataset', risk_score=0.841, result=None, share=0.841, assessment_type='WholeDatasetKnnDistance')]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[score_g, score_h]"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"Or you can look at only the privacy risk scores of all the attacks:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0.5247189047081302, 0.841]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[score_g.risk_score, score_h.risk_score]"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## Run dataset assessment attacks directly"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"### DatasetAttackMembershipKnnProbabilities\n",
"Run the privacy risk assessment for synthetic datasets based on Black-Box MIA attack using distances of\n",
"members (training set) and non-members (holdout set) from their nearest neighbors in the synthetic dataset.\n",
"The area under the receiver operating characteristic curve (AUC ROC) gives the privacy risk measure.\n",
"The ROC curve is displayed and saved in a file `nursery_kde_roc_curve.png`."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 1036/1036 [00:11<00:00, 87.53it/s] \n",
"100%|██████████| 259/259 [00:02<00:00, 109.32it/s]\n"
]
},
{
"data": {
"text/plain": [
"DatasetAttackScoreMembershipKnnProbabilities(dataset_name='nursery_kde', risk_score=0.5246348071734173, result=DatasetAttackResultMembership(member_probabilities=array([0.01112053, 0.03040544, 0.00952443, ..., 0.01370366, 0.03162697,\n",
" 0.02039033]), non_member_probabilities=array([0.01553551, 0.01538259, 0.01611245, ..., 0.02506744, 0.02278329,\n",
" 0.01016964])), roc_auc_score=0.5246348071734173, average_precision_score=0.8140989865974944, assessment_type='MembershipKnnProbabilities')"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from apt.risk.data_assessment.dataset_attack_membership_knn_probabilities import \\\n",
" DatasetAttackConfigMembershipKnnProbabilities, DatasetAttackMembershipKnnProbabilities\n",
"\n",
"dataset_name = \"nursery_kde\"\n",
"\n",
"config_g = DatasetAttackConfigMembershipKnnProbabilities(use_batches=True,\n",
" generate_plot=True)\n",
"attack_g = DatasetAttackMembershipKnnProbabilities(original_data_members,\n",
" original_data_non_members,\n",
" synthetic_data,\n",
" config_g,\n",
" dataset_name)\n",
"\n",
"score_g = attack_g.assess_privacy()\n",
"score_g"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"### DatasetAttackWholeDatasetKnnDistance\n",
"Run the privacy risk assessment for synthetic datasets based on distances of synthetic data records from\n",
"members (training set) and non-members (holdout set). \n",
"\n",
"The privacy risk measure is the share of synthetic\n",
"records closer to the training than the holdout dataset."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": [
"DatasetAttackScoreWholeDatasetKnnDistance(dataset_name='nursery_kde', risk_score=0.841, result=None, share=0.841, assessment_type='WholeDatasetKnnDistance')"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from apt.risk.data_assessment.dataset_attack_whole_dataset_knn_distance import \\\n",
" DatasetAttackConfigWholeDatasetKnnDistance, DatasetAttackWholeDatasetKnnDistance\n",
" \n",
"config_h = DatasetAttackConfigWholeDatasetKnnDistance(use_batches=False)\n",
"attack_h = DatasetAttackWholeDatasetKnnDistance(original_data_members, original_data_non_members,\n",
" synthetic_data, config_h, dataset_name)\n",
"\n",
"score_h = attack_h.assess_privacy()\n",
"score_h"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "venv1",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
},
"vscode": {
"interpreter": {
"hash": "a7b572376dda99aaa0cfb20ab0ebad1d786e8d83835a737650854479888cdec3"
}
}
},
"nbformat": 4,
"nbformat_minor": 0
}