pascalabcnet/InstallerSamples/MachineLearning/04_Models/04_RegressionNonlinear.pas
Mikhalkovich Stanislav 7b1f89fb4c Добавлены примеры ML
Улучшены параметры синтетических датасетов

Метрики разнесены по трем классам

PlotML - сделан Surface и улучшены палитры
2026-03-24 14:26:08 +03:00

60 lines
2.3 KiB
ObjectPascal
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// В этом примере зависимость между признаками и целевой переменной
// специально сделана нелинейной. Линейная регрессия не умеет
// аппроксимировать такую зависимость, поэтому даёт большую ошибку
// и на обучении, и на тесте. Это не переобучение, а недообучение:
// модель слишком простая для задачи.
// RandomForest и GradientBoosting работают намного лучше,
// потому что деревья решений умеют моделировать сложные нелинейные связи.
// GradientBoosting показывает лучший результат,
// так как особенно хорошо приближает сложные зависимости.
uses MLABC;
begin
var (X, y) := Datasets.MakeRegression(
n := 300,
nFeatures := 2,
nInformative := 2,
noise := 0.1,
coefScale := 1.0,
bias := 0.0,
nonlinearStrength := 5.0, // КЛЮЧЕВОЕ !!!
shuffle := True,
seed := 42
);
var (XTrain, XTest, yTrain, yTest) := Validation.TrainTestSplit(
X, y, testRatio := 0.3, seed := 42
);
var lr := new LinearRegression;
lr.Fit(XTrain, yTrain);
var rf := new RandomForestRegressor(100);
rf.Fit(XTrain, yTrain);
var gb := new GradientBoostingRegressor(100);
gb.Fit(XTrain, yTrain);
var yTrainLR := lr.Predict(XTrain);
var yTestLR := lr.Predict(XTest);
var yTrainRF := rf.Predict(XTrain);
var yTestRF := rf.Predict(XTest);
var yTrainGB := gb.Predict(XTrain);
var yTestGB := gb.Predict(XTest);
Println('nonlinearStrength = 5.0');
Println;
Println('--- Train ---');
Println($'Linear MSE: {RegressionMetrics.MSE(yTrain, yTrainLR),0:F4}');
Println($'Forest MSE: {RegressionMetrics.MSE(yTrain, yTrainRF),0:F4}');
Println($'Boost MSE: {RegressionMetrics.MSE(yTrain, yTrainGB),0:F4}');
Println;
Println('--- Test ---');
Println($'Linear MSE: {RegressionMetrics.MSE(yTest, yTestLR),0:F4}');
Println($'Forest MSE: {RegressionMetrics.MSE(yTest, yTestRF),0:F4}');
Println($'Boost MSE: {RegressionMetrics.MSE(yTest, yTestGB),0:F4}');
end.