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

Файл с понятным именем и непонятным прошлым

Начнём с мысленного эксперимента. Вам прислали 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: одна строка «весит» от двенадцати тысяч до полутора миллионов человек,

строка=анкета×весдоля>50K=iwi[yi=>50K]iwi.\text{строка} =\text{анкета}\times\text{вес} \quad\Rightarrow\quad \text{доля}_{>50K} =\frac{\sum_i w_i\,[y_i={>}50K]}{\sum_i w_i}.

Посчитаем долю высоких доходов дважды. По строкам, как делают почти все: 7841/32561=24,1%7841/32561=24{,}1\%. По людям, с весами: 23,9%23{,}9\%. Здесь разница мала, ведь выборка переписи хорошо сбалансирована, — но это везение конкретного датасета, а не правило: в медицинских и банковских таблицах, где выборку собирали с умыслом, забытые веса искажают доли в разы. Паспорт обязан сказать: единица наблюдения — анкета обследования, для популяционных утверждений использовать fnlwgt.

Вопрос второй: откуда взялся каждый столбец

Урок Кеплера («у каждого столбца есть происхождение») здесь превращается в таблицу-опись. Возьмём пару education и education_num: текстовая ступень образования и число. Сопоставьте их, и получится ровно шестнадцать пар, биекция: это один и тот же столбец в двух кодировках, число — просто порядковый номер ступени. Модель, получившая оба, дважды услышит один факт; исследователь, трактующий education_num как «годы учёбы», ошибётся: это ранг, а не годы. Ни то ни другое не видно без проверки; проверка — одна строка кода и одна строка паспорта.

Столбец capital_gain пришёл из налоговой части анкеты, hours — из вопроса «сколько часов вы обычно работаете в неделю», метка >50K склеена из нескольких доходных полей уже составителем. Каждое «откуда» предсказывает будущие сюрпризы: самооценка часов даёт круглые числа и хвастовство, склейка полей — пороговые артефакты. В уроке об экзопланетах вычисленный столбец полуосей маскировался под измеренный; здесь таких подмен несколько, и все задокументированы только в переписных методичках — не в самом файле. Файл вообще ничего о себе не рассказывает: у adult.data нет даже строки заголовков.

Пропуски, которые притворяются категорией

В Adult нет ни одной пустой ячейки, и это плохая новость. Пропуски в нём записаны знаком ?: в workclass их 5,64%5{,}64\%, в occupation 5,66%5{,}66\%, в country 1,79%1{,}79\%. Программа, не знающая об этом, честно заведёт категорию «знак вопроса» и обучится на ней; сводка пропусков отрапортует ноль. Первый вопрос паспорта о пропусках — как они обозначены: пустотой, ?, NA, нулём, значением 999-999 или числом 9999999999 — все варианты встречаются в живых датасетах, и несколько из них есть прямо в Adult.

Второй вопрос важнее: почему данные пропущены. Сравните пары: все 1836 анкет с пропуском в workclass имеют пропуск и в occupation (обратных — семь: люди, никогда не работавшие). Это не два пропуска, а один отказ от блока вопросов о работе. И отказ красноречив: среди «молчунов» высокий доход вдвое реже, а средний возраст выше — 41 против 38,

P(>50K?)=10,4%противP(>50Kответ)=24,9%.P({>}50K \mid \texttt{?})=10{,}4\% \qquad\text{против}\qquad P({>}50K \mid \text{ответ})=24{,}9\% .

Такой пропуск не случаен: он сам — информация о человеке. Выбросить эти строки — значит вычеркнуть из таблицы неработавших и сместить все выводы; заполнить «самой частой категорией» — значит записать безработных в частники. Правильного универсального ответа нет, но паспорт обязан предупредить: пропуски в Adult связаны с занятостью, любые операции с ними меняют состав выборки.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева доли знака вопроса по трём столбцам Adult с полным совпадением workclass и occupation, справа сравнение группы с пропусками и без: доля высокого дохода 10,4 против 24,9 процента и средний возраст 41 против 38
Рис. 12.1. Карта пропусков: один отказ, два столбца, разные люди

Слева — доли ? по столбцам: полосы workclass и occupation совпадают, потому что за ними один и тот же отказ; country живёт отдельной жизнью. Справа — портрет «молчунов» против ответивших: вдвое меньшая доля высокого дохода и возраст на три года старше. Пропуск с портретом — это переменная; пропуск без портрета — мина под будущей моделью.

