pascalabcnet/InstallerSamples/MachineLearning/05_Validation/02_CrossValidate_Regression.pas

47 lines
1.8 KiB
ObjectPascal
Raw Normal View History

// В этом примере линейная регрессия оценивается двумя способами:
// 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.