如何有效地找到分类器的准确性

Stu*_*PhD 3 matlab classification machine-learning image-processing knn

即使使用像最近邻居这样的简单分类器,我也无法判断其准确性,因而无法改善它.

例如,使用以下代码:

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
Run Code Online (Sandbox Code Playgroud)

train_image_feats是一个300乘256的矩阵,其中每行代表一个图像.同样是结构test_image_feats.train_labels是与训练矩阵的每一行对应的标签.

我所遵循的书只是说上述方法达到了19%的准确率.

作者是如何得出这个结论的?有没有办法用这个分类器或其他来判断我的结果的准确性?

然后,作者使用另一种特征提取方法,并将其准确度提高了30%.

我怎样才能找到准确度?无论是图形还是仅通过一个简单的百分比.

ray*_*ica 6

进行机器学习和分类时的准确性通常通过比较分类器的预测输出与实际情况进行比较来计算.当您评估分类器的分类准确性时,您已经使用具有已知输入和输出的训练集创建了预测模型.此时,您将拥有一个测试集,其中包含用于训练分类器的输入和输出.出于本文的目的,我们将其称为基础事实数据集.当您为此分类器提供之前未曾见过的输入时,此基础事实数据集有助于评估分类器的准确性.您从测试集中获取输入,并通过分类器运行它们.您获得每个输入的输出,我们将这些输出的集合称为预测值.

对于每个预测值,您将与相关的地面实况值进行比较,看它是否相同.您将所有输出预测和基本事实之间匹配的实例相加.将所有这些值加起来,除以测试集中的总点数,就可以得出模型准确预测结果与实际情况相比的实例部分.

在MATLAB中,这非常简单.假设您的模型的类别是从您分类的标签总数1N哪里枚举的N.让groundTruth您的标签向量表示基本事实,同时predictedLabels表示您的分类器生成的标签.精确度的计算方法如下:

accuracy = sum(groundTruth == predictedLabels) / numel(groundTruth);
accuracyPercentage = 100*accuracy;
Run Code Online (Sandbox Code Playgroud)

第一行代码计算模型的准确度作为分数.第二行将其计算为百分比,您只需将第一行代码乘以100.您可以使用其中一个或当您想要评估准确性时使用.一个是正​​常化,[0,1]而另一个是从0%到100%的百分比.是什么groundTruth == predictedLabels做的是,它之间的每个元素进行比较groundTruthpredictedLabels.如果第i groundTruth与第i 值匹配predictedLabels,则输出a 1.如果没有,我们输出一个0.这将是0和1的向量,因此我们简单地总结所有1的值,这在sum操作中被雄辩地封装.然后,我们除以测试集中的总点数,以获得分类器的最终精度.

举一个玩具的例子,假设我有4个标签,我的groundTruthpredictedLabels矢量是这样的:

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];
Run Code Online (Sandbox Code Playgroud)

使用上述向量的准确性给我们:

>> accuracy

accuracy =

    0.4000

>> accuracyPercentage

accuracyPercentage =

    40
Run Code Online (Sandbox Code Playgroud)

这意味着我们具有40%的准确度或0.40的准确度.使用此示例,当您通过分类器输入每个测试集输入时,预测模型只能准确地对40%的测试集进行分类.这是有道理的,因为在我们预测的输出和基本事实之间,只有40%或6个输出匹配.这些是第1,第2,第6,第7,第10和第15个元素.计算精度还有其他指标,如ROC曲线,但在计算机器学习的准确性时,通常会这样做.