Не забывайте, что предвзятость может повлиять на ваш проект

Когда мы говорим о предвзятости в мире науки о данных, это будет относиться к ошибке машинного обучения при изучении входных данных и неспособности дать объективный прогноз. Если провести аналогию с человеком, предвзятость в машинном обучении может означать, что модель предпочитает определенные прогнозы/условия другим. Почему нам нужно беспокоиться о предвзятости?

Предвзятость модели — потенциальная проблема в нашем проекте по науке о данных, потому что взаимосвязь между входными и выходными данными не отражает реальную ситуацию, что может вызвать проблемы на нескольких уровнях, включая юридические проблемы.

Предвзятость в модели машинного обучения недопустима, но она все еще имеет место. Есть примеры предубеждений, приводящих к катастрофическим результатам и неудачам; например, случай, когда дозатор мыла выдает только для руки белого человека или когда беспилотный автомобиль с большей вероятностью въедет в темнокожего человека. Вот почему проводится много исследований для выявления и смягчения предвзятости.

Исследования машинного обучения во избежание предвзятости по-прежнему являются большой проблемой в науке о данных, и как полностью обнаружить предвзятость по-прежнему остается большим вопросом. Однако мы далеко ушли по сравнению с прошлым. В этой статье мы обсудим, почему наша модель машинного обучения может привести к предвзятости, и некоторые способы обнаружения предвзятости.

Без лишних слов, давайте приступим к делу.

Почему машинное обучение может быть предвзятым?

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

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

  1. Коллекция
  2. Предварительная обработка
  3. Разработка функций
  4. Разделение
  5. Обучение модели
  6. Оценка

Давайте кратко разберемся, почему каждый этап может привести к предвзятости.

Сбор данных

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

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

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

Предварительная обработка данных

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

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

Приведенный выше пример привел бы к систематической ошибке, связанной с несоответствием, потому что мы взяли зарплату каждого сотрудника в компании и усреднили ее. Какая-то заработная плата обязательно будет выше, а какая-то ниже — в зависимости от уровня и опыта.

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

Разработка функций

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

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

Различная шкала между признаками также может представлять систематическую ошибку со статистической стороны. Представьте себе характеристику заработной платы и стажа работы; у них совсем другой масштаб, и их, возможно, придется стандартизировать — в противном случае в нашей модели машинного обучения возникнет предвзятость.

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

Разделение данных

Разделение данных может привести к смещению обучающих данных, если разделение не будет отражать реальное население. Это часто происходит, когда мы не делаем случайный выбор в процессе разделения. Например, мы выбираем верхние 70% данных для обучения, но неосознанно нижние данные содержат вариацию, не захваченную выбором. Это неосознанно вносит предвзятость в обучающие данные.

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

Обучение моделей

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

Нам нужно понимать наши данные и алгоритм модели, чтобы избежать предвзятости в нашей модели машинного обучения. Не каждый алгоритм подходит для всех наборов данных. Если у вас есть линейные данные, вы можете использовать линейную модель; но, возможно, для другого набора данных требуется модель нейронной сети. Узнайте, какая модель необходима для каждого проекта, чтобы уменьшить предвзятость.

Оценка модели

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

Изучите метрики (например, точность, полнота, точность, RMSE и т. д.), чтобы узнать, какие из них подходят для вашего варианта использования. Например, несбалансированный случай может быть не идеальным для использования точности в качестве метрики, потому что большинство прогнозов фокусируются только на одном классе.

Как обнаружить предвзятость с помощью Python

Как я уже упоминал, было проведено много исследований, чтобы помочь обнаружить и смягчить предвзятость в нашем проекте машинного обучения. В этой статье мы будем использовать пакет Python с открытым исходным кодом под названием Fairlearn, чтобы помочь обнаружить предвзятость. Также были разработаны различные пакеты Python, включающие методы обнаружения предвзятости, которые мы могли бы использовать, но мы сосредоточимся на Fairlearn.

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

В качестве примера проекта я бы использовал набор данных для прогнозирования сердечно-сосудистых заболеваний UCI (лицензия: CC BY 4.0). В этом примере мы будем использовать различные функции для обнаружения смещения и смягчения смещения на основе имеющихся у нас функций.

Если вы не установили пакет Fairlearn, вы можете сделать это с помощью следующего кода.

pip install fairlearn

