Конвейер регрессии
Конвейер регрессии объединяет подготовку табличных данных и модель, которая предсказывает число.
В классификации модель выбирает класс, например Да или Нет. В регрессии модель возвращает вещественное значение: цену, доход, температуру, время доставки или размер кредита.
Рассмотрим небольшую таблицу клиентов.
В ней есть признаки:
Возраст;Город;Доход.
И есть целевой столбец:
РазмерКредита.
По признакам клиента модель должна предсказать числовое значение — размер кредита.
Пример программы
Заголовок раздела «Пример программы»uses MLABC;
begin var csvText := '''Возраст,Город,Доход,РазмерКредита25,Москва,85000,120000032,Казань,62000,750000,Москва,91000,135000041,Самара,54000,58000029,Казань,73000,90000036,Самара,58000,64000027,Москва,88000,128000045,Казань,51000,52000031,Самара,76000,82000038,Москва,60000,79000028,Казань,82000,104000043,Самара,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 → RidgeRegressionImputer(['Возраст']) заполняет пропуск в столбце Возраст.
OneHotEncoder('Город') преобразует город в несколько числовых признаков. Например, вместо одного строкового столбца Город появляются отдельные признаки для разных городов.
StandardScaler масштабирует числовые признаки. Это важно для линейных моделей, потому что Возраст и Доход имеют разные масштабы.
RidgeRegression(1.0) обучается предсказывать числовое значение столбца РазмерКредита.
RidgeRegression очень похожа на LinearRegression: она тоже строит линейную зависимость между признаками и целевым значением. Отличие в том, что Ridge-регрессия немного ограничивает коэффициенты модели. Благодаря этому модель часто получается устойчивее, особенно когда признаков несколько или они связаны друг с другом.
В этом примере 1.0 — сила такого ограничения. Для первого знакомства достаточно воспринимать RidgeRegression как более аккуратный вариант линейной регрессии.
Обучение конвейера
Заголовок раздела «Обучение конвейера»Команда
pipe.Fit(trainDf);запускает обучение всего конвейера на обучающей таблице trainDf.
При этом конвейер:
- запоминает, как заполнять пропуски;
- запоминает, как кодировать города;
- настраивает масштабирование признаков;
- обучает модель
RidgeRegression.
Предсказание с помощью конвейера
Заголовок раздела «Предсказание с помощью конвейера»Команда
var pred := pipe.Predict(testDf);применяет к тестовой таблице те же преобразования и возвращает числовые предсказания.
В регрессии целевой столбец не кодируется как класс. Правильные ответы берутся как числовой вектор:
var ytest := testDf.ToVector('РазмерКредита');Результат
Заголовок раздела «Результат»Предсказания: [1245054.22,552884.04,622370.4]Истинные значения: [1280000,580000,640000]
MAE = 26563.78RMSE = 27491.12R2 = 0.992Первые две строки показывают предсказания модели и настоящие значения из тестовой выборки.
Например, для первого объекта модель предсказала размер кредита примерно 1245054, а настоящее значение равно 1280000.
Как читать метрики
Заголовок раздела «Как читать метрики»MAE = 26563.78 означает, что средняя абсолютная ошибка модели составляет примерно 26.5 тысяч.
RMSE = 27491.12 близка к MAE, значит на этом примере нет очень крупных промахов.
R2 = 0.992 означает, что модель очень хорошо объясняет различия в размере кредита на этой тестовой выборке.
Важно помнить, что датасет здесь маленький и учебный. В реальной задаче качество нужно проверять на большем количестве данных.
Отличие от классификации
Заголовок раздела «Отличие от классификации»В конвейере классификации целевой столбец превращается в метки классов:
Да → 0Нет → 1В конвейере регрессии целевой столбец уже является числовым, поэтому он остаётся числом.
Модель не выбирает класс, а предсказывает значение:
сырые табличные данные → подготовка признаков → числовое предсказаниеГлавное
Заголовок раздела «Главное»Конвейер регрессии позволяет описать весь процесс в одном месте:
DataFrame → подготовка признаков → модель регрессии → числоЭто особенно удобно, когда в таблице одновременно есть пропуски, категориальные столбцы и числовые признаки разных масштабов.