Valutazione di un classificatore

Considerata l'impossibilità di costruire un classificatore universale
migliore in assoluto, dovendo quindi valutare per ogni problema quale
tecnica risulti migliore, sorge il problema di poter valutare la bontà di
un classificatore applicato a un dato problema di classificazione. Si
osservi che per la valutazione di un classificatore l'unico strumento
utilizzabile è il classificatore stesso ed il dataset di addestramento.

Contents

Valutazione di un singolo test

Per la valutazione delle performance di un classificatore devono essere
seguite le fasi di addestramento e test su dataset differenti, per questo
motivo il dataset di addestramento viene suddiviso in due parti, una
delle quali viene utilizzata per l'addestramento e l'altra per il test.
La valutazione della bontà di un classificatore avviene calcolando
alcuni coefficienti tra cui:
Accuratezza:     Percentuale di classificazioni corrette.
Precision:       Percentuale di positivi trovati.
Recall:          Percentuale di documenti trovati.
Per il calcolo di queste misure spesso si ricorre all'utilizzo di:
TP:      Numero di veri positivi (classificati true erano true).
TN:      Numero di veri negativi (classificati false erano false).
FP:      Numero di falsi positivi (classificati true anche se false).
FN:      Numero di falsi negativi (classificati false anche se true).

da cui:

accuracy = \frac{TP+TN}{TP+TN+FP+FN}
precision = \frac{TP}{TP+FP}
recall = \frac{TP}{TP+FN}
% Carico il dataset:
load mnist_01r2;

% Preparo i dati di train:
samples = double([train0,train1]);
classification = [false(1,size(train0,2)),true(1,size(train1,2))];

% Addestro un classificatore:
net = OIPCAClearn(samples,classification);

% Preparo il dataset di test:
testSamples = double([test0,test1]);
testClassification = [false(1,size(test0,2)),true(1,size(test1,2))];

% Eseguo il test:
sclass = OIPCACclassify(net,testSamples);

% Calcolo l'accuratezza:
acc = sum(sclass==testClassification)/numel(sclass);

% Calcolo TP, TN, FP, FN:
TP = sclass & testClassification;
TN = not(sclass) & not(testClassification);
FP = sclass & not(testClassification);
FN = not(sclass) & testClassification;

% Precision e recall:
precision = TP/(TP+FP);
recall = TP/(TP+FN);

% Vediamo i risultati:
fprintf('accuracy: %2.2f%%\nprecision: %2.2f%%\nrecall: %2.2f%%\n',acc*100,precision*100,recall*100);
accuracy: 99.81%
precision: 99.91%
recall: 99.74%

K-Folding

Una valutazione più accurata di un classificatore può essere ottenuta
iterando la procedura seguente sull'intero dataset operando come segue:
1) fissato un valore intero K>1, il dataset viene partizionato;
2) ad ogni iterazione K-1 parti vengono usate per l'addestramento e una
   per il test;
3) le misure di bontà del classificatore vengono mediate.
Se si utilizza K=N numero totale di esempi si ottiene leave-one-out, ad
ogni iterazione tutto il dataset tranne un elemento viene utilizzato per
l'addestramento e un solo esempio viene usato per il test, l'insieme
finale di classificazioni viene usato per il calcolo delle misure di
bontà del classificatore.
Altre misure spesso utilizzate sono:
Specificity:     Abilità nell'identificare i negativi.
                 specificity = \frac{TN}{TN+FP}
Sensitivity:     Abilità nell'identificare i positivi.
                 specificity = \frac{TP}{TP+FN}
%  Preparo i dati:
samples = [samples,testSamples];
classification = [classification,testClassification];

% Esecuzione del K-Folding:
[accuracies,specificity,sensitivity] = ...
    KFolding(samples,classification,'OIPCAC',{},10);

% Vediamo i risultati:
figure; Hx = 0.995:0.001:1;
subplot(311); hist(accuracies,Hx); title('Accuracy');
subplot(312); hist(specificity,Hx); title('Specificity');
subplot(313); hist(sensitivity,Hx); title('Sensitivity');