Чтобы начать анализ, давайте начнем импортировать функции пакета и загрузить набор данных.

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score
from lightgbm import LGBMClassifier
from fairlearn.metrics import (
    MetricFrame,
    false_positive_rate,
    true_positive_rate,
    selection_rate,
    count
)
from fairlearn.reductions import ExponentiatedGradient, DemographicParity
df = pd.read_csv('HeartDisease.csv')

Затем мы предварительно обработаем набор данных с загрузкой набора данных, чтобы данные были готовы для обучения модели.

#One-Hot Encode the categorical features
df = pd.get_dummies(df, columns = ['sex', 'chest_pain_type', 'fasting_blood_sugar', 'rest_ecg','exercise_induced_angina', 'slope', 'vessels_colored_by_flourosopy', 'thalassemia'],drop_first = True )

Когда данные будут готовы, мы разделим набор данных на обучающий и тестовый.

X_train, X_test, y_train, y_test = train_test_split(df.drop('target', axis = 1), df['target'], train_size = 0.7, random_state = 42,stratify = df['target'] )

Затем мы обучим предсказание классификатора.

clf = LGBMClassifier()
clf.fit(X_train, y_train)

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

В этом случае я бы установил чувствительную функцию как пол. Поскольку мы создали функцию OHE, пол будет указываться в поле sex_Male (мужской).

sensitive_feat = X_test['sex_Male']

Затем мы подготовим результат прогноза из нашего классификатора, используя тестовые данные.

y_pred = clf.predict(X_test)

Затем мы измерим метрику на основе конфиденциальной функции. Например, я хочу измерить различия в оценках отзыва на основе конфиденциальной функции.

gm = MetricFrame(metrics=recall_score, y_true=y_test, y_pred=y_pred, sensitive_features=sensitive_feat)
print(gm.by_group)

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

Мы также могли бы посмотреть на другой показатель, например, коэффициент отбора (процент населения с «1» в качестве метки).

sr = MetricFrame(metrics=selection_rate, y_true=y_test, y_pred=y_pred, sensitive_features=sensitive_feat)
sr.by_group

Коэффициент отбора показывает, что популяция прогноза 1 для обоих полов смещена в отношении женщин, поэтому существует смещение.

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

metrics = {
    'accuracy': accuracy_score,
    'precision': precision_score,
    'recall': recall_score,
    'false positive rate': false_positive_rate,
    'true positive rate': true_positive_rate,
    'selection rate': selection_rate,
    'count': count}
metric_frame = MetricFrame(metrics=metrics,
                           y_true=y_test,
                           y_pred=y_pred,
                           sensitive_features=sensitive_feat)
metric_frame.by_group.plot.bar(
    subplots=True,
    layout=[3, 3],
    legend=False,
    figsize=[12, 8],
    title="Show all metrics",
)

Из приведенного выше графика видно, что различные показатели немного смещены в сторону женщин.

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

np.random.seed(42)
constraint = DemographicParity()
clf = LGBMClassifier()
mitigator = ExponentiatedGradient(clf, constraint)
sensitive_feat = X_train['sex_Male']
mitigator.fit(X_train, y_train, sensitive_features=sensitive_feat)

Затем мы снова использовали бы наш смягченный классификатор, чтобы делать прогнозы.

sensitive_feat = X_test['sex_Male']
y_pred_mitigated = mitigator.predict(X_test)
sr_mitigated = MetricFrame(metrics=selection_rate, y_true=y_test, y_pred=y_pred_mitigated, sensitive_features=sensitive_feat)
print(sr_mitigated.by_group)

Процент скорости выбора немного увеличен и намного ближе, чем раньше. Таким образом, мы попытались смягчить предвзятость в прогнозе. Вы можете больше экспериментировать с различными алгоритмами, чтобы смягчить предвзятость.

Заключение

Предвзятость в машинном обучении — это когда модель предпочитает одни прогнозы/условия другим. Предвзятость может произойти из-за различных аспектов на каждом этапе. От сбора данных до оценки модели может возникнуть предвзятость, и нам нужно очень хорошо понимать наш проект.

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

Я надеюсь, что это помогает!

Заходите ко мне в Социальные сети, чтобы обсудить более подробно или задать вопросы.

Если вы не подписаны как участник Medium, рассмотрите возможность подписки через моего реферала.