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

Конвейер регрессии

Конвейер регрессии объединяет подготовку табличных данных и модель, которая предсказывает число.

В классификации модель выбирает класс, например Да или Нет. В регрессии модель возвращает вещественное значение: цену, доход, температуру, время доставки или размер кредита.

Рассмотрим небольшую таблицу клиентов.

В ней есть признаки:

  • Возраст;
  • Город;
  • Доход.

И есть целевой столбец:

  • РазмерКредита.

По признакам клиента модель должна предсказать числовое значение — размер кредита.

uses MLABC;
begin
var csvText := '''
Возраст,Город,Доход,РазмерКредита
25,Москва,85000,1200000
32,Казань,62000,750000
,Москва,91000,1350000
41,Самара,54000,580000
29,Казань,73000,900000
36,Самара,58000,640000
27,Москва,88000,1280000
45,Казань,51000,520000
31,Самара,76000,820000
38,Москва,60000,790000
28,Казань,82000,1040000
43,Самара,56000,610000
''';
var df := DataFrame.FromCsvText(csvText);
var features := ['Возраст', 'Город', 'Доход'];
var (trainDf, testDf) :=
df.TrainTestSplit(
testRatio := 0.25,
seed := 42);
var pipe :=
DataPipeline.BuildRegression(
'РазмерКредита',
features,
new Imputer(['Возраст']),
new OneHotEncoder('Город'),
new StandardScaler,
new RidgeRegression(1.0)
);
pipe.Fit(trainDf);
var pred := pipe.Predict(testDf);
var ytest := testDf.ToVector('РазмерКредита');
Println('Предсказания:', pred);
Println('Истинные значения:', ytest);
Println;
Println($'MAE = {Metrics.MAE(ytest, pred):F2}');
Println($'RMSE = {Metrics.RMSE(ytest, pred):F2}');
Println($'R2 = {Metrics.R2(ytest, pred):F3}');
end.

В программе создаётся такой конвейер:

DataFrame
→ Imputer
→ OneHotEncoder
→ StandardScaler
→ RidgeRegression

Imputer(['Возраст']) заполняет пропуск в столбце Возраст.

OneHotEncoder('Город') преобразует город в несколько числовых признаков. Например, вместо одного строкового столбца Город появляются отдельные признаки для разных городов.

StandardScaler масштабирует числовые признаки. Это важно для линейных моделей, потому что Возраст и Доход имеют разные масштабы.

RidgeRegression(1.0) обучается предсказывать числовое значение столбца РазмерКредита.

RidgeRegression очень похожа на LinearRegression: она тоже строит линейную зависимость между признаками и целевым значением. Отличие в том, что Ridge-регрессия немного ограничивает коэффициенты модели. Благодаря этому модель часто получается устойчивее, особенно когда признаков несколько или они связаны друг с другом.

В этом примере 1.0 — сила такого ограничения. Для первого знакомства достаточно воспринимать RidgeRegression как более аккуратный вариант линейной регрессии.

Команда

pipe.Fit(trainDf);

запускает обучение всего конвейера на обучающей таблице trainDf.

При этом конвейер:

  1. запоминает, как заполнять пропуски;
  2. запоминает, как кодировать города;
  3. настраивает масштабирование признаков;
  4. обучает модель RidgeRegression.

Команда

var pred := pipe.Predict(testDf);

применяет к тестовой таблице те же преобразования и возвращает числовые предсказания.

В регрессии целевой столбец не кодируется как класс. Правильные ответы берутся как числовой вектор:

var ytest := testDf.ToVector('РазмерКредита');
Предсказания: [1245054.22,552884.04,622370.4]
Истинные значения: [1280000,580000,640000]
MAE = 26563.78
RMSE = 27491.12
R2 = 0.992

Первые две строки показывают предсказания модели и настоящие значения из тестовой выборки.

Например, для первого объекта модель предсказала размер кредита примерно 1245054, а настоящее значение равно 1280000.

MAE = 26563.78 означает, что средняя абсолютная ошибка модели составляет примерно 26.5 тысяч.

RMSE = 27491.12 близка к MAE, значит на этом примере нет очень крупных промахов.

R2 = 0.992 означает, что модель очень хорошо объясняет различия в размере кредита на этой тестовой выборке.

Важно помнить, что датасет здесь маленький и учебный. В реальной задаче качество нужно проверять на большем количестве данных.

В конвейере классификации целевой столбец превращается в метки классов:

Да → 0
Нет → 1

В конвейере регрессии целевой столбец уже является числовым, поэтому он остаётся числом.

Модель не выбирает класс, а предсказывает значение:

сырые табличные данные → подготовка признаков → числовое предсказание

Конвейер регрессии позволяет описать весь процесс в одном месте:

DataFrame → подготовка признаков → модель регрессии → число

Это особенно удобно, когда в таблице одновременно есть пропуски, категориальные столбцы и числовые признаки разных масштабов.