5,64% (workclass)    5,66% (occupation)    1,79% (country).5{,}64\%\ \text{(workclass)} \;\approx\; 5{,}66\%\ \text{(occupation)} \;\gg\; 1{,}79\%\ \text{(country)} .

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

Цензура на краях: три подозрительных спайка

Постройте гистограммы трёх числовых столбцов, и увидите одинаковую странность. У возраста аккуратный спад к старости и вдруг столбик на 90 годах: 43 человека, при том что 89-летних ноль. У часов работы пик на сорока — и хвостик ровно на 99. У прироста капитала море нулей, разумный хвост — и 159 человек с суммой ровно 99 999 долларов.

Это не аномалии населения, а печать составителя: top-coding, цензурирование сверху. Все возрасты «90 и старше» записаны как 90, все большие приросты капитала — как 99999: перепись так защищает анонимность редких людей и экономит разрядность. Спайк на границе диапазона — почти всегда цензура, и обращаться с ним как с настоящим значением нельзя: «средний доход группы 99999» — бессмыслица, у этой группы известен только нижний предел. Паспорт перечисляет все цензурированные столбцы и пороги; рис. 12.2 показывает все три спайка.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Три гистограммы столбцов Adult: возраст со столбиком на 90 годах, часы работы с пиком на 40 и спайком на 99, прирост капитала со спайком на 99999; спайки выделены красным
Рис. 12.2. Три спайка цензуры: 90 лет, 99 часов, 99 999 долларов

Гистограммы возраста, часов работы и прироста капитала по 32 561 анкете. Красные столбики прижаты к правой границе диапазона — след top-coding: всё, что больше порога, записано порогом. Между 89 и 90 годами нет «провала поколения» — есть строка методички. Спайк на краю распределения — вопрос к составителю, а не факт о мире.

Метка и её срок годности

Метка >50K выглядит самой надёжной частью таблицы, а стареет быстрее всех. Порог назначен в долларах 1994 года; при средней инфляции 2,4%2{,}4\% в год уровень цен за 32 года вырос в

1,02432=e32ln1,0242,141{,}024^{32}=e^{32\ln 1{,}024}\approx 2{,}14

раза, и «больше 50 тысяч» образца 1994-го — это «больше ~107 тысяч» сегодняшними деньгами. Модель, обученная на Adult, предсказывает не «высокий доход», а «высокий доход по меркам Америки девяносто четвёртого», и сдвинулись не только цены: изменилась структура занятости, доля женщин в высоких доходах, само распределение профессий. Это срок годности метки, и он есть у любой метки: спам 2000-х из урока о классификации не похож на спам нынешний, «прибыльный клиент» прошлого кризиса — на прибыльного после. Паспорт указывает дату сбора и честно отвечает на вопрос: на какой мир имеет право обобщаться модель.

И вторая строка о метке: баланс классов,

P(>50K)=24,1%,P(50K)=75,9%.P({>}50K)=24{,}1\%, \qquad P({\le}50K)=75{,}9\% .

Классификатор, всем подряд говорящий «меньше 50K», угадывает в трёх случаях из четырёх — планка из урока о классификации, ниже которой точность не считается результатом. Паспорт называет эту планку явно, чтобы никто не рапортовал о 76% как о достижении.

Рамка выборки: на кого нельзя обобщать

Рамка Adult: гражданское неинституциональное население США, 1994 год, взрослые респонденты. Каждое слово режет: не армия, не заключённые, не другие страны, не подростки. Модель, обученную здесь, нельзя переносить на другую экономику — не из-за размера, а потому, что связи между образованием, профессией и доходом устроены в разных странах по-разному: сам механизм другой, как у планет разной звезды в уроке 11, — только там поправка известна формулой, а здесь её не знает никто.

Столбец country соблазняет: в таблице есть выходцы из десятков стран, можно «изучить доходы мексиканцев»? Нельзя: это мексиканцы, живущие в США и попавшие в американскую перепись, — дважды профильтрованная группа, по которой о Мексике не скажешь ничего. Рамка выборки наследуется каждым срезом данных, и срез по стране происхождения не отменяет американской рамки — тот же механизм, что у «горячих юпитеров» в каталоге экзопланет: фильтр прибора виден в любой подвыборке.

Тест с точкой на конце

Теперь — ловушка, на которой Adult поймал не одно поколение студентов. Официальное разбиение датасета лежит в двух файлах, и файл adult.test отличается от обучающего тремя мелочами. Первая строка — служебный мусор |1x3 Cross validator, оставшийся от древней утилиты. Метки записаны с точкой на конце: <=50K. вместо <=50K. И вдобавок в обучающей части есть 24 полных дубля строк.

