В 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 экземпляров.
Единственное отличие, которое я вижу, состоит в том, что во время обучения я использовал один и тот же векторизатор и трансформатор как для данных обучения, так и для данных испытаний, тогда как во время теста я использовал свежие векторизаторы и трансформаторы.
Так, я должен также как-то сохранить векторизаторы и преобразователи и перезагрузить их позже?