-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodelosMatlab.m
More file actions
128 lines (121 loc) · 5.56 KB
/
Copy pathmodelosMatlab.m
File metadata and controls
128 lines (121 loc) · 5.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
function [metricas, clasificador] = modelosMatlab(Configuration, featuresForTraining, featuresForTest, objectsForTraining, objectsForTest, objetosEvaluar, modelo, entrenar, clasificar)
% Aviso: Si NO se entena y SI se clasifica, no va bien porque no cuenta los TP, etc
%
% modelo: 'NB'|'RL'|'RF'|'DT'|'SVM'
% (Naive Bayes, Regresion Logistica, Random Forest, Decision Tree, SVM)
%
% clasificar: true|false
% (si ademas de aprender los modelos hay que clasificar el training y
% sacar las metricas)
%
resultados = zeros(numel(objetosEvaluar)+1,8);
if(entrenar)
fprintf(['Entrenando el clasificador ' modelo '\n']);
y = categorical(objectsForTraining);
for m=1:numel(objetosEvaluar)
%Train the classifier
if(strcmp('NB',modelo))
clasificador = fitNaiveBayes(featuresForTraining,y', 'Distribution','kernel');
elseif(strcmp('RL',modelo))
mu = mean(featuresForTraining);
sigma = std(featuresForTraining);
X=bsxfun(@minus, featuresForTraining, mu);
X=bsxfun(@rdivide, X, sigma);
%clasificador = mnrfit(X,y(indice,:)');
clasificador = mnrfit(X,y','model','nominal');
elseif(strcmp('RF',modelo))
rng(1);
clasificador = TreeBagger(50,featuresForTraining,y','OOBPred','On');
elseif(strcmp('DT',modelo))
clasificador = fitctree(featuresForTraining,y','SplitCriterion','deviance');
else
error('ERROR! El parametro modelo de la funcion modelosMatlab solo admite las cadenas: NB|RL|RF|DT|SVM (Naive Bayes, Regresion Logistica, Random Forest, Decision Tree)');
end
if(clasificar)
if(strcmp('NB',modelo))
predicted = (double(clasificador.predict(featuresForTest))-1);
%Puede generar valores NaN, los tomo como negativos
predicted = predicted == 1;
elseif(strcmp('RL',modelo))
predicted = mnrval(clasificador,featuresForTest);
predicted = predicted(:,1);
predicted = predicted<=0.5;
elseif(strcmp('DT',modelo))
predicted = clasificador.predict(featuresForTest);
predicted = predicted == categorical(1);
else
error('ERROR! El parametro modelo de la funcion modelosWeka solo admite las cadenas: NB|RL|RF|DT|SVM (Naive Bayes, Regresion Logistica, Random Forest, Decision Tree)');
end
%The actual class labels (i.e. indices thereof)
actual = objectsForTest';
TP=0.001;TN=0.001;FP=0.001;FN=0.001;
for n=1:length(predicted)
if(predicted(n)) %se predice positivo
if(actual(n)) %es positivo
TP=TP+1;
else
FP = FP+1;
end
else %se predice negativo
if(~actual(n)) %es negativo
TN=TN+1;
else
FN=FN+1;
end
end
end
resultados(m,1) = TP/(TP+FN); %recall
resultados(m,2) = TP/(TP+FP); %precision
resultados(m,3) = 2*resultados(m,2)*resultados(m,1)/(resultados(m,2)+resultados(m,1)); %FScore
resultados(m,4) = (TP+TN)/(TP+TN+FP+FN); %accuracy
resultados(m,5) = TP; %TP
resultados(m,6) = TN; %TN
resultados(m,7) = FP; %FP
resultados(m,8) = FN; %FN
end
end
else
load(strcat('medidas/modelo',modelo,'Matlab.mat'));
end
%Si NO se entena y SI se clasifica, no va bien porque no cuenta los TP, etc
if(clasificar)
%Apañar la matriz de resultados
%Recall, precision y FScore se calculan con los datos totales
TP = sum(resultados(:,5));
TN = sum(resultados(:,6));
FP = sum(resultados(:,7));
FN = sum(resultados(:,8));
total = sum(sum(resultados(:, [5 6 7 8])));
resultados(numel(objetosEvaluar)+1, 5) = TP/(TP+FN);
resultados(numel(objetosEvaluar)+1, 6) = TN/(TN+FP);
resultados(numel(objetosEvaluar)+1, 7) = FP/(TN+FP);
resultados(numel(objetosEvaluar)+1, 8) = FN/(TP+FN);
resultados(numel(objetosEvaluar)+1, 1) = TP/(TP+FN);
resultados(numel(objetosEvaluar)+1, 2) = TP/(TP+FP);
resultados(numel(objetosEvaluar)+1, 3) = 2*resultados(numel(objetosEvaluar)+1, 2)*resultados(numel(objetosEvaluar)+1, 1)/(resultados(numel(objetosEvaluar)+1, 2)+resultados(numel(objetosEvaluar)+1, 1));
resultados(numel(objetosEvaluar)+1, 4) = (TP+TN)/total;
%Calcular las tasas locales de TP, TN, etc (machacando los valores
%absolutos de cada objeto)
for n=1:numel(objetosEvaluar)
totalP = sum(resultados(n, [5 8]));
totalN = sum(resultados(n, [6 7]));
resultados(n,5) = resultados(n,5)/totalP; %TP
resultados(n,6) = resultados(n,6)/totalN; %TN
resultados(n,7) = resultados(n,7)/totalN; %FP
resultados(n,8) = resultados(n,8)/totalP; %FN
end
%Vector que devuelve la funcion
metricas = resultados(m,:);
% %Poner las etiquetas
% resultados = num2cell(resultados);
% obj = cellstr('Obj1');
% for o=2:numel(objetosEvaluar)
% obj = [obj; cellstr(strcat('Obj',num2str(o)))];
% end
% obj = [obj;cellstr('Total')];
% et = [cellstr('-') cellstr('Recall') cellstr('Precision') cellstr('FScore') cellstr('Accuracy') cellstr('TP%') cellstr('TN%') cellstr('FP%') cellstr('FN%')];
%
% resultados = [obj resultados];
% resultados = [et;resultados];
end
end