Весь рабочий процесс Sarus теперь поддерживает реляционные данные и делает всю информацию об отношениях доступной для анализа с гарантиями конфиденциальности.

Представляем поддержку реляционных таблиц

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

Сохранение конфиденциальности в реляционных данных — крепкий орешек

Интуитивно, защита конфиденциальности означает, что личная информация хранится в секрете. Дифференциальная конфиденциальность дает более действенное определение этого, но интуиция остается. В таблице, где одна строка является индивидуальной, цель ясна: информация одной строки не должна утекать. Но в реляционных базах данных это исключение, а не правило. Чтобы узнать, как строка связана с отдельным пользователем, нужно проанализировать граф внешних ключей между таблицами, чтобы связать каждую строку одной таблицы со строкой пользовательской таблицы. Это уже дополнительная сложность, но это не конец нашей истории: чем больше внешних ключей, тем больше вероятность того, что один и тот же индивидуум соответствует многим строкам в интересующей таблице. Итак, теперь нам больше не нужно следить за тем, чтобы одна строка оставалась скрытой, но также нужно защищать блок всех строк от одного человека. И если бы все было недостаточно сложно, мы также хотим защитить блоки возможных строк, которых нет в данных, но которые могли бы быть и, если бы они были в данных, раскрывали бы информацию на уровне пользователя.

Таким образом, для Sarus переход на поддержку нескольких таблиц означает не только то, что мы можем просматривать имена таблиц и настраивать SQL-запросы, но и то, что для каждого запроса или кода машинного обучения, который будет выполняться, мы можем оценить чувствительность вывода к добавлению или удалению человека в базу данных, включая все связанные строки во всех таблицах!

К счастью, теоретики дифференциальной конфиденциальности создали правильную структуру для решения такой сложности, и пришло время внедрить ее и сделать удобной для пользователя.

Что происходит при подключении набора данных с несколькими таблицами с помощью Sarus

Когда средство подготовки данных загружает набор данных из базы данных SQL с несколькими таблицами, приложение Sarus извлекает отношения внешнего ключа. Если источник не поддерживает внешние ключи (например, BigQuery, Redshift, плоские файлы), владелец данных может определить их вручную.

В процессе адаптации Sarus автоматически создаст синтетическую версию набора данных. Для наборов данных с несколькими таблицами это означает как создание поддельной таблицы для каждой таблицы, так и обеспечение сохранения внешних ключей с точки зрения распределения вхождений отношений. Таким образом, запросы JOIN к синтетическим данным ведут себя точно так же, как те же самые запросы к реальным данным. В результате аналитики и специалисты по данным получают реальное представление об реляционном источнике.

Теперь многотабличный набор данных готов к использованию. Посмотрим в работе!

Машинное обучение в реляционных таблицах с помощью Sarus Private Learning SDK

Давайте воспользуемся (общедоступным) набором данных пациентов (OMOP), который имеет 7 таблиц. Источник данных хранится в базе данных Postgre и включает ограничения первичного и внешнего ключа. Мы хотим защитить конфиденциальность каждого пациента, их информация хранится в таблице person, а все остальные таблицы указывают на первичный ключ — person_id — этой таблицы.

После подключения к Sarus мы можем манипулировать этим реляционным набором данных с помощью Private Learning SDK (полное введение в SDK см. в этой статье). Вы можете найти Colab с полным анализом здесь.

Давайте извлечем интересующее нас представление:

# Selecting remote patient dataset
remote_dataset = client.dataset(slugname="patient_relational_data")
print(remote_dataset.tables())

# Extracting the SQL view of interest
extract = remote_dataset.sql("""SELECT * 
                                FROM patient_relational_data.private.person_1000 
                                AS patient
                                JOIN patient_relational_data.private.condition_occurrence_1000 AS cond_occ
                                ON patient.person_id = cond_occ.person_id
                                WHERE year_of_birth < 1942
                             """)
df = extract.as_pandas()
print(df.shape)
df.head(2)

Мы также могли бы создать экстракт в pandas. Синтетические строки данных, которые сохраняют отношения, очень помогают в этом!

Затем мы можем предварительно обработать данные и подобрать модель машинного обучения, как обычно. За исключением того, что данные пациента полностью защищены!

# Handling types and NaNs
df = df.drop(['person_source_value','condition_source_value', 'condition_end_date', 'condition_start_date'], axis=1)
df = df.replace('', np.nan)
df = df.dropna(axis=1, how='all')
df.condition_source_concept_id = df.condition_source_concept_id.astype('int')

# Creating target
target = pd.DataFrame([1 if x==77670 else 0 for x in df['condition_concept_id']]).rename(columns={0: "target"})
df = pd.concat([df, target], axis=1)
df = df.drop(['condition_concept_id'], axis=1)
df = df.dropna()

df.head(2)

# Splitting into X,y
target_colname = 'target'
X = df.drop([target_colname], axis=1)
y = df[target_colname]

# Splitting into train and test datasets
result = train_test_split(X, y, test_size=0.3)
X_train = result[0]
X_test = result[1]
y_train = result[2]
y_test = result[3]

# Encoding y
lbl = LabelEncoder()
lbl.fit(y)

y_train = lbl.transform(y_train)
y_test = lbl.transform(y_test)
y = lbl.transform(y)

## Fitting model on remote preprocessed data
model = RandomForestClassifier()

fitted_model = model.fit(X=X_train, y=y_train)
y_pred = fitted_model.predict(X_test)

## Computing the accuracy
accuracy_score(y_pred, y_test)

С помощью этой новой функции реляционных данных владельцы данных могут предоставлять доступ ко всем базам данных и позволять потребителям данных самостоятельно создавать соответствующие извлечения. Потребители данных получают реальное представление об исходных данных, даже не обращаясь к ним напрямую. Это новый шаг к миссии Sarus: позволить любителям данных работать с любым информационным активом с гарантиями конфиденциальности.

Хотите попробовать эту функцию всего за несколько минут? Дотянись!