在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个实例。
我看到的唯一区别是,在训练期间,我在训练数据和测试数据上使用了相同的矢量化器和转换器,而在测试期间,我使用了新的矢量化器和转换器。
那么,我还应该以某种方式保存矢量化器和转换器并在以后重新加载吗?
答案 0 :(得分:2)
是的。
用于测试或生产的数据必须以与初始培训中相同的方式进行转换。
因此,您需要使用相同的功能,相同的缩放机制和相同的转换过程才能获得更好的预测结果。