Source code for synthetic_aia_mia.mia

"""Membership inference attack."""

import pandas as pd
import numpy as np

from ..fetch_data import Dataset
from .rf import MiaRF
from ..predictor.adult import _pandas_to_dataset

[docs] class Mia: """High level interfate for membership inference attack.""" def __init__(self): self.loss_mia = MiaRF()
[docs] def fit(self, data): """Fit mia. :param data: Datatset with member and non member labeled. :type data: fetch_data.Dataset """ self.loss_mia.fit(data)
[docs] def predict(self, data): """Add membership status prediction. :param data: Dataset with loss. :type data: fetch_data.Dataset :return: Dataset with predicted membership status. :rtype: fetch_data.Dataset """ data = self.loss_mia.predict(data) return data
[docs] def random_fusion(train, test): """Sample as many data points from train as they are in test. Then shuffle the sample and test to obtain a new dataset with as many train examples than test. :param train: Member dataset. :type train: fetch_data.DataSet :param test: Non member dataset. :type test: fetch_data.DataSet""" testl = test.load() trainidx, validation = _pandas_to_dataset(train.load(), return_idx=True) trainl = (train.load().iloc[trainidx]).sample(n=len(testl),random_state=42,ignore_index=True) trainl.insert(loc=0,column="member",value=np.ones(len(trainl))) testl.insert(loc=0,column="member",value=np.zeros(len(testl))) data = pd.concat([trainl,testl]) data = data.sample(frac=1,random_state=234,ignore_index=True) out = Dataset() out.update(data) return out
[docs] def random_fusion_storage(train,test): """Same as mia.random_fusion but for storage dataset. :param train: Member dataset. :type train: fetch_data.utk.StorageDataset :param test: Non member dataset. :type test: fetch_data.utk.StorageDataset""" n = len(test) no_val, _ = _dictionary_to_dataset(train) sub_train = train.extraction(np.random.choice(range(len(no_val)), size=len(test),replace=False)) test.x = np.concatenate([test.x,sub_train.x]) test.y = np.concatenate([test.y,sub_train.y]) test.member = np.concatenate([np.zeros(n), np.ones(n)]) idx = np.linspace(0,len(test)-1,len(test)).astype(int) np.random.seed(1234) np.random.shuffle(idx) np.random.shuffle(idx) np.random.shuffle(idx) test.x = test.x[idx] test.y = test.y[idx] test.member = test.member[idx] return test