training_fds = fileDatastore(fullfile(pwd, 'Data', 'training'), 'ReadFcn', @importMeazzaFile, 'FileExtensions', '.mat','IncludeSubfolders',true);
data_dir = fullfile(pwd, 'Data', 'training');
folder_list = dir([data_dir filesep 'training*']);
reference_table = table();
for ifolder = 1:length(folder_list)
disp(['Processing files from folder: ' folder_list(ifolder).name])
current_folder = [data_dir filesep folder_list(ifolder).name];
reference_table = [reference_table; importReferencefile([current_folder filesep 'REFERENCE.csv'])];
if runExtraction | ~exist('FeatureTable.mat')
n_parts = numpartitions(training_fds, gcp);
subds = partition(training_fds, n_parts, ipart);
[feature_win,sampleN] = extractFeatures2(subds, win_len, win_overlap, reference_table);
feature_table = [feature_table; feature_win];
disp(['Part ' num2str(ipart) ' done.'])
save('FeatureTable', 'feature_table');
load('FeatureTable.mat');
disp(feature_table(1:5,:))
[training_set, test_set] = splitDataSets(feature_table,0.3);
subsample = 1:height(training_set);
cvp = cvpartition(length(subsample),'KFold',5);
disp("Training Ensemble classifier...")
opts = struct('Optimizer','bayesopt','ShowPlots',true,'CVPartition',cvp,...
'AcquisitionFunctionName','expected-improvement-plus','MaxObjectiveEvaluations',5);
trained_model = fitcensemble(training_set(subsample,:),'class','Cost',C,...
'OptimizeHyperparameters',{'Method','NumLearningCycles','LearnRate'},...
'HyperparameterOptimizationOptions',opts)
predicted_class = predict(trained_model, test_set);
conf_mat = confusionmat(test_set.class, predicted_class);
conf_mat_per = conf_mat*100./sum(conf_mat, 2);
labels = {'Abnormal', 'Normal'};
heatmap(labels, labels, conf_mat_per, 'Colormap', winter, 'ColorbarVisible','off');