ML - устранение неточностей и багов ML - оптимизация производительности DecisionTreeRegressor.Fit, RandomForestRegressor.Fit ML - тесты
61 lines
2.1 KiB
ObjectPascal
61 lines
2.1 KiB
ObjectPascal
// KNN чувствителен к масштабу признаков.
|
||
//
|
||
// В этом примере мы специально делаем часть признаков
|
||
// очень большими по масштабу. Без StandardScaler расстояние
|
||
// между объектами начинает определяться в основном этими
|
||
// признаками, и качество KNN ухудшается.
|
||
//
|
||
// После масштабирования все признаки снова становятся
|
||
// сопоставимыми, и модель работает лучше.
|
||
uses MLABC;
|
||
|
||
begin
|
||
var (X, y) := Datasets.MakeClassification(
|
||
n := 500,
|
||
nFeatures := 4,
|
||
nInformative := 2,
|
||
nRedundant := 0,
|
||
noise := 0.15,
|
||
classSep := 2.2,
|
||
flipProb := 0.02,
|
||
classBalance := 0.5,
|
||
shuffle := True,
|
||
seed := 42
|
||
);
|
||
|
||
// Искусственно увеличиваем масштаб двух последних признаков.
|
||
// Они начинают слишком сильно влиять на расстояние в KNN.
|
||
for var i := 0 to X.RowCount - 1 do
|
||
begin
|
||
X[i, 2] *= 1000;
|
||
X[i, 3] *= 1000;
|
||
end;
|
||
|
||
var (Xtrain, Xtest, ytrain, ytest) :=
|
||
Validation.TrainTestSplit(X, y, testRatio := 0.25, seed := 42);
|
||
|
||
// --- KNN без масштабирования
|
||
var knnRaw := new KNNClassifier(7);
|
||
knnRaw.Fit(Xtrain, ytrain);
|
||
|
||
var predRaw := knnRaw.Predict(Xtest);
|
||
var accRaw := Metrics.Accuracy(ytest, predRaw);
|
||
|
||
// --- Масштабируем признаки
|
||
var scaler := new StandardScaler;
|
||
scaler.Fit(Xtrain);
|
||
|
||
var XtrainScaled := scaler.Transform(Xtrain);
|
||
var XtestScaled := scaler.Transform(Xtest);
|
||
|
||
// --- KNN после масштабирования
|
||
var knnScaled := new KNNClassifier(7);
|
||
knnScaled.Fit(XtrainScaled, ytrain);
|
||
|
||
var predScaled := knnScaled.Predict(XtestScaled);
|
||
var accScaled := Metrics.Accuracy(ytest, predScaled);
|
||
|
||
Println($'Точность KNN без масштабирования: {accRaw:F3}');
|
||
Println($'Точность KNN после StandardScaler: {accScaled:F3}');
|
||
end.
|