Наивный скрипт, сравнивающий предсказанные метки со строками из файла, получит точность ноль процентов: >50K и >50K. — разные строки. Скрипт постарше молча заведёт четыре класса вместо двух. Это не выдуманная страшилка, а самая массовая ошибка на этом датасете; она смешна ровно до момента, когда та же механика — разные написания одного значения в разных файлах — встречает вас в рабочих данных, где «Москва», «г. Москва» и «MOSCOW» делят одну колонку. Паспорт фиксирует формат каждого файла и различия между ними; проверка — одна строка: вывести множество значений метки в обоих файлах и убедиться, что они совпадают,

{метки train}=?{метки test}:{50K, >50K}{50K., >50K.}.\{\text{метки train}\} \stackrel{?}{=} \{\text{метки test}\}: \qquad \{{\le}50K,\ {>}50K\} \neq \{{\le}50K.,\ {>}50K.\} .
Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева четыре столбика различных значений метки в двух файлах Adult — с точками и без; справа после нормализации остаются два класса с долями 76 и 24 процента в обеих частях
Рис. 12.3. Одна метка, четыре написания: до и после чистки

Слева — все встречающиеся написания метки в adult.data и adult.test, как их видит программа: четыре разных строки. Справа — после снятия точек: два класса, и доли в обучении и тесте совпадают почти в точности (24,08%24{,}08\% против 23,62%23{,}62\%) — разбиение честное. Сначала таблицу приводят к одному языку, потом считают — никогда наоборот.

Чего в паспорте не хватает чаще всего

Опись столбцов и пропусков составит любой добросовестный стажёр. Реже всего в паспортах встречается последний раздел — допустимые применения, а именно он защищает людей. В Adult доля высоких доходов резко различается по полу:

666221790=30,6% у мужчинпротив117910771=10,9% у женщин;\frac{6662}{21\,790}=30{,}6\%\ \text{у мужчин} \qquad\text{против}\qquad \frac{1179}{10\,771}=10{,}9\%\ \text{у женщин};

модель, обученная на этих данных, выучит разрыв 1994 года как правило и уверенно перенесёт его на каждого нового человека. Для исследования рынка труда это материал; для скоринга резюме — автоматизация чужого прошлого неравенства. Один и тот же датасет, две задачи, «можно» и «нельзя» — и различие между ними живёт не в данных, а в паспорте.

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

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Столбиковая диаграмма долей высокого дохода по полу и по возрастным группам в Adult: у мужчин 30,6 процента, у женщин 10,9; по возрасту горб с максимумом в 45-54 года
Рис. 12.4. Разрыв, который модель выучит как правило

Доля метки >50K по полу и по возрастным группам. Модель без всяких специальных признаков восстановит оба разреза из корреляций — пол и возраст протекают через профессию, часы и семейное положение. Паспорт не запрещает данные; он требует, чтобы решение «пускать ли эту закономерность в дело» принимал человек, знающий о ней, а не градиентный спуск, не знающий ничего.

Как Adult ушёл на пенсию

У этой истории есть эпилог, доказывающий, что паспорт — не формализм. В 2021 году исследователи из Беркли (Фрэнсис Динг, Мориц Хардт и коллеги) опубликовали работу с говорящим названием «Retiring Adult» — «отправляя Adult на пенсию». Они показали ровно то, что мы нашли допросом: порог в долларах 1994 года, устаревшая рамка и цензура делают датасет негодным для современных исследований справедливости алгоритмов, где он к тому времени стал стандартом де-факто, — выводы статей менялись на противоположные при смене порога. Взамен они собрали новые таблицы из свежих переписных данных — с настраиваемым порогом, явной рамкой по штатам и годам и честной документацией.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Горизонтальная временная шкала: 1994 перепись CPS, 1996 публикация Adult в UCI, 2018 манифест паспортов датасетов, 2021 статья об отставке Adult и замена с настраиваемым порогом
Рис. 12.5. Три жизни одной таблицы: перепись, бенчмарк, отставка

Шкала жизни Adult: рождение в переписи (1994), публикация как бенчмарка (1996), четверть века службы, манифест «datasheets for datasets» (2018) и отставка с заменой (2021). Между вторым и четвёртым событием датасет использовали почти без паспорта; вопросы, закрывшие его карьеру, умещаются в шаблон этого урока.

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

