MATLAB - 从分类器生成混淆矩阵

Posted

技术标签:

【中文标题】MATLAB - 从分类器生成混淆矩阵【英文标题】:MATLAB - generate confusion matrix from classifier 【发布时间】:2016-02-05 01:40:56 【问题描述】:

我有一些测试数据和标签:

testZ = [0.25, 0.29, 0.62, 0.27, 0.82, 1.18, 0.93, 0.54, 0.78, 0.31, 1.11, 1.08, 1.02];

testY = [1 1 1 1 1 2 2 2 2 2 2 2 2];

然后我对它们进行排序:

[sZ, ind] = sort(testZ); %%Sorts Z, and gets indexes of Z
sY = testY(ind); %%Sorts Y by index
[N, n] = size(testZ');

这将给出排序后的 Y 数据。在排序后的 Y 数据的每个元素上,我想将左侧的每个点分类为 1 类,将右侧的所有点分类为 2 类;然后将对数据的每个点重复此操作。我怎样才能做到这一点并找出每个元素的变量:

TP(true positive) - 正确标记为 1 的元素 FP(误报) - 元素错误地标记为 1 TN(真负) - 正确标记为 2 的元素 FN(假阴性) - 元素错误地标记为 2

这样做的目的是让我可以为分类器创建 ROC 曲线,作为学校工作的一部分。

【问题讨论】:

当你说:'每个点向左'时,代表多少个点? testY中的点数与1s相同吗? @BillBokeey 第一个点左边应该没有元素,右边应该有13个(sY中元素的数量),然后找到混淆矩阵,然后对其余部分重复相同的过程点数 好的,我正在发布答案 你会有非常大的数据集吗? @BillBokeey 不,数据集的大小应该与测试数据大致相同 【参考方案1】:

以下是绘制 ROC 并求 AUC 值的代码:

tot_op = testZ;
targets = testY;
th_vals= sort(tot_op);

for i = 1:length(th_vals)
  b_pred = (tot_op>=th_vals(i,1));
  TP = sum(b_pred == 1 & targets == 2);
  FP = sum(b_pred == 1 & targets == 1);
  TN = sum(b_pred == 0 & targets == 1);
  FN = sum(b_pred == 0 & targets == 2);
  sens(i) = TP/(TP+FN);
  spec(i) = TN/(TN+FP);
end


figure(2);
cspec = 1-spec;
cspec = cspec(end:-1:1);
sens = sens(end:-1:1);
plot(cspec,sens,'k');

AUC = sum(0.5*(sens(2:end)+sens(1:end-1)).*(cspec(2:end) - cspec(1:end-1)));
fprintf('\nAUC: %g \n',AUC);

以上代码是http://www.dcs.gla.ac.uk/~srogers/firstcourseml/matlab/chapter5/svmroc.html给出的修改版本

【讨论】:

【参考方案2】:

您可以遍历这些点,然后使用逻辑索引和逐元素布尔运算符来获得您想要的大部分内容。

 for i = 1:length(sY)
      classification = [ones(1,i-1) 2*ones(1,length(sy)-i+1)];
      isTruePositive = ( (sY == classification) & (sY == 1) );
      numberOfTruePositive = sum(isTruePositive);
      % Similar for other cases.

      % Use the result in the loop or store it somewhere - as written here
      % variables are over-written each iteration in the loop.
 end

我没有运行此程序,因此您可能需要进行一些调整,但这应该可以帮助您完成大部分工作。

【讨论】:

我相信您在2*ones(i,length(sy)) 处犯了一个错误。不是2*ones(1,length(sy)-i+1)吗?加上numberOfTruePositive 将在每次迭代中被覆盖,你应该使用ii 而不是i 来索引你的循环 @BillBokeey 谢谢。我通过编辑固定了长度。您是对的,示例中的变量将被覆盖。由于我们不知道 OP 想要对结果做什么,所以我没有尝试为他解决这个问题。显然,它需要存储在某个地方,或者在下一次迭代之前在循环中的某个地方使用。 您好,感谢您的回答,我明天会测试一下,看看是否能满足我的需求并及时通知您!

以上是关于MATLAB - 从分类器生成混淆矩阵的主要内容,如果未能解决你的问题,请参考以下文章

如何生成混淆矩阵并找到朴素贝叶斯分类器的错误分类率?

无法理解 SVM 返回的混淆矩阵

Matlab如何在matlab利用plotconfusion中绘制混淆矩阵

matlab如何在matlab利用plotconfusion中绘制混淆矩阵

R语言中的一类分类。生成混淆矩阵时我做错了啥?

Matlab在matlab绘制渐变混淆矩阵