SVM загруженная модель обучения значительно менее точна; нам нужно сохранить TokenCountVectorizer тоже? - PullRequest
0 голосов
/ 27 июня 2018

В Liblinear или Libsvm я загружаю данные, делю их на тренировки и тесты, что дает мне 95% точность. На этом этапе я сохраняю модель и метки для последующего повторного использования.

Теперь проблема в том, что когда я загружаю сохраненные данные в свою модель и проверяю метод прогнозирования даже на тех же данных, с которыми он тренировался с , точность падает до 53%!

Код, использованный для построения модели:

$vectorizer = new TokenCountVectorizer(new WhitespaceTokenizer());
$tfIdfTransformer = new TfIdfTransformer();

$vectorizer->fit($samples);
$vectorizer->transform($samples);

$tfIdfTransformer->fit($samples);
$tfIdfTransformer->transform($samples);

$dataset = new ArrayDataset($samples, $labels);
$randomSplit = new StratifiedRandomSplit($dataset, 0.1);

$classifier = new SVC(
    Kernel::LINEAR, // $kernel
    8.0,            // $cost
    3,              // $degree
    null,           // $gamma
    0.0,            // $coef0
    0.001,          // $tolerance
    100,            // $cacheSize
    true,           // $shrinking
    true            // $probabilityEstimates, set to true
);

$classifier->train($randomSplit->getTrainSamples(), $randomSplit->getTrainLabels());

$classifier->save($modelFile); // save the model and lables (everything in the classifier)

$predictedLabels = $classifier->predict($randomSplit->getTestSamples());
echo 'Accuracy: '.Accuracy::score($randomSplit->getTestLabels(), $predictedLabels); // this gives 0.95

Код, используемый для прогнозирования новых данных:

$classifier = new SVC();
$classifier->load($modelFile);

$vectorizer = new TokenCountVectorizer(new WhitespaceTokenizer());
$tfIdfTransformer = new TfIdfTransformer();

$vectorizer->fit($samples);
$vectorizer->transform($samples);

$tfIdfTransformer->fit($samples);
$tfIdfTransformer->transform($samples);

$dataset = new ArrayDataset($samples, $labels);

$predictedLabels = $classifier->predict($samples);
echo 'Accuracy: '.Accuracy::score($labels, $predictedLabels); // this gives 0.53

Примечание: $ samples и $ label одинаковы для обоих случаев - только в тесте они равны 100, тогда как при обучении их было 400 экземпляров.


Единственное отличие, которое я вижу, состоит в том, что во время обучения я использовал один и тот же векторизатор и трансформатор как для данных обучения, так и для данных испытаний, тогда как во время теста я использовал свежие векторизаторы и трансформаторы.

Так, я должен также как-то сохранить векторизаторы и преобразователи и перезагрузить их позже?

1 Ответ

0 голосов
/ 28 июня 2018

Да.

Данные, используемые для тестирования или производства, должны быть преобразованы так же, как это было сделано при первоначальном обучении.

По этой причине вам нужно использовать те же функции, тот же механизм масштабирования и тот же процесс преобразования, чтобы получить лучшие результаты прогнозирования.

...