64 lines
1.5 KiB
ObjectPascal
64 lines
1.5 KiB
ObjectPascal
uses MLABC;
|
|
|
|
begin
|
|
var ds := Datasets.UsedCarsPrice;
|
|
var df := ds.Data;
|
|
|
|
var features := [
|
|
'model',
|
|
'year',
|
|
'transmission',
|
|
'mileage_km',
|
|
'fuelType',
|
|
'l_100km',
|
|
'engineSize',
|
|
'Make'
|
|
];
|
|
|
|
var target := 'price_k_rub';
|
|
var (trainDf, testDf) := df.TrainTestSplit(0.2, seed := 42);
|
|
|
|
var prep :=
|
|
DataPipeline.BuildRegressionPreprocessing(
|
|
target,
|
|
features,
|
|
new OrdinalEncoder('model'),
|
|
new OneHotEncoder('transmission'),
|
|
new OneHotEncoder('fuelType'),
|
|
new OneHotEncoder('Make'),
|
|
new StandardScaler
|
|
);
|
|
|
|
var pipe := prep.WithModel(new RandomForestRegressor(12, 50));
|
|
pipe.Fit(trainDf);
|
|
|
|
var pred := pipe.Predict(testDf);
|
|
var y := testDf.ToVector(target);
|
|
var testR2 := Metrics.R2(y, pred);
|
|
|
|
var total := 0.0;
|
|
var folds := Validation.KFold(df.RowCount, 5, seed := 1);
|
|
var foldsCount := 0;
|
|
|
|
foreach var (trainIdx, testIdx) in folds do
|
|
begin
|
|
var foldTrain := df.TakeRows(trainIdx);
|
|
var foldTest := df.TakeRows(testIdx);
|
|
|
|
var foldPipe := prep.WithModel(new RandomForestRegressor(12, 50));
|
|
foldPipe.Fit(foldTrain);
|
|
|
|
var foldPred := foldPipe.Predict(foldTest);
|
|
var foldY := foldTest.ToVector(target);
|
|
|
|
total += Metrics.R2(foldY, foldPred);
|
|
foldsCount += 1;
|
|
end;
|
|
|
|
var cvR2 := total / foldsCount;
|
|
|
|
Println('Оценка RandomForestRegressor двумя способами');
|
|
Println($'R² на тестовой выборке: {testR2:F3}');
|
|
Println($'Средний R² по кросс-валидации: {cvR2:F3}');
|
|
end.
|