Когда твой датасет может стоить кому-то жизни
Большинство ML-разработчиков думают о датасетах в терминах размера, баланса классов и качества разметки. Мы думали о том, можем ли мы вообще это делать. Потому что каждая строка в нашем датасете - это реальный человек, который мог не пережить следующий день. Это не классификация кошек и собак, где худшее, что случится - это падение accuracy на 2%.
Первый и главный вопрос, который мы задали себе: имеем ли мы моральное право собирать такие данные? Ответ был «нет». Пока мы не придумали, как это делать правильно.
Почему старые подходы не работают (и опасны)
Типичный путь: найти публичные посты в соцсетях, наклеить метки «суицидальные»/«не суицидальные», обучить модель. Звучит просто? Это рецепт катастрофы. Вот что происходит на практике:
- Вы скрейпите посты человека, который написал «не могу больше» неделю назад. Сегодня он жив. Завтра - нет. Ваш алгоритм только что стал частью его истории.
- Вы собираете контекст: комментарии друзей, реакцию сообщества. Неожиданно вы имеете не просто текст, а социальный граф чужой трагедии.
- Ваша модель ошибается. Ложно-положительный результат - и вы навешиваете на здорового человека клеймо. Ложно-отрицательный - и пропускаете того, кому нужна помощь.
В проекте Пситехлаб мы начали не со сбора данных. Мы начали с юридического анализа и этического комитета. Потому что если ты собираешься работать с самыми уязвимыми людьми в самый тяжелый момент их жизни - твоя первая ответственность не перед accuracy, а перед ними.
Методология, которая не сломает психику (ни вашу, ни участников)
1 Источники: где брать данные, когда брать нельзя
Мы отказались от скрейпинга живых соцсетей. Вместо этого пошли тремя путями:
| Источник | Почему подходит | Ловушки |
|---|---|---|
| Анонимные форумы психологической помощи | Пользователи уже согласились на анонимную публикацию, есть модерация | Тексты сильно отредактированы, мало контекста |
| Научные корпуса (уже собранные исследования) | Этическое одобрение уже получено, данные очищены | Маленький объем, специфический язык |
| Симуляция с психологами | Полный контроль, можно создавать edge-кейсы | Искусственность, дороговизна |
Ключевой момент: мы работали только с данными, где было явное согласие на исследовательское использование. Да, это сократило потенциальный размер датасета в 10 раз. Но это единственный способ спать спокойно.
2 Анонимизация, которая работает (а не просто удаление имен)
Удалить имя и фамилию - это уровень детского сада. Настоящая анонимизация выглядит так:
def deep_anonymize(text, custom_entities=None):
"""
Глубокая анонимизация текста с учетом контекста
"""
# 1. Удаляем имена, фамилии, ники
text = remove_names(text)
# 2. Заменяем локации на обобщенные (не "ул. Ленина, 15", а "улица в городе")
text = generalize_locations(text)
# 3. Обрабатываем временные метки (не "5 марта", а "в определенный день")
text = obscure_dates(text)
# 4. Удаляем уникальные детали, которые могут идентифицировать
# ("работаю в единственной кофейне на районе" → "работаю в местном заведении")
text = remove_identifying_details(text)
# 5. Проверяем, остались ли пересечения с другими текстами
# которые могут восстановить идентичность через кросс-референс
text = check_cross_references(text, existing_corpus)
return text
Но вот что интересно: слишком агрессивная анонимизация убивает смысл. Фраза «встретился с другом вечером после работы» после обработки превращается в «встретился с человеком в определенное время». Для ML-модели это уже другой текст.
Наш компромисс: многоуровневая анонимизация. Для обучения модели - умеренная очистка. Для хранения - максимальная. Для публикации датасета - только синтетические примеры на основе реальных паттернов.
3 Разметка: когда психолог важнее data scientist
Здесь мы совершили главную ошибку в начале. Думали: наймем 100 анонимных разметчиков на краудсорсинге, получим метки, обучим модель. Реальность ударила по лицу.
После 3 дней разметки один из наших разметчиков написал: «Я не могу продолжать. Каждый текст - это чья-то боль, а я просто ставлю галочки. Чувствую себя монстром». Мы остановили проект на неделю.
Новое правило: размечают только профессиональные психологи, прошедшие подготовку. Им платят не за количество текстов, а за время работы + обязательные супервизии (разбор сложных случаев с более опытным коллегой).
Методология разметки стала трехступенчатой:
- Первый психолог: оценка по шкале от 0 до 10 (где 10 - непосредственная угроза)
- Второй психолог: независимая оценка того же текста
- При расхождении >2 баллов - обсуждение на супервизии, консенсусная оценка
Да, это в 5 раз дороже краудсорсинга. Но согласованность оценок выросла с 65% до 89%. И главное - мы не сломали психику разметчикам. Кстати, некоторые инструменты из статьи про автоматизацию разметки датасетов нам помогли, но только на этапе предварительной фильтрации безопасных текстов.
Технические ловушки, о которых не пишут в учебниках
Классовый дисбаланс, который нельзя исправить oversampling
В обычных задачах ты берешь minority class и размножаешь. Здесь minority class - это тексты людей на грани. Размножать их синтетически? Создавать искусственные суицидальные мысли? Это этический провал.
Наше решение: многоуровневая классификация вместо бинарной. Вместо «суицид/не суицид» мы разметили 5 уровней:
- 0: Нейтральный/позитивный контент
- 1: Легкий стресс, повседневные трудности
- 2: Выраженная депрессия, но без суицидальных мыслей
- 3: Пассивные суицидальные мысли («иногда думаю, что всем было бы лучше без меня»)
- 4: Активные суицидальные мысли или план
Так мы получили более сбалансированное распределение (уровни 0-2 встречаются часто) и сохранили важный сигнал в уровнях 3-4.
Контекст, который все усложняет
Одна и та же фраза в разном контексте значит разное. «Я устал» после марафона - это уровень 0. «Я устал» в посте о потере работы, разводе и одиночестве - это уже уровень 2-3.
Мы экспериментировали с разными подходами:
# Плохо: изолированные предложения
model.fit(sentences, labels) # Теряем контекст
# Лучше: целые посты с историей
model.fit(posts_with_history, labels) # Но как получить историю этично?
# Наше решение: контекстные окна с согласия
# Брали только связанные посты в рамках одного треда
# где автор явно вел диалог с собой или с другими
model.fit(thread_context, labels)
Интересно, что похожие проблемы с контекстом возникают и в других социально значимых проектах - например, в AI для диагностики аллергий, где один симптом в отрыве от других мало что значит.
Что получилось в итоге (цифры, а не эмоции)
| Метрика | Значение | Комментарий |
|---|---|---|
| Размер датасета | 8,423 текста | Мало для ML, достаточно для proof-of-concept |
| Согласованность разметки | 89% | После внедрения трехступенчатой системы |
| Accuracy модели | 78% на уровнях 3-4 | Лучше случайного угадывания, хуже психолога |
| Ложные срабатывания | 12% | Приемлемо только с человеческой проверкой |
Самое важное: мы создали не просто датасет, а методологию. Любой университет или исследовательская группа теперь может повторить наш подход, не наступая на те же грабли.
Главные ошибки, которые нельзя повторять
- Экономить на психологах. Если размечают неспециалисты, вы получите мусор. Хуже того - вы можете причинить вред, неправильно интерпретировав текст.
- Игнорировать психическое здоровье разметчиков. Это не очередная задача по разметке изображений. Каждый текст - эмоциональная нагрузка. Супервизии обязательны.
- Думать, что анонимизация - это простое удаление имен. Современные методы deanonymization могут восстановить личность по совокупности, казалось бы, безобидных деталей.
- Гнаться за размером датасета. 10 000 качественно размеченных, этично собранных текстов лучше, чем 100 000 сомнительных.
Кстати, о качестве разметки: мы использовали некоторые техники из статьи про ошибки нейросетей и человеческий фактор, но адаптировали их под нашу специфику.
Что дальше? (неочевидный прогноз)
Через 2-3 года появятся законодательные нормы для таких датасетов. Сейчас это дикий запад - каждый делает как хочет. Но когда-то и медицинские данные были ничем не регулируемы. Сейчас за нарушение HIPAA сажают.
Наш совет: если вы начинаете похожий проект сегодня - сразу делайте так, как будто законы уже есть. Получайте этическое одобрение (даже если оно не требуется). Внедряйте многоуровневую анонимизацию. Работайте только с профессионалами.
Потому что в отличие от обычного ML, здесь цена ошибки измеряется не в долларах, а в человеческих жизнях. И эта цена слишком высока, чтобы учиться на своих ошибках.