pascalabcnet/InstallerSamples/MachineLearning/08_Datasets/UsedCars/09_Residuals.pas

71 lines
2.2 KiB
ObjectPascal
Raw Permalink Normal View History

uses MLABC;
begin
var ds := Datasets.UsedCarsPrice;
var df := ds.Data;
// В этом примере смотрим не только на R²,
// но и на конкретные ошибки модели для отдельных автомобилей.
// Остаток = истинная цена - предсказанная цена.
// Если остаток положительный, модель занизила цену.
// Если отрицательный, модель завысила цену.
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 pipe :=
DataPipeline.BuildRegression(
target,
features,
new OrdinalEncoder('model'),
new OneHotEncoder('transmission'),
new OneHotEncoder('fuelType'),
new OneHotEncoder('Make'),
new StandardScaler,
new RandomForestRegressor(12, 50)
);
pipe.Fit(trainDf);
var pred := pipe.Predict(testDf);
var y := testDf.ToVector(target);
var models := testDf.Str('model');
var makes := testDf.Str('Make');
var years := testDf.Int('year');
var idx := Arr(0..pred.Length - 1);
idx := idx.OrderByDescending(i -> Abs(y[i] - pred[i])).ToArray;
Println('UsedCars: самые большие ошибки модели');
Println;
Println('Остаток = истинная цена - предсказанная цена.');
Println('Положительный остаток означает, что модель занизила цену.');
Println('Отрицательный остаток означает, что модель завысила цену.');
Println;
for var k := 0 to Min(9, idx.Length - 1) do
begin
var i := idx[k];
var residual := y[i] - pred[i];
Println($'{makes[i]} {models[i]}, {years[i]}');
Println($' Истинная цена: {y[i]:F0} тыс. руб.');
Println($' Прогноз: {pred[i]:F0} тыс. руб.');
Println($' Остаток: {residual:F0} тыс. руб.');
Println;
end;
end.