即使使用像最近邻这样的简单分类器,我也无法判断其准确性,因此无法进行改进。
例如,以下是我的代码:
IDX = knnsearch(train_image_feats, test_image_feats); predicted_categories = cell([size(test_image_feats, 1), 1]); for i=1:size(IDX,1) predicted_categories{i}=train_labels(IDX(i)); end
这里,train_image_feats
是一个 300 行 256 列的矩阵,每一行代表一张图像。test_image_feats
的结构相同。train_labels
是训练矩阵每行对应的标签。
我所参考的书籍简单地提到上述方法达到了 19% 的准确率。
作者是如何得出这一结论的?有没有什么方法可以评估我的结果的准确性,无论是使用这个分类器还是其他分类器?
作者随后使用了另一种特征提取方法,并称其提高了 30% 的准确率。
我该如何找到准确性?无论是通过图形展示还是简单地用百分比表示。
回答:
在进行机器学习和分类时,准确性通常是通过将分类器的预测输出与真实值进行比较来计算的。在评估分类器的分类准确性时,你已经使用已知输入和输出的训练集创建了一个预测模型。此时,你将有一个测试集,其输入和输出未用于训练分类器。为了本文的目的,我们称这个测试集为真实值数据集。这个真实值数据集有助于评估当你向分类器提供它之前未见过的输入时,分类器的准确性。你从测试集中获取输入,并通过分类器运行它们。你会为每个输入得到输出,我们将这些输出的集合称为预测值。
对于每个预测值,你将其与相关的真实值进行比较,看是否相同。你将所有预测值与真实值匹配的实例加起来。将所有这些值加起来,并除以测试集中的总点数,就可以得到模型相对于真实值准确预测结果的实例比例。
在 MATLAB 中,这很容易计算。假设你的模型类别是从 1
到 N
编号的,其中 N
是你用于分类的总标签数。让 groundTruth
成为表示真实值的标签向量,而 predictedLabels
表示由分类器生成的标签。准确性简单地计算为:
accuracy = sum(groundTruth == predictedLabels) / numel(groundTruth);accuracyPercentage = 100*accuracy;
第一行代码计算你的模型的准确性作为一个分数。第二行代码将其计算为百分比,你只需将第一行代码乘以 100 即可。你可以根据需要使用其中任何一种来评估准确性。一个是标准化为 [0,1]
之间的值,而另一个是 0% 到 100% 的百分比。groundTruth == predictedLabels
所做的是比较 groundTruth
和 predictedLabels
之间的每个元素。如果 groundTruth
中的第 i 个值与 predictedLabels
中的第 i 个值匹配,我们输出 1
。如果不匹配,我们输出 0
。这将是一个由 0 和 1 组成的向量,因此我们只需将所有值为 1 的值加起来,这在 sum
操作中得到了优雅的封装。然后我们除以测试集中的总点数,以获得分类器的最终准确性。
举个简单的例子,假设我有 4 个标签,我的 groundTruth
和 predictedLabels
向量如下:
groundTruth = [1 2 3 2 3 4 1 1 2 3 3 4 1 2 3];predictedLabels = [1 2 2 4 4 4 1 2 3 3 4 1 2 3 3];
使用上述向量计算的准确性为:
>> accuracyaccuracy = 0.4000>> accuracyPercentageaccuracyPercentage = 40
这意味着我们有 40% 的准确率或 0.40 的准确性。使用这个例子,预测模型在将每个测试集输入通过分类器时,只能准确分类 40% 的测试集。这是有道理的,因为在我们的预测输出和真实值之间,只有 40%,即 6 个输出是匹配的。这些是第 1、2、6、7、10 和 15 个元素。计算准确性的其他指标,如ROC 曲线,但在机器学习中计算准确性时,通常是这么做的。