Source code for synthetic_aia_mia.aia

"""Attribute inference attack."""

from finit_classifier import FinitClassifier

from .soft import AiaNN

[docs] class Hard: """Attribute inference attack of hard labels for adult.""" def __init__(self): self.finit = {"race":FinitClassifier(), "sex":FinitClassifier()} self.trained = False
[docs] def fit(self, dadata): """Fit a finit classifier to predict sensitive attribute from hard labels. :param dadata: Auxiliary data for aia training. :type dadata: fetch_data.Dataset """ data = dadata.load() self.finit["race"].fit(data["hard"].to_numpy().reshape(-1,1), data["race"].to_numpy()) self.finit["sex"].fit(data["hard"].to_numpy().reshape(-1,1), data["sex"].to_numpy()) self.trained = True
[docs] def predict(self, dadata): """Use previously trained finit classifier to infer senstivies attribute and append prediction to input data. :param dadata: Auxiliary data for aia evaluation. :type dadata: fetch_data.Dataset :return: Dataset with aia prediction under the columns "sexAIAhard" and "raceAIAhard". :rtype: fetch_data.Dataset """ if not(self.trained): raise AssertionError(f"{self} must be trained prioir to predict") data = dadata.load() data["sex_hard"] = self.finit["sex"].predict(data["hard"].to_numpy().reshape(-1,1)) data["race_hard"] = self.finit["race"].predict(data["hard"].to_numpy().reshape(-1,1)) dadata.update(data) return dadata
[docs] class Soft: """Attribute inference attack of soft labels for adult.""" def __init__(self): self.model = {"race":AiaNN(), "sex":AiaNN()}
[docs] def fit(self, dadata): """Fit a neural network to predict sensitive attribute from soft labels. :param dadata: Auxiliary data for aia training. :type dadata: fetch_data.Dataset """ print(dadata.load()) self.model["race"].fit(dadata, "race") self.model["sex"].fit(dadata, "sex")
[docs] def predict(self, dadata): """Use previously trained neural network to infer senstivies attribute and append prediction to input data. :param dadata: Auxiliary data for aia evaluation. :type dadata: fetch_data.Dataset :return: Dataset with aia prediction under the columns "sexAIAsoft" and "raceAIAsoft". :rtype: fetch_data.Dataset """ dadata = self.model["sex"].predict(dadata) dadata = self.model["race"].predict(dadata) return dadata
[docs] class Aia: """High level interface for attribute inference attack. Execute soft and hard attack.""" def __init__(self): self.soft = Soft() self.hard = Hard()
[docs] def fit(self, data): """Fit aia for hard and soft labels. :param data: Dataset containing labels. :type data: fetch_data.Dataset """ self.soft.fit(data) self.hard.fit(data)
[docs] def predict(self, data): """Add sensitive attribute predicton for hard and soft labels. :param data: Dataset containing labels. :type data: fetch_data.Dataset :return: Dataset with predicted sensitive attribute. :rtype: fetch_data.Dataset """ data = self.soft.predict(data) data = self.hard.predict(data) return data