即使使用像最近邻这样的简单分类器,我似乎也无法判断它的准确性,因此无法改进它。
例如下面的代码:
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 x 256 矩阵,其中每一行代表一个图像。同样是 test_image_feats
的结构。 train_labels
是训练矩阵每一行对应的标签。
我正在看的书上简单说了上面的方法达到了19%的准确率。
作者是如何得出这个结论的?有什么方法可以判断我的结果的准确性,无论是使用这个分类器还是其他分类器?
然后作者使用了另一种特征提取方法,并说它提高了 30% 的准确率。
如何找到准确度?无论是图形化还是简单的百分比。
最佳答案
进行机器学习和分类时的准确性通常是通过将分类器的预测输出与地面实况进行比较来计算的。当您评估分类器的分类准确性时,您将已经使用具有已知输入和输出的训练集创建了一个预测模型。此时,您将拥有一个测试集,其输入和输出未用于训练分类器。出于本文的目的,我们将其称为ground truth 数据集。当您向这个分类器提供它以前没有见过的输入时,这个基本事实数据集有助于评估分类器的准确性。您从测试集中获取输入,并通过分类器运行它们。您可以获得每个输入的输出,我们将这些输出的集合称为预测值。
对于每个预测值,您将与关联的地面真实值进行比较,看看它是否相同。您将输出在预测和基本事实之间匹配的所有实例相加。将所有这些值相加,然后除以测试集中的总点数,得出与真实情况相比,模型准确预测结果的实例比例。
在 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
中的第 ith 值与 predictedLabels
中的第 ith 值匹配,我们输出一个 1
。如果不是,我们输出一个 0
。这将是一个由 0 和 1 组成的向量,因此我们简单地将所有为 1 的值相加,这被 Eloquent 地封装在 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];
使用上述向量的准确度给我们:
>> accuracy
accuracy =
0.4000
>> accuracyPercentage
accuracyPercentage =
40
这意味着我们有 40% 的准确度或 0.40 的准确度。使用此示例,当您将每个测试集输入通过分类器时,预测模型只能准确分类 40% 的测试集。这是有道理的,因为在我们预测的输出和真实情况之间,只有 40% 或 6 个输出匹配。这些是第 1、2、6、7、10 和 15 元素。计算准确性还有其他指标,例如 ROC curves ,但是在机器学习中计算准确度时,通常会这样做。
关于matlab - 我怎样才能有效地找到分类器的准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25535051/