Скелет паспорта

Соберём всё в шаблон — восемь разделов, каждый умещается в абзац:

источникединицасхемачто этопропускицензурарамкачего не видносрокприменениячто можно.\underbrace{\text{источник}\to\text{единица}\to\text{схема}}_{\text{что это}} \to \underbrace{\text{пропуски}\to\text{цензура}\to\text{рамка}}_{\text{чего не видно}} \to \underbrace{\text{срок}\to\text{применения}}_{\text{что можно}} .

Источник: кто, когда, как и зачем собирал; ссылка на методику. Единица наблюдения: что такое строка, есть ли веса и ключи объектов. Схема: каждый столбец — смысл, единицы, происхождение (измерено, спрошено, вычислено). Пропуски: как обозначены и почему возникают. Цензура и артефакты: пороги, спайки, округления. Рамка: пять скобок из шаблона выше. Срок годности: дата сбора, что дрейфует. Допустимые применения: для чего собран, для чего годится, для чего использовать нельзя, лицензия. Восемь абзацев занимают страницу; их отсутствие стоит годы чужих ошибок, потому что паспорт пишется один раз, а читается каждым следующим пользователем данных.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Схема из восьми прямоугольников в три группы: что это (источник, единица, схема), чего не видно (пропуски, цензура, рамка), что можно (срок, применения); под каждым короткий пример из Adult
Рис. 12.6. Скелет паспорта: восемь разделов в три блока

Восемь разделов паспорта с примерами из Adult. Первый блок описывает таблицу, второй — её слепые зоны, третий — границы использования. Порядок не случаен: не назвав единицу наблюдения, нельзя говорить о пропусках; не описав рамку — о применениях. Это конспект всего модуля о данных на одной схеме.

Лаборатория: инспектор переписи

Допрос Adult: спайки, пропуски и веса своими глазами

Загружается живая иллюстрация…

Порядок опытов. Пройдитесь по столбцам и найдите все три цензурных спайка — гистограммы их подсвечивают. Переключите долю >50K со строк на веса и убедитесь, что сдвиг мал. Посмотрите на пропуски: столбики ? в workclass и occupation почти одинаковой высоты — след общего отказа. И сравните метки train и test до чистки: четыре класса там, где должно быть два. Всё, что вы видите, — те самые проверки, из которых собирается паспорт; виджет просто делает их мгновенными.

Паспорт руками: порядок допроса

Методика для ваших собственных датасетов — десять вопросов в строгом порядке, каждый — одна команда или один взгляд на картинку. Сколько строк и столбцов. Что такое строка. Какие типы у столбцов и что в них на самом деле лежит: перечень различных значений категорий — здесь всплывают ? и точки. Гистограмма каждого числового столбца — здесь всплывают спайки и цензура. Доли классов метки. Пропуски по столбцам и их пересечения. Дубли строк и дубли объектов. Согласованность файлов между собой. Чего в данных нет — рамка. Кто и зачем собирал. Первые восемь вопросов — механика на четверть часа. Последние два требуют выйти из таблицы в мир: прочитать методичку, найти статью источника — и именно они отличают паспорт от распечатки сводной статистики.

Заметьте, чего в списке нет: ни одной модели. Паспорт пишется до и живёт отдельно; если после обучения открылось новое — тестовые метрики подозрительно хороши, признак подозрительно силён, — это дописывается в паспорт как найденная особенность данных. Точность модели устаревает с каждым переобучением; знание «в этом столбце цензура на 99» — никогда.

Сборка: привычка смотреть в паспорт

Модуль о данных заканчивается там же, где начинался, — на том, что таблица не говорит правды сама по себе. Строка Adult оказалась не человеком, а анкетой с весом; «числовое образование» — рангом; отсутствие пропусков — знаком вопроса; девяносто лет — потолком кодировки; метка — снимком цен 1994 года; выборка — одной страной; тест — файлом с точками на концах меток. Ни одна из этих находок не потребовала модели — только вопросов, заданных в правильном порядке. Это и есть паспорт: восемь абзацев, которые превращают чужую таблицу в инструмент с инструкцией и предупреждениями. Дальше в курсе начинается собственно обучение — нейрон, градиент, оптимизация, — и каждый раз, когда очередная модель покажет удивительное число, первым движением будет не тюнинг, а взгляд в паспорт: данные отвечают только на те вопросы, которые им задали до начала экзамена.

Задачи