diff --git a/Code/MonoMultiViewClassifiers/ExecClassif.py b/Code/MonoMultiViewClassifiers/ExecClassif.py index a901413a8ced1f62dabd215b17a38c0eba329bb7..1731a110487fdf96e0ea72813c1b85ad6da5824a 100644 --- a/Code/MonoMultiViewClassifiers/ExecClassif.py +++ b/Code/MonoMultiViewClassifiers/ExecClassif.py @@ -22,7 +22,7 @@ from . import MonoviewClassifiers from .Multiview.ExecMultiview import ExecMultiview, ExecMultiview_multicore from .Monoview.ExecClassifMonoView import ExecMonoview, ExecMonoview_multicore from .Multiview import GetMultiviewDb as DB -from ResultAnalysis import resultAnalysis, analyzeLabels, analyzeIterResults +from ResultAnalysis import resultAnalysis, analyzeLabels, analyzeIterResults, analyzeIterLabels, genNamesFromRes from .utils import execution, Dataset # Author-Info @@ -170,7 +170,7 @@ def classifyOneIter_multicore(LABELS_DICTIONARY, argumentDictionaries, nbCores, trueLabels = DATASET.get("Labels").value times = [dataBaseTime, monoviewTime, multiviewTime] results = (resultsMonoview, resultsMultiview) - analyzeLabels(labels, trueLabels, results, directory) + labelAnalysis = analyzeLabels(labels, trueLabels, results, directory) logging.debug("Start:\t Analyze Global Results for iteration") resultAnalysis(benchmark, results, args.name, times, metrics, directory) logging.debug("Done:\t Analyze Global Results for iteration") @@ -181,7 +181,7 @@ def classifyOneIter_multicore(LABELS_DICTIONARY, argumentDictionaries, nbCores, "s, Multiview Time : " + str(multiviewTime) + "s, Global Analysis Time : " + str(globalAnalysisTime) + "s, Total Duration : " + str(totalTime) + "s") - return results + return results, labelAnalysis def classifyOneIter(LABELS_DICTIONARY, argumentDictionaries, nbCores, directory, args, classificationIndices, kFolds, @@ -244,7 +244,7 @@ def classifyOneIter(LABELS_DICTIONARY, argumentDictionaries, nbCores, directory, trueLabels = DATASET.get("Labels").value times = [dataBaseTime, monoviewTime, multiviewTime] results = (resultsMonoview, resultsMultiview) - analyzeLabels(labels, trueLabels, results, directory) + labelAnalysis = analyzeLabels(labels, trueLabels, results, directory) logging.debug("Start:\t Analyze Global Results") resultAnalysis(benchmark, results, args.name, times, metrics, directory) logging.debug("Done:\t Analyze Global Results") @@ -255,7 +255,7 @@ def classifyOneIter(LABELS_DICTIONARY, argumentDictionaries, nbCores, directory, "s, Multiview Time : " + str(multiviewTime) + "s, Global Analysis Time : " + str(globalAnalysisTime) + "s, Total Duration : " + str(totalTime) + "s") - return results + return results, labelAnalysis # _______________ # @@ -368,7 +368,16 @@ def execClassif(arguments): classificationIndices[iterIndex], kFolds[iterIndex], statsIterRandomStates[iterIndex], hyperParamSearch, metrics, DATASET, viewsIndices, dataBaseTime, start, benchmark, views)) - analyzeIterResults(iterResults, args.name, metrics, directory) + classifiersIterResults = [] + iterLabelAnalysis = [] + for result in iterResults: + classifiersIterResults.append(result[0]) + iterLabelAnalysis.append(result[1]) + + mono,multi = classifiersIterResults[0] + classifiersNames = genNamesFromRes(mono, multi) + analyzeIterLabels(iterLabelAnalysis, directory, classifiersNames) + analyzeIterResults(classifiersIterResults, args.name, metrics, directory) else: if not os.path.exists(os.path.dirname(directories + "train_labels.csv")): @@ -380,7 +389,7 @@ def execClassif(arguments): trainIndices, testIndices = classificationIndices trainLabels = DATASET.get("Labels").value[trainIndices] np.savetxt(directories + "train_labels.csv", trainLabels, delimiter=",") - res = classifyOneIter(LABELS_DICTIONARY, argumentDictionaries, nbCores, directories, args, classificationIndices, + res, labelAnalysis = classifyOneIter(LABELS_DICTIONARY, argumentDictionaries, nbCores, directories, args, classificationIndices, kFolds, statsIterRandomStates, hyperParamSearch, metrics, DATASET, viewsIndices, dataBaseTime, start, benchmark, views) diff --git a/Code/MonoMultiViewClassifiers/ResultAnalysis.py b/Code/MonoMultiViewClassifiers/ResultAnalysis.py index aa46938cb47777af9332d5981c93fe6c3f407af1..c185401fada3d7b86033231865da36f0859366fa 100644 --- a/Code/MonoMultiViewClassifiers/ResultAnalysis.py +++ b/Code/MonoMultiViewClassifiers/ResultAnalysis.py @@ -80,6 +80,27 @@ def resultAnalysis(benchmark, results, name, times, metrics, directory, minSize= plt.close() +def analyzeIterLabels(labelsAnalysisList, directory, classifiersNames, minSize=10): + nbExamples = labelsAnalysisList[0].shape[0] + nbClassifiers = len(classifiersNames) + nbIter = 2 + + figWidth = max(nbClassifiers / 2, minSize) + figHeight = max(nbExamples / 20, minSize) + figKW = {"figsize": (figWidth, figHeight)} + fig, ax = plt.subplots(nrows=1, ncols=1, **figKW) + data = sum(labelsAnalysisList) + cax = plt.imshow(data, interpolation='none', cmap="grey", aspect='auto') + plt.title('Errors depending on the classifier') + ticks = np.arange(nbIter/2-0.5, nbClassifiers * nbIter, nbIter) + plt.xticks(ticks, classifiersNames, rotation="vertical") + cbar = fig.colorbar(cax, ticks=[0, len(labelsAnalysisList)]) + cbar.ax.set_yticklabels(['Always Wrong', 'Always Right']) + fig.tight_layout() + fig.savefig(directory + time.strftime("%Y%m%d-%H%M%S") + "-error_analysis.png") + plt.close() + + def analyzeLabels(labelsArrays, realLabels, results, directory, minSize = 10): mono, multi = results classifiersNames = genNamesFromRes(mono, multi) @@ -101,7 +122,7 @@ def analyzeLabels(labelsArrays, realLabels, results, directory, minSize = 10): cax = plt.imshow(data, interpolation='none', cmap=cmap, norm=norm, aspect='auto') plt.title('Errors depending on the classifier') - ticks = np.arange(0, nbClassifiers * nbIter, nbIter) + ticks = np.arange(nbIter/2-0.5, nbClassifiers * nbIter, nbIter) labels = classifiersNames plt.xticks(ticks, labels, rotation="vertical") cbar = fig.colorbar(cax, ticks=[0, 1]) @@ -109,6 +130,7 @@ def analyzeLabels(labelsArrays, realLabels, results, directory, minSize = 10): fig.tight_layout() fig.savefig(directory + time.strftime("%Y%m%d-%H%M%S") + "-error_analysis.png") plt.close() + return data def genScoresNames(iterResults, metric, nbResults, names, nbMono, minSize=10):