支持SVM的训练模型的准确性大大降低;我们还需要保存TokenCountVectorizer吗?

时间:2018-06-27 09:49:31

标签: machine-learning svm libsvm

在Liblinear或Libsvm上,我加载数据,将其分为训练和测试,这给了我95%的准确性。此时,我保存了模型和标签以供以后重用。

现在的问题是,当我将保存的数据加载到我的模型上并测试预测方法时,即使对训练过的相同数据,其准确性也下降到53%!

用于构建模型的代码:

\Z

用于预测新数据的代码:

$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

注意::两种情况下的$ samples和$ labels相同-仅在测试中为100个,而在训练中为400个实例。


我看到的唯一区别是,在训练期间,我在训练数据和测试数据上使用了相同的矢量化器和转换器,而在测试期间,我使用了新的矢量化器和转换器。

那么,我还应该以某种方式保存矢量化器和转换器并在以后重新加载吗?

1 个答案:

答案 0 :(得分:2)

是的。

用于测试或生产的数据必须以与初始培训中相同的方式进行转换。

因此,您需要使用相同的功能,相同的缩放机制和相同的转换过程才能获得更好的预测结果。