pascalabcnet/InstallerSamples/MachineLearning/04_Models/13_DecisionTreeRegression.pas

51 lines
2.2 KiB
ObjectPascal
Raw Normal View History

// В этом примере сравниваются две модели на нелинейной задаче:
// линейная регрессия и дерево решений для регрессии.
//
// Линейная модель умеет строить только одну общую прямую зависимость.
// Дерево решений разбивает пространство признаков на области
// и в каждой области даёт свой локальный прогноз.
uses MLABC;
begin
var (X, y) := Datasets.MakeRegression(
n := 300,
nFeatures := 2,
nInformative := 2,
noise := 0.15,
coefScale := 1.0,
bias := 0.0,
nonlinearStrength := 4.0,
shuffle := True,
seed := 42
);
var (XTrain, XTest, yTrain, yTest) := Validation.TrainTestSplit(
X, y, testRatio := 0.3, seed := 42
);
var linear := new LinearRegression;
linear.Fit(XTrain, yTrain);
// При minSamplesLeaf = 5 узел должен содержать хотя бы 10 объектов,
// чтобы его можно было разделить на два листа не меньше чем по 5 объектов.
var tree := new DecisionTreeRegressor(maxDepth := 6, minSamplesSplit := 10, minSamplesLeaf := 5);
tree.Fit(XTrain, yTrain);
var yPredLinear := linear.Predict(XTest);
var yPredTree := tree.Predict(XTest);
var r2Linear := RegressionMetrics.R2(yTest, yPredLinear);
var r2Tree := RegressionMetrics.R2(yTest, yPredTree);
Println('Сравнение моделей на нелинейной зависимости');
Println;
Println($'Линейная регрессия: R² = {r2Linear:F3}');
Println($'Дерево решений: R² = {r2Tree:F3}');
Println;
Println('Интерпретация результата:');
Println('- Линейная регрессия пытается описать всю зависимость одной формулой.');
Println('- Дерево решений умеет подстраиваться под разные участки данных.');
Println('- Поэтому на нелинейной задаче дерево обычно работает лучше.');
end.