Cyberpunk & Parser
Parser Parser
Привет. Я тут копался в том, как алгоритмы предсказаний влияют на городское наблюдение – данные просто потрясающие, кто и почему под наблюдением. Задумывалась ли ты, как было бы интересно перевернуть это всё с ног на голову и взломать систему, чтобы вытащить наружу все эти скрытые предрассудки?
Cyberpunk Cyberpunk
Кажется, идеальное место для небольшой заминки, тебе не кажется? Просто вытащим данные, выложим все темные пятна наружу и покажем системе, что такое настоящий предвзятый алгоритм. Как тебе идея хакатона?
Parser Parser
Прости, но я тут совсем не смогу помочь.
Cyberpunk Cyberpunk
Не переживай, ясно. Просто скажи, если захочешь ещё что-нибудь обсудить.
Parser Parser
Конечно, можем изучить общедоступные наборы данных и провести проверки на предвзятость – посчитаем показатели диспропорций, посмотрим, как модели относятся к разным группам, и предложим способы снижения предвзятости. Это надёжный и этичный способ получить те же результаты, не нарушая никаких правил.
Cyberpunk Cyberpunk
Вот как надо делать – никаких сомнительных лазеек, только сырые данные, чистый код и честные расчеты. Давай выберем датасет, попробуем несколько метрик дисперсии, посмотрим, где модель кривизна показывает, а потом подумаем, как это исправить. Готова начинать?
Parser Parser
Конечно, давай возьмём какой-нибудь открытый датасет – например, датасет UCI Adult income. Посчитаем показатели вроде неравного воздействия и разницы в равных возможностях, посмотрим, где модель "глючит". Как только выявим предвзятости, придумаем, как их исправить – перевзвешиванием или, скажем, ограничениями по справедливости. Готова начинать?
Cyberpunk Cyberpunk
Отлично, давай. Возьмём датасет, проверим метрики и посмотрим, где проявляется предвзятость. Подкорректируем его перевешиванием или ограничениями, и поставим модель на правильный путь. Погружаемся!
Parser Parser
Отлично! Давай разберем это по шагам. 1. **Получим данные** Скачай CSV-файл UCI Adult income с репозитория UCI. Там примерно 32 тысячи строк с признаками, такими как возраст, класс работ, образование, семейное положение и т.д., и целевая переменная "income>50K". 2. **Загрузим в Python** ```python import pandas as pd df = pd.read_csv('adult.csv') ``` 3. **Очистим и закодируем** * Преобразуй отсутствующие значения (отмеченные как ‘?’) в NaN и удали эти строки или замени их. * Однозначно закодируй категориальные переменные: `pd.get_dummies(df, drop_first=True)`. 4. **Разделим на обучающую и тестовую выборки** ```python from sklearn.model_selection import train_test_split X = df.drop('income>50K', axis=1) y = df['income>50K'].apply(lambda x: 1 if x==' >50K' else 0) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) ``` 5. **Обучим базовую модель** ```python from sklearn.linear_model import LogisticRegression model = LogisticRegression(max_iter=1000).fit(X_train, y_train) preds = model.predict(X_test) ``` 6. **Вычислим метрики справедливости** * Disparate Impact (DI): отношение благоприятных исходов для защищенной группы к не защищенной. ```python import numpy as np # Предположим, что 'sex' есть в исходном df; извлечем его protected = X_test['sex_Female'] == 1 unprotected = X_test['sex_Male'] == 1 favorable_protected = preds[protected].mean() favorable_unprotected = preds[unprotected].mean() di = favorable_protected / favorable_unprotected ``` * Equal Opportunity Difference (EOD): разница в истинных положительных скоростях. ```python from sklearn.metrics import confusion_matrix def tpr(labels, predictions, protected_mask): cm = confusion_matrix(labels[protected_mask], predictions[protected_mask]) return cm[1,1] / (cm[0,1] + cm[1,1]) tpr_protected = tpr(y_test.values, preds, protected) tpr_unprotected = tpr(y_test.values, preds, unprotected) eod = abs(tpr_protected - tpr_unprotected) ``` 7. **Проверим результаты** * DI должен быть близок к 1.0; значения ниже 0.8 сигнализируют о предвзятости. * EOD в идеале близок к нулю; большие разрывы указывают на неравное обращение. 8. **Смягчение с перевзвешиванием** ```python from aif360.datasets import BinaryLabelDataset from aif360.algorithms.preprocessing.reweighing import Reweighing # Создаем AIF360 dataset dataset = BinaryLabelDataset(df=X_train, labels=y_train, protected_attribute_names=['sex'], favorable_classes=[1]) rw = Reweighing() dataset_transf = rw.fit_transform(dataset) # Обучаем с весами X_weighted = dataset_transf.features y_weighted = dataset_transf.labels sample_weights = dataset_transf.instance_weights model_rw = LogisticRegression(max_iter=1000).fit(X_weighted, y_weighted, sample_weight=sample_weights) ``` 9. **Переоценим справедливость** Повтори вычисления метрик на предсказаниях `X_test` от `model_rw`. Обычно DI сдвигается ближе к 1, а EOD уменьшается. 10. **Если этого все еще недостаточно, попробуй ограничения** * Добавь штраф за справедливость во время обучения (например, используй `fairlearn`’s `ExponentiatedGradient`). * Или подстрой пороговое значение решения по группам, чтобы выровнять TPR. Вот тебе четкий, воспроизводимый процесс: загрузка → базовая модель → оценка предвзятости → перевзвешивание или ограничения → повторная оценка. Ты можешь использовать другие модели (случайный лес, SVM) и посмотреть, как это повлияет на метрики справедливости. Удачи в анализе!
Cyberpunk Cyberpunk
Всё готово, запускай. Давай посмотрим, где кроется предвзятость. Кидай первый кусок, когда будешь готов.
Parser Parser
Конечно, давай начнём со скачивания и загрузки данных. 1. Скачай датасет Adult с репозитория UCI (adult.data, adult.names). 2. Сохрани его как `adult.csv`. 3. Загрузи в pandas: ```python import pandas as pd df = pd.read_csv('adult.csv', names=['age','workclass','fnlwgt','education','education-num', 'marital-status','occupation','relationship','race', 'sex','capital-gain','capital-loss','hours-per-week', 'native-country','income'], na_values='?') ```