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

Являются ли модели машинного обучения «справедливыми»? Когда все больше решений подкрепляется алгоритмами машинного обучения, становится важно понимать предубеждения, которые они могут создавать.

Но что значит «справедливость»? Здесь все становится немного политическим (и математическим)… Чтобы проиллюстрировать наши мысли, мы возьмем пример модели машинного обучения, которая предсказывает, должна ли зарплата быть выше 50 тысяч в год на основе ряда функций, включая age и gender. .

И, возможно, вы уже догадались, глядя на эти две характеристики, что справедливость может иметь разные определения. Справедливо для gender может означать, что мы хотим получить прогноз, не зависящий от пола, т. е. платить одним и тем же людям, которые различаются только своим полом. Справедливо для age может означать что-то еще: мы, вероятно, хотели бы допустить определенную корреляцию между прогнозом и возрастом, поскольку кажется справедливым платить больше пожилым людям (которые обычно более опытны).

Одна ключевая вещь, которую нужно понять, заключается в том, что то, что считается «справедливым», иногда даже не соблюдается в самих данных.

Как модель узнает, что мужчины и женщины должны получать одинаковую оплату на равных уровнях, если она не наблюдает этого в самих данных?

Теперь, когда у нас есть немного контекста проблемы, давайте перейдем к математике (раздел 1) и коду (разделы 2 и 3), чтобы иметь возможность оценивать и решать проблемы несправедливости:

  1. Математические концепции справедливости
  2. Оценка предвзятости данных
  3. Оценка и исправление погрешностей модели с помощью Fairlearn
    3.a. Предвзятость оценки
    3.b. Исправление смещения

Весь код для этого туториала можно найти на Kaggle здесь. Не стесняйтесь запустить блокнот самостоятельно или создать копию!

1. Несколько концепций справедливости

1.1. Математические определения справедливости

Чтобы упростить задачу, мы ограничим область применения бинарной классификацией (предсказать, следует ли кому-то платить больше 50 000 в год).

Обычно мы вызываем:

  • X: матрица признаков
  • Y: цель
  • A: чувствительный элемент, обычно один из столбцов X.

Для бинарной классификации существует два основных определения справедливости:

  • Демографический паритет (также известный как статистический паритет). Классификатор h удовлетворяет демографическому паритету при распределении по (X,A,Y), если его предсказание h(X) статистически не зависит от чувствительного признака A. Это эквивалентно: E[h(X)|A=a]=E[h(X)]
  • Уравненные шансы: классификатор h удовлетворяет уравнению шансов при распределении по (X,A,Y), если его прогноз h(X) условно не зависит от заданного чувствительного признака A метка Y. Это эквивалентно: E[h(X)|A=a,Y=y]=E[h(X)|Y=y]

ПРИМЕЧАНИЕ. Третий вариант существует, но используется реже: eравные возможности — этоупрощенная версия уравненных шансов, в которой учитываются только условные ожидания в отношении положительных меток.

1. 2. «Справедливость» словами

Говоря «простыми словами»:

  • Демографический паритет: прогноз не должен зависеть от чувствительных признаков (например, от пола). В нем говорится, что все категории из защищенной функции должны получать положительный результат с одинаковой скоростью (играет на скорости выбора).
  • Уравненные шансы: прогноз может быть связан с конфиденциальной функцией в той степени, в которой он объясняется данными, которые мы видим.

1. 3. Почему это важно

Хорошо, это интересно, но почему это важно? И как я могу использовать эти математические понятия?

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

  • Демографический паритет для пола: прогноз заработной платы не должен зависеть от пола
  • Выравнивание коэффициентов по возрасту: прогноз зарплаты не должен зависеть от возраста (вы по-прежнему хотите платить большему количеству сотрудников с большим опытом), но вы все равно хотите контролировать эту зарплату, чтобы не оказаться слишком перекошенной → вы не хотят оказаться в ситуации, когда алгоритм еще больше усугубляет неравенство (платит молодежи еще меньше, а старшим еще больше)

