【发布时间】:2018-12-06 03:55:41
【问题描述】:
在 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 和 $labels 在两种情况下是相同的 - 只是在测试中它们是 100,而在训练中它们是 400 个实例。
我看到的唯一区别是,在训练期间,我在训练数据和测试数据上使用了相同的矢量化器和转换器,而在测试期间,我使用了新的矢量化器和转换器。
那么,我是否也应该以某种方式保存矢量化器和转换器并稍后重新加载它们?
【问题讨论】:
标签: machine-learning svm libsvm