Cross validation example with multiple classifiers
This example runs cross validation and shows confusion matrix using multiple classifiers
- For CoSMoMVPA's copyright information and license terms, #
 - see the COPYING file distributed with CoSMoMVPA. #
 
Contents
Define data
config = cosmo_config(); data_path = fullfile(config.tutorial_data_path, 'ak6', 's01'); data_fn = fullfile(data_path, 'glm_T_stats_perrun.nii'); mask_fn = fullfile(data_path, 'vt_mask.nii'); ds = cosmo_fmri_dataset(data_fn, 'mask', mask_fn, ... 'targets', repmat(1:6, 1, 10), ... 'chunks', floor(((1:60) - 1) / 6) + 1); % remove constant features ds = cosmo_remove_useless_data(ds);
 Define classifiers in a cell
>@@>
classifiers = {@cosmo_classify_nn, ...
               @cosmo_classify_naive_bayes, ...
               @cosmo_classify_lda};
% if svm classifier is present (either libsvm or matlab's svm), use that
% too
if cosmo_check_external('svm', false)
    classifiers{end + 1} = @cosmo_classify_svm;
end
% <@@<
nclassifiers = numel(classifiers);
Define partitions
partitions = cosmo_nfold_partitioner(ds);
Run classifications
Compute the accuracy and predictions for each classifier, and plot the confusion matrix
for k = 1:nclassifiers classifier = classifiers{k}; % get predictions for each fold, and store the result in % a variable 'pred'. % This output is in a 60 x 10 matrix, corresponding to predictions % for all 60 samples and 10 folds % >@@> pred = cosmo_crossvalidate(ds, classifier, partitions); % <@@< % use cosmo_confusion_matrix to compute the confusion matrix for each % fold, and store the results in a variable 'confusion_matrix_folds'. % The output is 6 x 6 x 10, consisting of 10 confusion matrices each % of size 6 x 6 % >@@> confusion_matrix_folds = cosmo_confusion_matrix(ds.sa.targets, pred); % <@@< % sum the confusion matrix_folds alnog the third dimension to % obtain a single 6 x 6 confusion matrix. Store the result % in a variable named confusion_matrix % >@@> confusion_matrix = sum(confusion_matrix_folds, 3); % <@@< % show the confusion matrix figure(); imagesc(confusion_matrix, [0 10]); accuracy = sum(diag(confusion_matrix)) / sum(confusion_matrix(:)); title(sprintf('%s: %.3f', strrep(func2str(classifier), '_', ' '), accuracy)); end
 
 
 Consider effect or normalization
normalizations = {'zscore', ...
                  'demean', ...
                  'scale_unit', ...
                  'none'};
for k = 1:nclassifiers
    classifier = classifiers{k};
    classifier_name = strrep(func2str(classifier), '_', ' ');
    for j = 1:numel(normalizations)
        opt = struct();
        opt.normalization = normalizations{j};
        [pred, accuracy] = cosmo_crossvalidate(ds, classifier, partitions, opt);
        fprintf('%s with %s-normalization: %.3f\n', classifier_name, ...
                opt.normalization, accuracy);
    end
end
cosmo classify nn with zscore-normalization: 0.417 cosmo classify nn with demean-normalization: 0.450 cosmo classify nn with scale_unit-normalization: 0.450 cosmo classify nn with none-normalization: 0.450 cosmo classify naive bayes with zscore-normalization: 0.600 cosmo classify naive bayes with demean-normalization: 0.600 cosmo classify naive bayes with scale_unit-normalization: 0.600 cosmo classify naive bayes with none-normalization: 0.600 cosmo classify lda with zscore-normalization: 0.850 cosmo classify lda with demean-normalization: 0.833 cosmo classify lda with scale_unit-normalization: 0.817 cosmo classify lda with none-normalization: 0.833