2026-05-20 21:25:14 +03:00
|
|
|
|
uses MLABC;
|
|
|
|
|
|
|
|
|
|
|
|
function LabelText(v: integer): string;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := if v = 1 then 'выжил' else 'не выжил';
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
var ds := Datasets.TitanicRu;
|
|
|
|
|
|
var features := ['Класс', 'Пол', 'Возраст', 'БратьяИСупруги', 'РодителиИДети', 'ЦенаБилета', 'ПортПосадки'];
|
|
|
|
|
|
|
|
|
|
|
|
var fullDf := ds.Data;
|
|
|
|
|
|
var (trainFull, testFull) :=
|
|
|
|
|
|
fullDf.StratifiedTrainTestSplit(ds.Target, testRatio := 0.2, seed := 42);
|
|
|
|
|
|
|
|
|
|
|
|
var trainDf := trainFull.Drop(['Id', 'Имя']);
|
|
|
|
|
|
var testDf := testFull.Drop(['Id', 'Имя']);
|
|
|
|
|
|
|
|
|
|
|
|
var pipe :=
|
2026-05-28 10:23:22 +03:00
|
|
|
|
DataPipeline.BuildClassification(
|
2026-05-20 21:25:14 +03:00
|
|
|
|
ds.Target,
|
|
|
|
|
|
features,
|
|
|
|
|
|
new Imputer(['Возраст']),
|
|
|
|
|
|
new Imputer('Саутгемптон', ['ПортПосадки']),
|
|
|
|
|
|
new OneHotEncoder('Пол'),
|
|
|
|
|
|
new OneHotEncoder('ПортПосадки'),
|
|
|
|
|
|
new StandardScaler,
|
|
|
|
|
|
new RandomForestClassifier(nTrees := 100, maxDepth := 6, minSamplesLeaf := 3, minSamplesSplit := 6)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
pipe.Fit(trainDf);
|
|
|
|
|
|
|
|
|
|
|
|
var pred := pipe.Predict(testDf);
|
|
|
|
|
|
var y := pipe.GetEncodedLabels(testDf);
|
2026-05-28 23:56:46 +03:00
|
|
|
|
var testPrepared := pipe.Transform(testDf);
|
2026-05-20 21:25:14 +03:00
|
|
|
|
var cur := testFull.GetCursor;
|
2026-05-28 23:56:46 +03:00
|
|
|
|
var curPrepared := testPrepared.GetCursor;
|
2026-05-20 21:25:14 +03:00
|
|
|
|
|
|
|
|
|
|
Println('TitanicRu: пассажиры, классифицированные неправильно');
|
|
|
|
|
|
Println;
|
|
|
|
|
|
|
|
|
|
|
|
var shown := 0;
|
|
|
|
|
|
while cur.MoveNext do
|
|
|
|
|
|
begin
|
2026-05-28 23:56:46 +03:00
|
|
|
|
if not curPrepared.MoveNext then
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2026-05-20 21:25:14 +03:00
|
|
|
|
var i := cur.Position;
|
2026-05-28 23:56:46 +03:00
|
|
|
|
if y[i] <> pred[i] then
|
2026-05-20 21:25:14 +03:00
|
|
|
|
begin
|
|
|
|
|
|
var id := cur.Int('Id');
|
|
|
|
|
|
var name := cur.Str('Имя');
|
|
|
|
|
|
var sex := cur.Str('Пол');
|
|
|
|
|
|
var pclass := cur.Int('Класс');
|
2026-05-28 23:56:46 +03:00
|
|
|
|
var age := curPrepared.Float('Возраст');
|
2026-05-20 21:25:14 +03:00
|
|
|
|
var fare := cur.Float('ЦенаБилета');
|
|
|
|
|
|
|
|
|
|
|
|
Println($'Id={id}, {name}');
|
|
|
|
|
|
Println($' Пол={sex}, класс={pclass}, возраст={age:F1}, билет={fare:F1}');
|
2026-05-28 23:56:46 +03:00
|
|
|
|
Println($' Истина: {LabelText(y[i])}, прогноз: {LabelText(pred[i])}');
|
2026-05-20 21:25:14 +03:00
|
|
|
|
Println;
|
|
|
|
|
|
|
|
|
|
|
|
shown += 1;
|
|
|
|
|
|
if shown >= 10 then break;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end.
|