TitanicRu
TitanicRu — русифицированный вариант классического датасета Titanic.
Это один из самых известных учебных датасетов в машинном обучении. Он используется для задачи бинарной классификации: по данным о пассажире нужно предсказать, выжил он или нет.
В версии TitanicRu часть значений переведена на русский язык: например, пол пассажира и порт посадки. Кроме того, длинные имена столбцов укорочены по сравнению с исходным датасетом, чтобы таблицу было удобнее читать в учебных примерах.
Файл данных:
titanic_ru.csvВ программе датасет доступен так:
var ds := Datasets.TitanicRu;var df := ds.Data;Особенности датасета
Заголовок раздела «Особенности датасета»TitanicRu полезен тем, что он ближе к реальным табличным задачам, чем совсем простые учебные наборы данных.
В нём есть:
- числовые признаки: возраст, стоимость билета, число родственников;
- категориальные признаки: пол, порт посадки;
- пропущенные значения;
- бинарная целевая переменная.
Поэтому на этом датасете удобно показывать полный цикл машинного обучения: подготовку данных, кодирование категорий, заполнение пропусков, обучение модели и оценку качества.
Какую задачу решает датасет
Заголовок раздела «Какую задачу решает датасет»Это задача классификации.
Целевой столбец — Выжил. Он показывает, выжил пассажир или нет:
0 — не выжил1 — выжилМодель получает признаки пассажира и должна предсказать один из двух классов.
Например, в таблице есть такие строки:
Id,Имя,Выжил,Класс,Пол,Возраст,БратьяИСупруги,РодителиИДети,ЦенаБилета,ПортПосадки1,Owen Harris Braund,0,3,муж,22,1,0,7.25,Саутгемптон2,John Bradley Cumings,1,1,жен,38,1,0,71.2833,ШербурЗдесь Выжил — правильный ответ, который известен в обучающих данных. Остальные столбцы можно использовать как признаки.
Информация о датасете
Заголовок раздела «Информация о датасете»uses MLABC;
begin Datasets.Language := 'ru';
var ds := Datasets.TitanicRu; ds.Info; Println;
ds.ClassCounts.PrintLines(kv -> ds.ClassName(kv.Key) + ' → ' + kv.Value);end.Эта программа выводит общую информацию о датасете, количество объектов каждого класса и первые строки таблицы.
По этому выводу можно быстро понять структуру задачи: целевой столбец Выжил, признаки пассажиров и соотношение классов.
Вывод:
Датасет: titanic_ru
Описание:Датасет пассажиров Титаника для задачи бинарной классификации выживания
Задача: классификацияСтрок: 891Признаков: 7Категориальные признаки: Класс, Пол, ПортПосадки
Целевой столбец:Выжил → выжил
Признаки:Класс → класс билетаПол → полВозраст → возрастБратьяИСупруги → количество братьев, сестёр и супругов на бортуРодителиИДети → количество родителей и детей на бортуЦенаБилета → цена билетаПортПосадки → порт посадки
не выжил → 549выжил → 342Подготовка данных
Заголовок раздела «Подготовка данных»Модель машинного обучения не может напрямую работать со всеми столбцами исходной таблицы.
Например:
Id— служебный номер строки, он не несёт полезной информации для модели;Имя— длинный текстовый столбец, для первого примера его лучше убрать;Возрастсодержит пропуски, их нужно заполнить;ПолиПортПосадкиявляются категориальными признаками, их нужно преобразовать в числа.
Для этого удобно использовать конвейер.
Пример классификации
Заголовок раздела «Пример классификации»В этом примере конвейер сам выполняет подготовку данных и обучает модель логистической регрессии.
uses MLABC;
begin var ds := Datasets.TitanicRu; var features := [ 'Класс', 'Пол', 'Возраст', 'БратьяИСупруги', 'РодителиИДети', 'ЦенаБилета', 'ПортПосадки' ];
var df := ds.Data.Drop(['Id', 'Имя']);
var (trainDf, testDf) := df.StratifiedTrainTestSplit(ds.Target, testRatio := 0.2, seed := 42);
var pipe := DataPipeline.BuildClassification( ds.Target, features, new Imputer(['Возраст']), new Imputer('Саутгемптон', ['ПортПосадки']), new OneHotEncoder('Класс'), new OneHotEncoder('Пол'), new OneHotEncoder('ПортПосадки'), new StandardScaler, new LogisticRegression(learningRate := 0.1, epochs := 2000) );
pipe.Fit(trainDf);
var pred := pipe.Predict(testDf); var y := pipe.GetEncodedLabels(testDf);
Println('Классификация выживания на Титанике'); Println($'Accuracy = {Metrics.Accuracy(y, pred):F3}');end.Вывод:
Классификация выживания на ТитаникеAccuracy = 0.798Это означает, что модель правильно предсказала исход примерно для 80% пассажиров из тестовой выборки.
Для первого примера на реальных табличных данных это нормальный результат. В датасете есть пропуски, категориальные признаки и факторы, которые не отражены в таблице. Выживание зависело не только от данных пассажира, но и от случайных обстоятельств. Более сложные модели могут дать другое качество, но даже простая логистическая регрессия уже находит важные закономерности.
Что делает конвейер
Заголовок раздела «Что делает конвейер»В этом примере конвейер выполняет несколько шагов.
Imputer(['Возраст']) заполняет пропущенные значения возраста.
Imputer('Саутгемптон', ['ПортПосадки']) заполняет пропуски в порте посадки указанным значением.
OneHotEncoder('Класс'), OneHotEncoder('Пол') и OneHotEncoder('ПортПосадки') преобразуют категориальные признаки в числовые бинарные признаки.
StandardScaler масштабирует числовые признаки.
LogisticRegression обучается предсказывать значение целевого столбца Выжил.
На этом примере хорошо видно, что для реальных табличных данных одной модели недостаточно. Перед обучением данные нужно подготовить.