Matlab 如何根据Weka提供的结果绘制DET曲线?
我面临4个类别之间的分类问题,我使用Weka进行分类,结果如下表所示:Matlab 如何根据Weka提供的结果绘制DET曲线?,matlab,machine-learning,weka,Matlab,Machine Learning,Weka,我面临4个类别之间的分类问题,我使用Weka进行分类,结果如下表所示: Correctly Classified Instances 3860 96.5 % Incorrectly Classified Instances 140 3.5 % Kappa statistic 0.9533 Mean absolute error
Correctly Classified Instances 3860 96.5 %
Incorrectly Classified Instances 140 3.5 %
Kappa statistic 0.9533
Mean absolute error 0.0178
Root mean squared error 0.1235
Relative absolute error 4.7401 %
Root relative squared error 28.5106 %
Total Number of Instances 4000
=== Detailed Accuracy By Class ===
TP Rate FP Rate Precision Recall F-Measure ROC Area Class
0.98 0.022 0.936 0.98 0.957 0.998 A
0.92 0.009 0.973 0.92 0.946 0.997 B
0.991 0.006 0.982 0.991 0.987 1 C
0.969 0.01 0.971 0.969 0.97 0.998 D
Weighted Avg. 0.965 0.012 0.965 0.965 0.965 0.998
=== Confusion Matrix ===
a b c d <-- classified as
980 17 1 2 | a = A
61 920 1 18 | b = B
0 0 991 9 | c = C
6 9 16 969 | d = D
函数Compute\u DET
的代码为:
[Pmiss, Pfa] = Compute_DET(true_scores, false_scores)
num_true = max(size(true_scores));
num_false = max(size(false_scores));
total=num_true+num_false;
Pmiss = zeros(num_true+num_false+1, 1); %preallocate for speed
Pfa = zeros(num_true+num_false+1, 1); %preallocate for speed
scores(1:num_false,1) = false_scores;
scores(1:num_false,2) = 0;
scores(num_false+1:total,1) = true_scores;
scores(num_false+1:total,2) = 1;
scores=DETsort(scores);
sumtrue=cumsum(scores(:,2),1);
sumfalse=num_false - ([1:total]'-sumtrue);
Pmiss(1) = 0;
Pfa(1) = 1.0;
Pmiss(2:total+1) = sumtrue ./ num_true;
Pfa(2:total+1) = sumfalse ./ num_false;
return
但是我在翻译不同参数的含义时遇到了一个问题。例如,
mean_False
和stdv_False
的意义是什么?与Weka参数的对应关系是什么?为什么标题中都有大写字母?我认为您使用的是NIST DETware。涉及mean_False和stdv_False的代码片段正在合成随机示例数据以供演示(因此,这些是负面示例分数的平均值和标准偏差,当正面分数为零平均值和单位SD时)。您需要为所有测试样本计算分类器的实际分数(预阈值),然后调用Compute_DET(分数(A_示例)、分数([B_示例、C_示例、D_示例])来计算A的DET曲线,等等,其中A_示例是真实类为A的示例的索引向量,等等。
[Pmiss, Pfa] = Compute_DET(true_scores, false_scores)
num_true = max(size(true_scores));
num_false = max(size(false_scores));
total=num_true+num_false;
Pmiss = zeros(num_true+num_false+1, 1); %preallocate for speed
Pfa = zeros(num_true+num_false+1, 1); %preallocate for speed
scores(1:num_false,1) = false_scores;
scores(1:num_false,2) = 0;
scores(num_false+1:total,1) = true_scores;
scores(num_false+1:total,2) = 1;
scores=DETsort(scores);
sumtrue=cumsum(scores(:,2),1);
sumfalse=num_false - ([1:total]'-sumtrue);
Pmiss(1) = 0;
Pfa(1) = 1.0;
Pmiss(2:total+1) = sumtrue ./ num_true;
Pfa(2:total+1) = sumfalse ./ num_false;
return