Без лишних слов давайте перейдем к деталям реализации того, как мы можем оценить справедливость и переобучить наши модели машинного обучения против его предубеждений. Для этого мы будем использовать Набор данных для взрослых UCI.

2. Оценка предвзятости данных

ПРИМЕЧАНИЕ: еще раз, вы можете найти весь соответствующий код здесь.

Предубеждения могут существовать в самих данных. Давайте просто загрузим данные и построим несколько разных графиков:

Мы видим, что процент мужчин, имеющих зарплату выше 50 тысяч, почти в 3 раза превышает процент женщин. (!!)

Если алгоритм учится на этих данных, он определенно будет необъективным. Чтобы противостоять этой предвзятости, мы можем:
1. выбрать данные так, чтобы процент мужчин был
2. использовать Fairlearn для исправления предвзятости после того, как модель будет обучена на этих недобросовестных данных.

В разделе 3 мы сосредоточимся на втором подходе.

3. Оценка и исправление ошибок модели с помощью Fairlearn

3.1. Оценка предвзятости

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

Давайте воспользуемся MetricFrame от Fairlearn, чтобы рассчитать коэффициенты отбора, разделенные по полу.

from fairlearn.metrics import MetricFrame
from sklearn.metrics import accuracy_score,precision_score,recall_score
from sklearn.ensemble import GradientBoostingClassifier
from fairlearn.metrics import selection_rate
from fairlearn.reductions import ExponentiatedGradient, DemographicParity
classifier = GradientBoostingClassifier()
classifier.fit(X, y)
y_pred = classifier.predict(X)
metrics = {
    'accuracy': accuracy_score,
    'precision': precision_score,
    'recall': recall_score,
    'selection_rate': selection_rate
}
metric_frame = MetricFrame(metrics=metrics,
                           y_true=y,
                           y_pred=y_pred,
                           sensitive_features=sex)
metric_frame.by_group['selection_rate'].plot.bar(color= 'r', title='Selection Rate split by Sex')

Мы видим, что процент мужчин, имеющих зарплату выше 50 тысяч, почти в 3 раза превышает процент женщин. (!!)
Как только модель обучена, мы видим, что это соотношение теперь 5x (!!)

3.2. Исправление смещения

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

np.random.seed(0)  # set seed for consistent results with ExponentiatedGradient

constraint = DemographicParity()
classifier = GradientBoostingClassifier()
mitigator = ExponentiatedGradient(classifier, constraint)
mitigator.fit(X, y, sensitive_features=sex)
y_pred_mitigated = mitigator.predict(X)

sr_mitigated = MetricFrame(metrics=selection_rate, y_true=y, y_pred=y_pred_mitigated, sensitive_features=sex)
print(sr_mitigated.overall)
print(sr_mitigated.by_group)
metric_frame_mitigated = MetricFrame(metrics=metrics,
                           y_true=y,
                           y_pred=y_pred_mitigated,
                           sensitive_features=sex)
metric_frame_mitigated.by_group.plot.bar(
    subplots=True,
    layout=[3, 3],
    legend=False,
    figsize=[12, 8],
    title="Show all metrics",
)

Смягчив модель, мы ввели демографический паритет (и, следовательно, равные коэффициенты отбора) для нашей новой модели. Наша модель теперь справедлива!!!

Ууууу! Теперь вы знаете основы честности и знаете, как сразу же начать использовать их в своих проектах по машинному обучению!

Надеюсь, вам понравилась эта статья! Дайте мне знать, если у вас есть какие-либо вопросы или предложения. Также не стесняйтесь обращаться ко мне в LinkedIn, GitHub или Twitter или ознакомьтесь с некоторыми другими статьями, которые я написал о лучших практиках DS/ML. Приятного обучения!

Источники: