60 lines
2.3 KiB
ObjectPascal
60 lines
2.3 KiB
ObjectPascal
|
|
// В этом примере зависимость между признаками и целевой переменной
|
|||
|
|
// специально сделана нелинейной. Линейная регрессия не умеет
|
|||
|
|
// аппроксимировать такую зависимость, поэтому даёт большую ошибку
|
|||
|
|
// и на обучении, и на тесте. Это не переобучение, а недообучение:
|
|||
|
|
// модель слишком простая для задачи.
|
|||
|
|
|
|||
|
|
// 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.
|