2015-07-13 5 views
2

Я готовлю набор данных для своих академических интересов. В исходном наборе данных содержится конфиденциальная информация от транзакций, например Credit card no, Customer email, client ip, origin country и т. Д. Я должен обмануть эту конфиденциальную информацию, прежде чем покинуть источник данных источника и сохранить их для моих алгоритмов анализа. Некоторые из полей данных могут быть категоричными и не будут сложно запутывать. Проблема заключается в некатегорических полях данных, как наилучшим образом я должен запутывать их, чтобы оставить базовые статистические характеристики моих данных нетронутыми, но сделать невозможным (по крайней мере математически трудно) вернуться к исходным данным.Обфускация конфиденциальных данных для машинного обучения

EDIT: Я использую Java в качестве front-end для подготовки данных. Затем подготовленные данные будут обрабатываться Python для машинного обучения.

EDIT 2: Чтобы объяснить мой сценарий, как продолжение комментариев. У меня есть поля данных, как:

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

Я должен запутать данные, присутствующие в каждой из этих областей (образцы данных). Я планирую рассматривать эти поля как функции (с запутанными данными) и тренировать свои модели по метке двоичного класса (что у меня есть для моих учебных и тестовых образцов).

+0

Можем ли мы знать, какой язык/пакет вы планируете использовать? У меня есть куча идей, как обращаться с кредитной картой нет, ip-адресом и электронной почтой. –

+0

@TimBiegeleisen Спасибо за полезный намек. Добавлена ​​информация к моему вопросу. – Segmented

+0

Для анализа новых неизвестных данных - процесса распознавания вам нужно будет преобразовать данные в форму, которую вы использовали для обучения системы. Это преобразование можно легко преобразовать, особенно если вы используете только Python или Java. –

ответ

2

Не существует общего способа обфускации некатегорических данных, поскольку любая обработка приводит к потере информации. Единственное, что вы можете сделать, это попытаться перечислить, какой тип информации является наиболее важным, и преобразовать проект, который его оставляет. Например, если ваши данные являются тегами географического положения Lat/Lng, вы можете выполнять любые преобразования, сохраняющие расстояние, такие как перевод, вращение и т. Д., Если это недостаточно, вы можете использовать ваши данные в пространстве меньшего размера, сохраняя при этом попарные расстояния (таких методов много). В целом - каждый тип некатегорических данных требует различной обработки, и каждый уничтожает информацию - вам решать составить список важных свойств и найти преобразования, сохраняющие его.

0

Я согласен с @lejlot в том, что для решения вашей проблемы нет метода серебряной пули. Тем не менее, я считаю, что этот ответ может заставить вас начать думать о том, чтобы обрабатывать по крайней мере числовые поля в вашем наборе данных.

Для цифровых полей вы можете использовать класс Java Random и сопоставить данный номер с другим обфускационным значением. Трюк здесь состоит в том, чтобы убедиться, что вы сопоставляете одинаковые номера с одинаковым новым запутанным значением. В качестве примера рассмотрим данные вашей кредитной карты, и предположим, что каждый номер карты составляет 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-адресов.

+0

Благодарим вас за пояснительный ответ. Это похоже на алгоритм Хэша. Не использовал бы случайное, равномерное распределение данных, уничтожил бы его статистические свойства и не оставил бы его полезным для анализа? В качестве примера Хеширование повлияет на линейную разделимость данных. Пожалуйста, поправьте меня, если я ошибаюсь или блуждаю по иррациональным направлениям вылета. – Segmented

+0

Пример, который я дал, был бы ужасным для чего-то вроде скажите распределение учеников. Но для номеров кредитных карт или IP-адресов это должно быть хорошо. У вас есть данные более сложные, чем то, что вы указали в своем OP? –

+0

Позвольте мне перефразировать ваш комментарий. Вы хотите сказать, что ваше решение может повлиять только на постоянное распространение. Все не непрерывные и/или категориальные поля были бы случайными. Поправьте меня, если я ошибаюсь. – Segmented

Смежные вопросы