即使使用像最近邻居这样的简单分类器,我也无法判断其准确性,因而无法改善它。
例如,使用以下代码:
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%。
如何找到准确度?无论是图形还是仅通过一个简单的百分比。
答案 0 :(得分:6)
进行机器学习和分类时的准确性通常通过比较分类器的预测输出与实际情况进行比较来计算。当您评估分类器的分类准确性时,您已经使用具有已知输入和输出的训练集创建了预测模型。此时,您将拥有测试集,其输入和输出不用于训练分类器。出于本文的目的,我们将其称为基础事实数据集。当您为此分类器提供之前未曾见过的输入时,此基础事实数据集有助于评估分类器的准确性。您从测试集中获取输入,并通过分类器运行它们。您获得每个输入的输出,我们将这些输出的集合称为预测值。
对于每个预测值,您将与相关的地面实况值进行比较,看它是否相同。您将预测和基础事实之间的输出匹配的所有实例相加。将所有这些值加起来,除以测试集中的总点数,得出模型准确预测结果与实际情况相比的实例部分。
在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 th 值与predictedLabels
中的i th 值匹配,则输出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];
使用上述向量的准确性给了我们:
>> accuracy
accuracy =
0.4000
>> accuracyPercentage
accuracyPercentage =
40
这意味着我们有40%的准确度或0.40的准确度。使用此示例,当您通过分类器输入每个测试集输入时,预测模型只能准确地对40%的测试集进行分类。这是有道理的,因为在我们预测的输出和基础事实之间,只有40%或6个输出匹配。这些是第1,第2,第6,第7,第10和第15个元素。还有其他衡量准确度的指标,如ROC curves,但在计算机器学习的准确度时,通常会这样做。