混淆机器学习的敏感数据

Obfuscation of sensitive data for machine learning

我正在为我的学术兴趣准备一个数据集。原始数据集包含来自交易的敏感信息,如 Credit card noCustomer emailclient iporigin country 等。我必须在这些敏感信息离开我的原始数据之前混淆这些信息-为我的分析算法寻找并存储它们。数据中的一些字段可以是分类的,不难混淆。问题在于非分类数据字段,我应该如何最好地混淆它们以保持我数据的基本统计特征完好无损,但不可能(至少在数学上很难)恢复到原始数据。

编辑: 我正在使用 Java 作为前端来准备数据。然后,准备好的数据将由 Python 处理以进行机器学习。

编辑 2: 解释我的情况,作为评论的后续行动。我有这样的数据字段:

'CustomerEmail', 'OriginCountry', 'PaymentCurrency', 'CustomerContactEmail',
'CustomerIp', 'AccountHolderName', 'PaymentAmount', 'Network',
'AccountHolderName', 'CustomerAccountNumber', 'AccountExpiryMonth',
'AccountExpiryYear'

我必须混淆每个字段(数据样本)中存在的数据。我计划将这些字段视为特征(使用混淆数据)并针对二进制 class 标签(我的训练和测试样本有)训练我的模型。

没有混淆非分类数据的通用方法,因为任何处理都会导致信息丢失。您唯一可以做的就是尝试列出哪种类型的信息是最重要的信息,并对其进行设计转换。例如,如果您的数据是 Lat/Lng 地理位置标签,您可以执行任何类型的保持距离的转换,例如平移、旋转等。如果它不够好,您可以将数据嵌入较低维度 space 同时保留成对距离(有很多这样的方法)。一般来说 - 每种类型的非分类数据都需要不同的处理,并且每一种都会破坏信息 - 由您提出重要属性列表并找到保留它的转换。

我同意@lejlot 的观点,没有灵丹妙药可以解决您的问题。但是,我相信这个答案可以让您开始考虑至少处理数据集中的数字字段。

对于数字字段,您可以使用 Java Random class 并将给定数字映射到另一个混淆值。这里的技巧是确保将 same 数字映射到 same 新混淆值。例如,考虑您的信用卡数据,我们假设每个卡号都是 16 位数字。您可以将信用卡数据加载到 Map 中并对其进行迭代,为每个数字创建一个新代理:

Map<Integer, Integer> ccData = new HashMap<Integer, Integer>();
// load your credit data into the Map

// iterate over Map and generate random numbers for each CC number
for (Map.Entry<Integer, Integer> entry : ccData.entrySet()) {
    Integer key = entry.getKey();

    Random rand = new Random();
    rand.setSeed(key);
    int newNumber = rand.nextInt(10000000000000000); // generate up to max 16 digit number
    ccData.put(key, newNumber);
}

在此之后,任何时候您需要使用信用卡 num 您都可以通过 ccData.get(num) 访问它以使用混淆值。

您可以按照类似的 IP 地址计划。