47 lines
1.8 KiB
ObjectPascal
47 lines
1.8 KiB
ObjectPascal
|
|
// В этом примере линейная регрессия оценивается двумя способами:
|
|||
|
|
// 1. по одной обучающей и тестовой выборке;
|
|||
|
|
// 2. по k-fold кросс-валидации.
|
|||
|
|
//
|
|||
|
|
// Для регрессии в качестве метрики используется R²:
|
|||
|
|
// чем ближе значение к 1, тем лучше модель объясняет данные.
|
|||
|
|
|
|||
|
|
uses MLABC;
|
|||
|
|
|
|||
|
|
begin
|
|||
|
|
var ds := Datasets.MoscowHousing;
|
|||
|
|
var df := ds.Data;
|
|||
|
|
|
|||
|
|
var features := ['rooms', 'area', 'kitchen_area', 'floor', 'floors_total', 'metro_minutes'];
|
|||
|
|
var target := 'price';
|
|||
|
|
|
|||
|
|
var X := df.ToMatrix(features);
|
|||
|
|
var y := df.ToVector(target);
|
|||
|
|
|
|||
|
|
var (XTrain, XTest, yTrain, yTest) :=
|
|||
|
|
Validation.TrainTestSplit(X, y, testRatio := 0.2, seed := 1);
|
|||
|
|
|
|||
|
|
var model := new LinearRegression;
|
|||
|
|
model.Fit(XTrain, yTrain);
|
|||
|
|
|
|||
|
|
var yPred := model.Predict(XTest);
|
|||
|
|
var testR2 := RegressionMetrics.R2(yTest, yPred);
|
|||
|
|
|
|||
|
|
var cvR2 := Validation.CrossValidate(
|
|||
|
|
new LinearRegression,
|
|||
|
|
X, y,
|
|||
|
|
5,
|
|||
|
|
RegressionMetrics.R2,
|
|||
|
|
1
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
Println('Оценка линейной регрессии двумя способами');
|
|||
|
|
Println;
|
|||
|
|
Println($'R² на тестовой выборке: {testR2:F3}');
|
|||
|
|
Println($'Средний R² по кросс-валидации: {cvR2:F3}');
|
|||
|
|
Println;
|
|||
|
|
Println('Интерпретация результата:');
|
|||
|
|
Println('- Одна тестовая выборка даёт быструю оценку качества.');
|
|||
|
|
Println('- Кросс-валидация усредняет результат по нескольким разбиениям.');
|
|||
|
|
Println('- Если значения близки, модель ведёт себя достаточно стабильно.');
|
|||
|
|
end.
|