MATLAB - генерировать матрицу путаницы из классификатора

У меня есть некоторые тестовые данные и метки:

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 (истинно положительный) - элементы правильно помечены как 1
  • FP (ложное срабатывание) - элементы, неправильно помеченные как 1
  • TN (истинно отрицательный) - элементы правильно помечены как 2
  • FN (ложные негативы) - элементы, неправильно обозначенные как 2

Цель этого состоит в том, чтобы я мог создать кривую ROC для классификатора как часть школьной работы.

2 ответа

Решение

Вот код для построения 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

Вы можете зациклить точки, а затем использовать логическую индексацию и поэлементные логические операторы, чтобы получить большую часть того, что вы хотите.

 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

Я не запускал это, поэтому вам могут понадобиться некоторые настройки, но это должно помочь вам в большей части.

Другие вопросы по тегам