From 94d560cf56869761d68e27ff7e79a3b51780418e Mon Sep 17 00:00:00 2001 From: Baptiste Bauvin <baptiste.bauvin.1@ulaval.ca> Date: Thu, 25 Jan 2018 18:15:32 +0100 Subject: [PATCH] Added model inspection for FSCMLF and tried to homogenize ouptulfile names --- .../Monoview/ExecClassifMonoView.py | 6 ++-- .../Multiview/ExecMultiview.py | 8 ++--- .../Multiview/analyzeResults.py | 2 +- .../FatSCMLateFusionModule.py | 2 +- .../ResultAnalysis.py | 30 +++++++++---------- .../utils/Interpret.py | 4 +-- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Code/MonoMultiViewClassifiers/Monoview/ExecClassifMonoView.py b/Code/MonoMultiViewClassifiers/Monoview/ExecClassifMonoView.py index 67cb7396..8aa89473 100644 --- a/Code/MonoMultiViewClassifiers/Monoview/ExecClassifMonoView.py +++ b/Code/MonoMultiViewClassifiers/Monoview/ExecClassifMonoView.py @@ -125,9 +125,9 @@ def initConstants(args, X, classificationIndices, labelsNames, name, directory): learningRate = float(len(classificationIndices[0])) / (len(classificationIndices[0]) + len(classificationIndices[1])) labelsString = "-".join(labelsNames) CL_type_string = CL_type - - outputFileName = directory + CL_type_string + "/" + feat + "/" + "Results-" + CL_type_string + "-" + labelsString + \ - '-learnRate' + str(learningRate) + '-' + name + "-" + feat + "-" + timestr = time.strftime("%Y_%m_%d-%H:%M:%S") + outputFileName = directory + CL_type_string + "/" + feat + "/" + timestr + "-Results-" + CL_type_string + "-" + labelsString + \ + '-learnRate_{0:.2f}'.format(learningRate) + '-' + name + "-" + feat + "-" if not os.path.exists(os.path.dirname(outputFileName)): try: os.makedirs(os.path.dirname(outputFileName)) diff --git a/Code/MonoMultiViewClassifiers/Multiview/ExecMultiview.py b/Code/MonoMultiViewClassifiers/Multiview/ExecMultiview.py index 02bb0ec7..bf929a2f 100644 --- a/Code/MonoMultiViewClassifiers/Multiview/ExecMultiview.py +++ b/Code/MonoMultiViewClassifiers/Multiview/ExecMultiview.py @@ -40,12 +40,12 @@ def initConstants(kwargs, classificationIndices, metrics, name, nbCores, KFolds, def saveResults(LABELS_DICTIONARY, stringAnalysis, views, classifierModule, classificationKWARGS, directory, learningRate, name, imagesAnalysis): labelsSet = set(LABELS_DICTIONARY.values()) logging.info(stringAnalysis) - featureString = "-".join(views) + viewsString = "-".join(views) labelsString = "-".join(labelsSet) - timestr = time.strftime("%Y%m%d-%H%M%S") + timestr = time.strftime("%Y_%m_%d-%H:%M:%S") CL_type_string = classifierModule.genName(classificationKWARGS) - outputFileName = directory + "/" + CL_type_string + "/" + timestr + "Results-" + CL_type_string + "-" + featureString + '-' + labelsString + \ - '-learnRate' + str(learningRate) + '-' + name + outputFileName = directory + "/" + CL_type_string + "/" + timestr + "-Results-" + CL_type_string + "-" + viewsString + '-' + labelsString + \ + '-learnRate_{0:.2f}'.format(learningRate) + '-' + name if not os.path.exists(os.path.dirname(outputFileName)): try: os.makedirs(os.path.dirname(outputFileName)) diff --git a/Code/MonoMultiViewClassifiers/Multiview/analyzeResults.py b/Code/MonoMultiViewClassifiers/Multiview/analyzeResults.py index 48c91ff5..887e6da3 100644 --- a/Code/MonoMultiViewClassifiers/Multiview/analyzeResults.py +++ b/Code/MonoMultiViewClassifiers/Multiview/analyzeResults.py @@ -77,6 +77,6 @@ def execute(classifier, trainLabels, metricsScores = getMetricsScores(metrics, trainLabels, testLabels, validationIndices, learningIndices, labels) stringAnalysis += printMetricScore(metricsScores, metrics) - stringAnalysis += "\n\n" + classifier.getSpecificAnalysis(classificationKWARGS) + stringAnalysis += "\n\n Interpretation : \n\n" + classifier.getSpecificAnalysis(classificationKWARGS) imagesAnalysis = {} return stringAnalysis, imagesAnalysis, metricsScores \ No newline at end of file diff --git a/Code/MonoMultiViewClassifiers/MultiviewClassifiers/FatSCMLateFusion/FatSCMLateFusionModule.py b/Code/MonoMultiViewClassifiers/MultiviewClassifiers/FatSCMLateFusion/FatSCMLateFusionModule.py index 6037b54b..8bdf0060 100644 --- a/Code/MonoMultiViewClassifiers/MultiviewClassifiers/FatSCMLateFusion/FatSCMLateFusionModule.py +++ b/Code/MonoMultiViewClassifiers/MultiviewClassifiers/FatSCMLateFusion/FatSCMLateFusionModule.py @@ -87,7 +87,7 @@ class FatSCMLateFusionClass: return "p : "+str(self.p)+", max_aributes : "+str(self.max_attributes)+", model : "+self.model def getSpecificAnalysis(self, classificationKWARGS): - stringAnalysis = '' + stringAnalysis = 'Rules used : ' + str(self.SCMClassifier.clf.model_) return stringAnalysis diff --git a/Code/MonoMultiViewClassifiers/ResultAnalysis.py b/Code/MonoMultiViewClassifiers/ResultAnalysis.py index 45d935f9..30cbe643 100644 --- a/Code/MonoMultiViewClassifiers/ResultAnalysis.py +++ b/Code/MonoMultiViewClassifiers/ResultAnalysis.py @@ -126,7 +126,7 @@ def publishMetricsGraphs(metricsScores, directory, databaseName, labelsNames): testScores = metricScores["testScores"] names = metricScores["classifiersNames"] nbResults = len(testScores) - fileName = directory + databaseName +"-"+"vs".join(labelsNames)+ "-" + metricName + ".png" + fileName = directory + time.strftime("%Y%m%d-%H%M%S") + databaseName +"-"+"_vs_".join(labelsNames)+ "-" + metricName + ".png" plotMetricOneIter(trainScores, testScores, names, nbResults, metricName, fileName) logging.debug("Done:\t Biclass score graph generation for " + metricName) @@ -167,20 +167,20 @@ def publishExampleErrors(exampleErrors, directory, databaseName, labelsNames, mi borderaxespad=0, ncol=3) fig.tight_layout() - fig.savefig(directory + databaseName +"-"+"vs".join(labelsNames)+ "-error_analysis.png", bbox_inches="tight") + fig.savefig(directory + time.strftime("%Y%m%d-%H%M%S") + databaseName +"-"+"_vs_".join(labelsNames)+ "-error_analysis.png", bbox_inches="tight") plt.close() logging.debug("Done:\t Biclass Label analysis figure generation") logging.debug("Start:\t Biclass Error by example figure generation") errorOnExamples = -1*np.sum(data, axis=1)/nbIter+nbClassifiers - np.savetxt(directory + "-clf_errors_doubled.csv", data, delimiter=",") - np.savetxt(directory + "-example_errors.csv", temp_data, delimiter=",") + np.savetxt(directory + "clf_errors_doubled.csv", data, delimiter=",") + np.savetxt(directory + "example_errors.csv", temp_data, delimiter=",") fig, ax = plt.subplots() x = np.arange(nbExamples) plt.bar(x, errorOnExamples) plt.ylim([0,nbClassifiers]) plt.title("Number of classifiers that failed to classify each example") - fig.savefig(directory + databaseName +"-"+"vs".join(labelsNames)+ "-example_errors.png") + fig.savefig(directory + time.strftime("%Y%m%d-%H%M%S") + databaseName +"-"+"_vs_".join(labelsNames)+ "-example_errors.png") plt.close() logging.debug("Done:\t Biclass Error by example figure generation") @@ -326,20 +326,20 @@ def publishMulticlassExmapleErrors(multiclassResults, directories, databaseName, green_patch = mpatches.Patch(color='green', label='Classifier succeded') plt.legend(handles=[red_patch, green_patch], bbox_to_anchor=(0,1.02,1,0.2), loc="lower left",mode="expand", borderaxespad=0, ncol=2) fig.tight_layout() - fig.savefig(directory + time.strftime("%Y%m%d-%H%M%S") + "-" + databaseName +"-error_analysis.png", bbox_inches="tight") + fig.savefig(directory + time.strftime("%Y_%m_%d-%H:%M:%S") + "-" + databaseName +"-error_analysis.png", bbox_inches="tight") plt.close() logging.debug("Done:\t Label analysis figure generation") logging.debug("Start:\t Error by example figure generation") errorOnExamples = -1*np.sum(data, axis=1)/nbIter+nbClassifiers - np.savetxt(directory + time.strftime("%Y%m%d-%H%M%S") + "-clf_errors_doubled.csv", data, delimiter=",") - np.savetxt(directory + time.strftime("%Y%m%d-%H%M%S") + "-example_errors.csv", temp_data, delimiter=",") + np.savetxt(directory + time.strftime("%Y_%m_%d-%H:%M:%S") + "-clf_errors_doubled.csv", data, delimiter=",") + np.savetxt(directory + time.strftime("%Y_%m_%d-%H:%M:%S") + "-example_errors.csv", temp_data, delimiter=",") fig, ax = plt.subplots() x = np.arange(nbExamples) plt.bar(x, errorOnExamples) plt.ylim([0,nbClassifiers]) plt.title("Number of classifiers that failed to classify each example") - fig.savefig(directory + time.strftime("%Y%m%d-%H%M%S") + "-" + databaseName +"-example_errors.png") + fig.savefig(directory + time.strftime("%Y_%m_%d-%H:%M:%S") + "-" + databaseName +"-example_errors.png") plt.close() logging.debug("Done:\t Error by example figure generation") @@ -451,7 +451,7 @@ def publishIterBiclassMetricsScores(iterResults, directory, labelsDictionary, cl ax.set_xticks(np.arange(nbResults) + barWidth) ax.set_xticklabels(names, rotation="vertical") f.tight_layout() - f.savefig(currentDirectory + time.strftime("%Y%m%d-%H%M%S") + "-" + dataBaseName + "-Mean_on_" + f.savefig(currentDirectory + time.strftime("%Y_%m_%d-%H:%M:%S") + "-" + dataBaseName + "-Mean_on_" + str(statsIter) + "_iter-" + metricName + ".png") plt.close() @@ -491,7 +491,7 @@ def publishIterBiclassExampleErrors(iterResults, directory, labelsDictionary, cl cbar = fig.colorbar(cax, ticks=[-100*statsIter/2, 0, statsIter]) cbar.ax.set_yticklabels(['Unseen', 'Always Wrong', 'Always Right']) fig.tight_layout() - fig.savefig(currentDirectory + time.strftime("%Y%m%d-%H%M%S") + "-error_analysis.png") + fig.savefig(currentDirectory + time.strftime("%Y_%m_%d-%H:%M:%S") + "-error_analysis.png") plt.close() logging.debug("Done:\t Global label analysis figure generation") @@ -542,7 +542,7 @@ def publishIterMulticlassMetricsScores(iterMulticlassResults, classifiersNames, ax.set_xticks(np.arange(nbResults) + barWidth) ax.set_xticklabels(names, rotation="vertical") f.tight_layout() - f.savefig(directory + time.strftime("%Y%m%d-%H%M%S") + "-" + dataBaseName + "-Mean_on_" + f.savefig(directory + time.strftime("%Y_%m_%d-%H:%M:%S") + "-" + dataBaseName + "-Mean_on_" + str(statsIter) + "_iter-" + metricName + ".png") plt.close() @@ -570,14 +570,14 @@ def publishIterMulticlassExampleErrors(iterMulticlassResults, directory, classif logging.debug("Start:\t Global error by example figure generation") errorOnExamples = -1 * np.sum(data, axis=1) + (nbClassifiers*statsIter) - np.savetxt(directory + time.strftime("%Y%m%d-%H%M%S") + "-clf_errors.csv", data, delimiter=",") - np.savetxt(directory + time.strftime("%Y%m%d-%H%M%S") + "-example_errors.csv", errorOnExamples, delimiter=",") + np.savetxt(directory + time.strftime("%Y_%m_%d-%H:%M:%S") + "-clf_errors.csv", data, delimiter=",") + np.savetxt(directory + time.strftime("%Y_%m_%d-%H:%M:%S") + "-example_errors.csv", errorOnExamples, delimiter=",") fig, ax = plt.subplots() x = np.arange(nbExamples) plt.bar(x, errorOnExamples) plt.ylim([0,nbClassifiers*statsIter]) plt.title("Number of classifiers that failed to classify each example") - fig.savefig(directory + time.strftime("%Y%m%d-%H%M%S") + "-example_errors.png") + fig.savefig(directory + time.strftime("%Y_%m_%d-%H:%M:%S") + "-example_errors.png") plt.close() logging.debug("Done:\t Global error by example figure generation") diff --git a/Code/MonoMultiViewClassifiers/utils/Interpret.py b/Code/MonoMultiViewClassifiers/utils/Interpret.py index 03bf3c7d..dc816ac3 100644 --- a/Code/MonoMultiViewClassifiers/utils/Interpret.py +++ b/Code/MonoMultiViewClassifiers/utils/Interpret.py @@ -21,12 +21,12 @@ def getFeatureImportance(classifier, directory, interpretString=""): ax.yaxis.set_major_formatter(formatter) plt.bar(x, featureImportancesSorted) plt.title("Importance depending on feature") - fig.savefig(directory + "-feature_importances.png") + fig.savefig(directory + "feature_importances.png") plt.close() featuresImportancesDict = dict((featureIndex, featureImportance) for featureIndex, featureImportance in enumerate(featureImportances) if featureImportance != 0) - with open(directory+'-feature_importances.pickle', 'wb') as handle: + with open(directory+'feature_importances.pickle', 'wb') as handle: pickle.dump(featuresImportancesDict, handle) interpretString += "Feature importances : \n" for featureIndex, featureImportance in zip(featureIndicesSorted, featureImportancesSorted): -- GitLab