Перейти к содержимому

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 обучается предсказывать значение целевого столбца Выжил.

На этом примере хорошо видно, что для реальных табличных данных одной модели недостаточно. Перед обучением данные нужно подготовить.