Sarus только что выпустил DP-XGBoost

Дифференциально частные усиленные деревья в масштабе

XGBoost — одна из самых популярных библиотек деревьев с градиентным усилением, представленная во многих решениях-победителях на конкурсах Kaggle. Он написан на C++ и может использоваться на многих языках: Python, R, Java, Julia или Scala. Он может работать в основных распределенных средах (Kubernetes, Apache Spark или Dask) для обработки наборов данных с миллиардами примеров.

XGBoost часто используется для обучения моделей на конфиденциальных данных. Поскольку это не гарантирует конфиденциальность, можно показать, что личная информация может оставаться в весах модели. Дифференциальная конфиденциальность (DP) — это правильная основа для устранения этого риска конфиденциальности. Мы рады объявить о первом дифференцированно-частном ответвлении XGBoost с открытым исходным кодом. Проект можно найти на Github.

Как это работает: деревья, усиленные DP

В статье 2019 года Li et. др. разработать метод для деревьев, повышенных DP. Sarus DP-XGBoost основан на их идеях с некоторыми улучшениями.

Ключевые улучшения заключаются в следующем:

  • Мы используем метод приблизительного обучения XGBoost, способный обрабатывать огромные наборы данных, в отличие от мелкомасштабного базового точного метода.
  • Мы уменьшаем добавленный шум, используя параметр min_child_weight в XGBoost. Этот параметр обычно используется для уменьшения переобучения и фактически позволяет значительно сократить потери конфиденциальности.
  • Мы используем параметр подвыборка, чтобы повысить конфиденциальность за счет подвыборки Balle et. др. (2018).
  • Мы используем дизайн XGBoost для работы в распределенном режиме на различных платформах, таких как Kubernetes, Dask или Apache Spark.

Метод подробно описан в техническом отчете.

Установка Sarus DP-XGBoost

Чтобы использовать библиотеку Python, вы можете просто установить пакет с pip.

pip install dp-xgboost

Если пакет Wheels недоступен для вашей платформы, вам необходимо установить cmake.

Вот и все, теперь вы можете использовать XGBoost с нашим дифференциально-приватным алгоритмом обучения дереву в Python!

Пример использования

Мы включили пример регрессии и классификации Python в репозиторий. На данный момент Sarus DP-XGBoost доступен для Python и Spark (Scala). Для дифференциальной конфиденциальности должны быть известны верхние и нижние границы каждой функции входной матрицы (эти границы должны быть общедоступными или оцениваться с помощью дифференциальной конфиденциальности). Метки также должны быть в [-1,1].

Помимо этой предварительной обработки, использование очень похоже на обычный XGBoost. На данный момент DP-XGBoost поддерживает регрессию и бинарную классификацию, и в будущем мы планируем добавить больше объективных функций. Вот фрагмент кода, который показывает DP-XGBoost в действии.

Параметры и результат DP-XGBoost

Наиболее важными параметрами дифференциальной конфиденциальности являются бюджет конфиденциальности на дерево 𝜀: dp_epsilon_per_tree и количество деревьев num_boost_round. Параметры частоты subsample и min_child_weight можно использовать для повышения точности вне выборки и повышения конфиденциальности.

DP-XGBoost возвращает обученную модель в виде объекта JSON. Этот объект содержит обученную модель, как это делает XGBoost, а также параметры всех основных механизмов DP (экспоненциальный механизм и механизм Лапласа), используемых во время обучения. Механизмы составлены с использованием базовой композиции (потери конфиденциальности: 𝜀 суммируются, и, таким образом, общее потребление конфиденциальности увеличивается линейно с количеством механизмов), но если вы хотите, вы можете просто вычислить потерю конфиденциальности, используя свои собственные бухгалтера конфиденциальности (RDP, Gaussian-DP или f-DP) на основе механизмов, указанных в выходных данныхJSON. При этом, если вы можете допустить небольшой 𝛿, вы можете добиться гораздо меньшего роста потери конфиденциальности: как квадратный корень из числа механизмов, а не линейный.

Если вы планируете опубликовать обученную модель, имейте в виду, что полный вывод JSON сам по себе не DP!Это означает, что вы должны публиковать только условия разделения и конечные значения каждого дерева.

Мы очень рады внести свой вклад в инициативы DP с открытым исходным кодом и опираться на потрясающую работу команды XGBoost! 😎

См. код и наш технический отчет.