Прежде чем строить модель, данные допрашивают. Сегодня вы получите
таблицу, на которой обучались сотни тысяч моделей по всему миру, — и
составите для неё паспорт: документ, после которого половина этих
моделей выглядит легкомысленно.
Файл с понятным именем и непонятным прошлым
Начнём с мысленного эксперимента. Вам прислали students.csv: 120
тысяч строк, 18 столбцов и колонка passed_exam. Соблазн велик:
загрузить, разбить, обучить, отчитаться о точности: четыре строки
кода. Но что в этой таблице строка? Ученик? Попытка сдачи? Снимок
электронного журнала за день? Если один ученик встречается двадцать
раз, случайное разбиение почти наверняка положит его и в обучение, и в
тест, и модель будет узнавать знакомых людей, а отчёт назовёт это
«работой с новыми учениками». Ни одна метрика не предупредит: числа
будут прекрасны ровно до встречи с настоящими новыми учениками.
Весь наш модуль о данных сводился к одному навыку: задавать таблице
вопросы раньше, чем она начнёт отвечать на ваши. В
уроке о данных мы спрашивали, как мир становится
таблицей; в уроке о статистике — кого в таблице нет; в
уроке о Кеплере устроили каталогу допрос и выяснили, что
столбец полуосей вычислен той самой формулой, которую мы им
«проверяли». Сегодня эти вопросы собираются в жанр с именем: паспорт
датасета. Это последний урок модуля, и он устроен как практикум:
один настоящий датасет, полный допрос, готовый образец — и ваши
собственные паспорта в задачах.
Перепись, ставшая бенчмарком
Наш подопытный — датасет Adult, он же Census Income: 48 842 анкеты из
текущего обследования населения США 1994 года, к каждой приписана
метка — зарабатывает ли человек больше 50 тысяч долларов в год. В 1996
году сотрудник компании SGI Барри Беккер вырезал его из переписных
файлов для задачи «предскажи доход по анкете», выложил в открытый
репозиторий UCI — и с тех пор Adult прожил вторую жизнь: это один из
самых используемых учебных датасетов в истории машинного обучения,
на нём открывали и закрывали тысячи статей о классификаторах и о
справедливости алгоритмов.
Копия лежит в репозитории курса: scripts/data/adult.data (32 561
строка, обучающая часть) и scripts/data/adult.test (16 281,
отложенная). Пятнадцать столбцов: возраст, тип занятости, образование
в двух видах, семейное положение, профессия, роль в домохозяйстве,
раса, пол, прирост и потери капитала, часы работы в неделю, страна
происхождения, загадочный fnlwgt — и метка <=50K/>50K. С виду —
самая обычная таблица. Паспорт покажет, что почти каждый её столбец
с двойным дном, и извлекать эти вторые донья мы будем по одному.
Вопрос первый: что такое строка
Первая строка паспорта отвечает на вопрос «что я вижу, глядя на одну
строку таблицы». Для Adult наивный ответ «один человек» неверен, и
разоблачает его столбец fnlwgt, final weight, вес анкеты. Перепись
не спрашивает всех: она опрашивает выборку и приписывает каждой анкете
число — скольких жителей страны эта анкета представляет. В Adult веса
бегут от 12 285 до 1 484 705: одна строка «весит» от двенадцати тысяч
до полутора миллионов человек,
Посчитаем долю высоких доходов дважды. По строкам, как делают почти
все: 7841/32561=24,1%. По людям, с весами: 23,9%. Здесь
разница мала, ведь выборка переписи хорошо сбалансирована, — но это
везение конкретного датасета, а не правило: в медицинских и банковских
таблицах, где выборку собирали с умыслом, забытые веса искажают доли в
разы. Паспорт обязан сказать: единица наблюдения — анкета обследования,
для популяционных утверждений использовать fnlwgt.
Вопрос второй: откуда взялся каждый столбец
Урок Кеплера («у каждого столбца есть происхождение») здесь
превращается в таблицу-опись. Возьмём пару education и
education_num: текстовая ступень образования и число. Сопоставьте
их, и получится ровно шестнадцать пар, биекция: это один и тот же
столбец в двух кодировках, число — просто порядковый номер ступени.
Модель, получившая оба, дважды услышит один факт; исследователь,
трактующий education_num как «годы учёбы», ошибётся: это ранг, а не
годы. Ни то ни другое не видно без проверки; проверка — одна строка
кода и одна строка паспорта.
Столбец capital_gain пришёл из налоговой части анкеты, hours — из
вопроса «сколько часов вы обычно работаете в неделю», метка >50K
склеена из нескольких доходных полей уже составителем. Каждое «откуда»
предсказывает будущие сюрпризы: самооценка часов даёт круглые числа и
хвастовство, склейка полей — пороговые артефакты. В
уроке об экзопланетах вычисленный столбец полуосей
маскировался под измеренный; здесь таких подмен несколько, и все
задокументированы только в переписных методичках — не в самом файле.
Файл вообще ничего о себе не рассказывает: у adult.data нет даже
строки заголовков.
Пропуски, которые притворяются категорией
В Adult нет ни одной пустой ячейки, и это плохая новость. Пропуски в
нём записаны знаком ?: в workclass их 5,64%, в occupation5,66%, в country1,79%. Программа, не знающая об этом,
честно заведёт категорию «знак вопроса» и обучится на ней; сводка
пропусков отрапортует ноль. Первый вопрос паспорта о пропусках — как
они обозначены: пустотой, ?, NA, нулём, значением −999 или
числом 99999 — все варианты встречаются в живых датасетах, и
несколько из них есть прямо в Adult.
Второй вопрос важнее: почему данные пропущены. Сравните пары: все
1836 анкет с пропуском в workclass имеют пропуск и в occupation
(обратных — семь: люди, никогда не работавшие). Это не два пропуска, а
один отказ от блока вопросов о работе. И отказ красноречив: среди
«молчунов» высокий доход вдвое реже, а средний возраст выше — 41
против 38,
P(>50K∣?)=10,4%противP(>50K∣ответ)=24,9%.
Такой пропуск не случаен: он сам — информация о человеке.
Выбросить эти строки — значит вычеркнуть из таблицы неработавших и
сместить все выводы; заполнить «самой частой категорией» — значит
записать безработных в частники. Правильного универсального ответа
нет, но паспорт обязан предупредить: пропуски в Adult связаны с
занятостью, любые операции с ними меняют состав выборки.
Рис. 12.1. Карта пропусков: один отказ, два столбца, разные люди
Слева — доли ? по столбцам: полосы workclass и occupation
совпадают, потому что за ними один и тот же отказ; country живёт
отдельной жизнью. Справа — портрет «молчунов» против ответивших:
вдвое меньшая доля высокого дохода и возраст на три года старше.
Пропуск с портретом — это переменная; пропуск без портрета — мина
под будущей моделью.
Совпадение первых двух долей с точностью до сотых — след анкетной
механики: один отказ гасит сразу два столбца. Такие совпадения — тоже
улики, и читать их мы учились на остатках Кеплера: слишком согласные
числа имеют общую причину.
Цензура на краях: три подозрительных спайка
Постройте гистограммы трёх числовых столбцов, и увидите одинаковую
странность. У возраста аккуратный спад к старости и вдруг столбик на
90 годах: 43 человека, при том что 89-летних ноль. У часов работы
пик на сорока — и хвостик ровно на 99. У прироста капитала море нулей,
разумный хвост — и 159 человек с суммой ровно 99 999 долларов.
Это не аномалии населения, а печать составителя: top-coding,
цензурирование сверху. Все возрасты «90 и старше» записаны как 90,
все большие приросты капитала — как 99999: перепись так защищает
анонимность редких людей и экономит разрядность. Спайк на границе
диапазона — почти всегда цензура, и обращаться с ним как с настоящим
значением нельзя: «средний доход группы 99999» — бессмыслица, у этой
группы известен только нижний предел. Паспорт перечисляет все
цензурированные столбцы и пороги; рис. 12.2 показывает все три спайка.
Рис. 12.2. Три спайка цензуры: 90 лет, 99 часов, 99 999 долларов
Гистограммы возраста, часов работы и прироста капитала по 32 561
анкете. Красные столбики прижаты к правой границе диапазона — след
top-coding: всё, что больше порога, записано порогом. Между 89 и 90
годами нет «провала поколения» — есть строка методички. Спайк на краю
распределения — вопрос к составителю, а не факт о мире.
Метка и её срок годности
Метка >50K выглядит самой надёжной частью таблицы, а стареет
быстрее всех. Порог назначен в долларах 1994 года; при средней
инфляции 2,4% в год уровень цен за 32 года вырос в
1,02432=e32ln1,024≈2,14
раза, и «больше 50 тысяч» образца 1994-го — это «больше ~107 тысяч»
сегодняшними деньгами. Модель, обученная на Adult, предсказывает не
«высокий доход», а «высокий доход по меркам Америки девяносто
четвёртого», и сдвинулись не только цены: изменилась структура
занятости, доля женщин в высоких доходах, само распределение
профессий. Это срок годности метки, и он есть у любой метки: спам
2000-х из урока о классификации не похож на спам
нынешний, «прибыльный клиент» прошлого кризиса — на прибыльного
после. Паспорт указывает дату сбора и честно отвечает на вопрос: на
какой мир имеет право обобщаться модель.
И вторая строка о метке: баланс классов,
P(>50K)=24,1%,P(≤50K)=75,9%.
Классификатор, всем подряд говорящий «меньше 50K», угадывает в трёх
случаях из четырёх — планка из урока о классификации,
ниже которой точность не считается результатом. Паспорт называет эту
планку явно, чтобы никто не рапортовал о 76% как о достижении.
Рамка выборки: на кого нельзя обобщать
Рамка Adult: гражданское неинституциональное население США, 1994 год,
взрослые респонденты. Каждое слово режет: не армия, не заключённые,
не другие страны, не подростки. Модель, обученную здесь, нельзя
переносить на другую экономику — не из-за размера, а
потому, что связи между образованием, профессией и доходом устроены в
разных странах по-разному: сам механизм другой, как у планет разной
звезды в уроке 11, — только там поправка известна
формулой, а здесь её не знает никто.
Столбец country соблазняет: в таблице есть выходцы из десятков
стран, можно «изучить доходы мексиканцев»? Нельзя: это мексиканцы,
живущие в США и попавшие в американскую перепись, — дважды
профильтрованная группа, по которой о Мексике не скажешь ничего.
Рамка выборки наследуется каждым срезом данных, и срез по стране
происхождения не отменяет американской рамки — тот же механизм, что у
«горячих юпитеров» в каталоге экзопланет: фильтр прибора виден в
любой подвыборке.
Тест с точкой на конце
Теперь — ловушка, на которой Adult поймал не одно поколение студентов.
Официальное разбиение датасета лежит в двух файлах, и файл
adult.test отличается от обучающего тремя мелочами. Первая строка —
служебный мусор |1x3 Cross validator, оставшийся от древней
утилиты. Метки записаны с точкой на конце: <=50K. вместо <=50K.
И вдобавок в обучающей части есть 24 полных дубля строк.
Наивный скрипт, сравнивающий предсказанные метки со строками из
файла, получит точность ноль процентов: >50K и >50K. — разные
строки. Скрипт постарше молча заведёт четыре класса вместо двух.
Это не выдуманная страшилка, а самая массовая ошибка на этом
датасете; она смешна ровно до момента, когда та же механика — разные
написания одного значения в разных файлах — встречает вас в рабочих
данных, где «Москва», «г. Москва» и «MOSCOW» делят одну колонку.
Паспорт фиксирует формат каждого файла и различия между ними;
проверка — одна строка: вывести множество значений метки в обоих
файлах и убедиться, что они совпадают,
Рис. 12.3. Одна метка, четыре написания: до и после чистки
Слева — все встречающиеся написания метки в adult.data и adult.test, как
их видит программа: четыре разных строки. Справа — после снятия
точек: два класса, и доли в обучении и тесте совпадают почти в точности
(24,08% против 23,62%) — разбиение честное. Сначала таблицу
приводят к одному языку, потом считают — никогда наоборот.
Чего в паспорте не хватает чаще всего
Опись столбцов и пропусков составит любой добросовестный стажёр.
Реже всего в паспортах встречается последний раздел — допустимые
применения, а именно он защищает людей. В Adult доля высоких доходов
резко различается по полу:
модель, обученная
на этих данных, выучит разрыв 1994 года как правило и уверенно
перенесёт его на каждого нового человека. Для исследования рынка
труда это материал; для скоринга резюме — автоматизация чужого
прошлого неравенства. Один и тот же датасет, две задачи, «можно» и
«нельзя» — и различие между ними живёт не в данных, а в паспорте.
Сюда же — лицензия и происхождение согласий: перепись анонимизирована
и открыта по закону, а вот таблица, выгруженная из школьного журнала
или больничной системы, открытой не бывает, какой бы «обезличенной»
ни казалась. Полный разговор о справедливости, приватности и
деанонимизации впереди, в уроке о безопасности ИИ;
паспорт — место, где эти вопросы задаются впервые.
Рис. 12.4. Разрыв, который модель выучит как правило
Доля метки >50K по полу и по возрастным группам. Модель без всяких
специальных признаков восстановит оба разреза из корреляций — пол и
возраст протекают через профессию, часы и семейное положение.
Паспорт не запрещает данные; он требует, чтобы решение «пускать ли
эту закономерность в дело» принимал человек, знающий о ней, а не
градиентный спуск, не знающий ничего.
Как Adult ушёл на пенсию
У этой истории есть эпилог, доказывающий, что паспорт — не формализм.
В 2021 году исследователи из Беркли (Фрэнсис Динг, Мориц Хардт и
коллеги) опубликовали работу с говорящим названием «Retiring Adult» —
«отправляя Adult на пенсию». Они показали ровно то, что мы нашли
допросом: порог в долларах 1994 года, устаревшая рамка и цензура
делают датасет негодным для современных исследований справедливости
алгоритмов, где он к тому времени стал стандартом де-факто, — выводы
статей менялись на противоположные при смене порога. Взамен они
собрали новые таблицы из свежих переписных данных — с настраиваемым
порогом, явной рамкой по штатам и годам и честной документацией.
Рис. 12.5. Три жизни одной таблицы: перепись, бенчмарк, отставка
Шкала жизни Adult: рождение в переписи (1994), публикация как
бенчмарка (1996), четверть века службы, манифест «datasheets for
datasets» (2018) и отставка с заменой (2021). Между вторым и
четвёртым событием датасет использовали почти без паспорта; вопросы,
закрывшие его карьеру, умещаются в шаблон этого урока.
Мораль для вашего паспорта двойная. Во-первых, даже датасет с
тридцатилетней историей и тысячами цитирований может оказаться
негодным для задачи — возраст и популярность не заменяют допроса.
Во-вторых, сам жанр победил: замена Adult поставляется с паспортом, и
сегодня уважающий себя датасет без документа о происхождении выглядит
так же странно, как лекарство без инструкции. Восемь абзацев, которые
вы напишете в задачах, — не школьное упражнение, а рабочий стандарт
индустрии.
Скелет паспорта
Соберём всё в шаблон — восемь разделов, каждый умещается в абзац:
Источник: кто, когда, как и зачем собирал; ссылка на методику.
Единица наблюдения: что такое строка, есть ли веса и ключи объектов.
Схема: каждый столбец — смысл, единицы, происхождение (измерено,
спрошено, вычислено). Пропуски: как обозначены и почему возникают.
Цензура и артефакты: пороги, спайки, округления. Рамка: пять скобок
из шаблона выше. Срок годности: дата сбора, что дрейфует. Допустимые
применения: для чего собран, для чего годится, для чего использовать
нельзя, лицензия. Восемь абзацев занимают страницу; их отсутствие
стоит годы чужих ошибок, потому что паспорт пишется один раз, а
читается каждым следующим пользователем данных.
Рис. 12.6. Скелет паспорта: восемь разделов в три блока
Восемь разделов паспорта с примерами из Adult. Первый блок описывает
таблицу, второй — её слепые зоны, третий — границы использования.
Порядок не случаен: не назвав единицу наблюдения, нельзя говорить о
пропусках; не описав рамку — о применениях. Это конспект всего модуля
о данных на одной схеме.
Лаборатория: инспектор переписи
Допрос Adult: спайки, пропуски и веса своими глазами
График шире экрана — листайте по горизонтали →
Загружается живая иллюстрация…
Порядок опытов. Пройдитесь по столбцам и найдите все три цензурных
спайка — гистограммы их подсвечивают. Переключите долю >50K со
строк на веса и убедитесь, что сдвиг мал. Посмотрите на пропуски:
столбики ? в workclass и occupation почти одинаковой высоты —
след общего отказа. И сравните метки train и test до чистки: четыре
класса там, где должно быть два. Всё, что вы видите, — те самые
проверки, из которых собирается паспорт; виджет просто делает их
мгновенными.
Паспорт руками: порядок допроса
Методика для ваших собственных датасетов — десять вопросов в строгом
порядке, каждый — одна команда или один взгляд на картинку. Сколько
строк и столбцов. Что такое строка. Какие типы у столбцов и что в
них на самом деле лежит: перечень различных значений категорий — здесь
всплывают ? и точки. Гистограмма каждого числового столбца — здесь
всплывают спайки и цензура. Доли классов метки. Пропуски по столбцам
и их пересечения. Дубли строк и дубли объектов. Согласованность
файлов между собой. Чего в данных нет — рамка. Кто и зачем собирал.
Первые восемь вопросов — механика на четверть часа. Последние два
требуют выйти из таблицы в мир: прочитать методичку, найти статью
источника — и именно они отличают паспорт от распечатки сводной
статистики.
Заметьте, чего в списке нет: ни одной модели. Паспорт пишется до и
живёт отдельно; если после обучения открылось новое — тестовые
метрики подозрительно хороши, признак подозрительно силён, — это
дописывается в паспорт как найденная особенность данных. Точность
модели устаревает с каждым переобучением; знание «в этом столбце
цензура на 99» — никогда.
Сборка: привычка смотреть в паспорт
Модуль о данных заканчивается там же, где начинался, — на том, что
таблица не говорит правды сама по себе. Строка Adult оказалась не
человеком, а анкетой с весом; «числовое образование» — рангом;
отсутствие пропусков — знаком вопроса; девяносто лет — потолком
кодировки; метка — снимком цен 1994 года; выборка — одной страной;
тест — файлом с точками на концах меток. Ни одна из этих находок не
потребовала модели — только вопросов, заданных в правильном порядке.
Это и есть паспорт: восемь абзацев, которые превращают чужую таблицу
в инструмент с инструкцией и предупреждениями. Дальше в курсе
начинается собственно обучение — нейрон, градиент, оптимизация, — и
каждый раз, когда очередная модель покажет удивительное число, первым
движением будет не тюнинг, а взгляд в паспорт: данные отвечают только
на те вопросы, которые им задали до начала экзамена.