pascalabcnet/InstallerSamples/MachineLearning/08_Datasets/TitanicRu/13_MisclassifiedPassengers.pas

68 lines
2 KiB
ObjectPascal
Raw Permalink Normal View History

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 :=
DataPipeline.BuildClassification(
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);
var testPrepared := pipe.Transform(testDf);
var cur := testFull.GetCursor;
var curPrepared := testPrepared.GetCursor;
Println('TitanicRu: пассажиры, классифицированные неправильно');
Println;
var shown := 0;
while cur.MoveNext do
begin
if not curPrepared.MoveNext then
break;
var i := cur.Position;
if y[i] <> pred[i] then
begin
var id := cur.Int('Id');
var name := cur.Str('Имя');
var sex := cur.Str('Пол');
var pclass := cur.Int('Класс');
var age := curPrepared.Float('Возраст');
var fare := cur.Float('ЦенаБилета');
Println($'Id={id}, {name}');
Println($' Пол={sex}, класс={pclass}, возраст={age:F1}, билет={fare:F1}');
Println($' Истина: {LabelText(y[i])}, прогноз: {LabelText(pred[i])}');
Println;
shown += 1;
if shown >= 10 then break;
end;
end;
end.