From 8e061d1a002486018c95324a4f341dd580b0b47e Mon Sep 17 00:00:00 2001
From: Baptiste Bauvin <baptiste.bauvin@lis-lab.fr>
Date: Wed, 8 Aug 2018 16:03:21 -0400
Subject: [PATCH] It runs with mono and mutliview on adaboost

---
 .../MonoviewClassifiers/Adaboost.py           | 19 +++----
 .../Fusion/Methods/EarlyFusion.py             | 10 +++-
 .../EarlyFusionPackage/WeightedLinear.py      | 18 ++++---
 .../Fusion/Methods/LateFusion.py              | 49 ++++++++++---------
 .../LateFusionPackage/BayesianInference.py    |  7 ++-
 .../LateFusionPackage/MajorityVoting.py       |  7 ++-
 .../Methods/LateFusionPackage/SCMForLinear.py | 15 ++----
 .../Methods/LateFusionPackage/SVMForLinear.py | 25 +++-------
 .../LateFusionPackage/WeightedLinear.py       |  7 ++-
 .../utils/execution.py                        |  2 +-
 10 files changed, 76 insertions(+), 83 deletions(-)

diff --git a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/Adaboost.py b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/Adaboost.py
index 05f6545b..6e47cd74 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/Adaboost.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/Adaboost.py
@@ -10,7 +10,7 @@ __status__ = "Prototype"  # Production, Development, Prototype
 
 class Adaboost(AdaBoostClassifier, BaseMonoviewClassifier):
 
-    def __init__(self, random_state=None, n_estimators=10,
+    def __init__(self, random_state=None, n_estimators=50,
                  base_estimator=None, **kwargs):
         super(Adaboost, self).__init__(
             random_state=random_state,
@@ -26,14 +26,6 @@ class Adaboost(AdaBoostClassifier, BaseMonoviewClassifier):
         """Used to know if the classifier can return label probabilities"""
         return True
 
-    def paramsToSrt(self, nIter=1):
-        """Used for weighted linear early fusion to generate random search sets"""
-        paramsSet = []
-        for _ in range(nIter):
-            paramsSet.append({"n_estimators": self.random_state.randint(1, 150),
-                              "base_estimator": None})
-        return paramsSet
-
     def getInterpret(self, directory):
         interpretString = ""
         interpretString += self.getFeatureImportance(directory)
@@ -45,6 +37,15 @@ def formatCmdArgs(args):
     kwargsDict = {'n_estimators': args.Ada_n_est,
                   'base_estimator': DecisionTreeClassifier()}
     return kwargsDict
+
+
+def paramsToSet(nIter, random_state):
+    """Used for weighted linear early fusion to generate random search sets"""
+    paramsSet = []
+    for _ in range(nIter):
+        paramsSet.append({"n_estimators": random_state.randint(1, 500),
+                          "base_estimator": None})
+    return paramsSet
 # def canProbas():
 #     return True
 #
diff --git a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/EarlyFusion.py b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/EarlyFusion.py
index fa282d9c..0199062d 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/EarlyFusion.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/EarlyFusion.py
@@ -3,7 +3,7 @@
 
 import numpy as np
 from ....utils.Dataset import getV
-
+from .... import MonoviewClassifiers
 
 class EarlyFusionClassifier(object):
     def __init__(self, randomState, monoviewClassifierName, monoviewClassifierConfig, NB_CORES=1):
@@ -16,8 +16,14 @@ class EarlyFusionClassifier(object):
             monoviewClassifierConfig = dict((str(configIndex), config[0]) for configIndex, config in
                                             enumerate(monoviewClassifierConfig
                                                       ))
+        monoviewClassifierModule = getattr(MonoviewClassifiers, self.monoviewClassifierName)
+        if monoviewClassifierConfig is not None:
+            self.monoviewClassifier = getattr(monoviewClassifierModule, self.monoviewClassifierName)(
+                random_state=randomState, **monoviewClassifierConfig)
+        else:
+            self.monoviewClassifier = getattr(monoviewClassifierModule, self.monoviewClassifierName)(
+                random_state=randomState)
         self.monoviewClassifiersConfig = monoviewClassifierConfig
-        self.monoviewClassifier = None
         self.nbCores = NB_CORES
         self.monoviewData = None
         self.randomState = randomState
diff --git a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/EarlyFusionPackage/WeightedLinear.py b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/EarlyFusionPackage/WeightedLinear.py
index 16fba3f0..c0dd0bfc 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/EarlyFusionPackage/WeightedLinear.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/EarlyFusionPackage/WeightedLinear.py
@@ -70,6 +70,9 @@ class WeightedLinear(EarlyFusionClassifier):
             self.weights = np.ones(len(kwargs["classifiersNames"]), dtype=float)
         else:
             self.weights = np.array(map(float, kwargs['fusionMethodConfig']))
+        self.weights /= float(max(self.weights))
+
+
 
     def fit_hdf5(self, DATASET, labels, trainIndices=None, viewsIndices=None):
         if type(viewsIndices) == type(None):
@@ -78,12 +81,11 @@ class WeightedLinear(EarlyFusionClassifier):
             trainIndices = range(DATASET.get("Metadata").attrs["datasetLength"])
         self.weights /= float(max(self.weights))
         self.makeMonoviewData_hdf5(DATASET, weights=self.weights, usedIndices=trainIndices, viewsIndices=viewsIndices)
-        monoviewClassifierModule = getattr(MonoviewClassifiers, self.monoviewClassifierName)
-        self.monoviewClassifier = monoviewClassifierModule.fit(self.monoviewData,
-                                                               labels[trainIndices],
-                                                               self.randomState,
-                                                               NB_CORES=self.nbCores,
-                                                               **self.monoviewClassifiersConfig)
+        # monoviewClassifierModule = getattr(MonoviewClassifiers, self.monoviewClassifierName)
+        self.monoviewClassifier.fit(self.monoviewData, labels[trainIndices])
+                                                               # self.randomState,
+                                                               # NB_CORES=self.nbCores,
+                                                               # **self.monoviewClassifiersConfig)
 
     def setParams(self, paramsSet):
         self.weights = paramsSet[0]
@@ -110,8 +112,8 @@ class WeightedLinear(EarlyFusionClassifier):
     def getConfig(self, fusionMethodConfig, monoviewClassifiersNames, monoviewClassifiersConfigs):
         configString = "with weighted concatenation, using weights : " + ", ".join(map(str, self.weights)) + \
                        " with monoview classifier : "
-        monoviewClassifierModule = getattr(MonoviewClassifiers, monoviewClassifiersNames)
-        configString += monoviewClassifierModule.getConfig(self.monoviewClassifiersConfig)
+        # monoviewClassifierModule = getattr(MonoviewClassifiers, monoviewClassifiersNames)
+        configString += self.monoviewClassifier.getConfig()
         return configString
 
     def gridSearch(self, classificationKWARGS):
diff --git a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusion.py b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusion.py
index 15372bf5..f3e5bdf9 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusion.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusion.py
@@ -12,30 +12,28 @@ from .... import Metrics
 from ....utils.Dataset import getV
 
 
-def canProbasClassifier(classifierConfig):
-    try:
-        _ = getattr(classifierConfig, "predict_proba")
-        return True
-    except AttributeError:
-        return False
+# def canProbasClassifier(classifierConfig):
+#     try:
+#         _ = getattr(classifierConfig, "predict_proba")
+#         return True
+#     except AttributeError:
+#         return False
 
 
-def fitMonoviewClassifier(classifierName, data, labels, classifierConfig, needProbas, randomState, nbCores=1):
-    if type(classifierConfig) == dict:
-        monoviewClassifier = getattr(MonoviewClassifiers, classifierName)
+def fitMonoviewClassifier(monoviewClassifier, data, labels, needProbas, randomState, nbCores=1):
         if needProbas and not monoviewClassifier.canProbas():
-            monoviewClassifier = getattr(MonoviewClassifiers, "DecisionTree")
             DTConfig = {"max_depth": 300, "criterion": "entropy", "splitter": "random"}
-            classifier = monoviewClassifier.fit(data, labels, randomState, nbCores, **DTConfig)
+            monoviewClassifier = getattr(MonoviewClassifiers, "DecisionTree")(random_state=randomState, **DTConfig)
+            classifier = monoviewClassifier.fit(data, labels)
             return classifier
         else:
-            if type(classifierConfig) is dict:
-                pass
-            else:
-                classifierConfig = dict((str(configIndex), config)
-                                         for configIndex, config in enumerate(classifierConfig))
+            # if type(classifierConfig) is dict:
+            #     pass
+            # else:
+            #     classifierConfig = dict((str(configIndex), config)
+            #                              for configIndex, config in enumerate(classifierConfig))
 
-            classifier = monoviewClassifier.fit(data, labels, randomState, nbCores, **classifierConfig)
+            classifier = monoviewClassifier.fit(data, labels)
             return classifier
 
 
@@ -119,11 +117,18 @@ class LateFusionClassifier(object):
     def __init__(self, randomState, monoviewClassifiersNames, monoviewClassifiersConfigs, monoviewSelection,
                  NB_CORES=1):
         self.monoviewClassifiersNames = monoviewClassifiersNames
+        monoviewClassifiersModules = [getattr(MonoviewClassifiers, classifierName)
+                                      for classifierName in self.monoviewClassifiersNames]
         if type(monoviewClassifiersConfigs[0]) == dict:
-            self.monoviewClassifiersConfigs = monoviewClassifiersConfigs
-            self.monoviewClassifiers = []
+            self.monoviewClassifiers = [
+                getattr(monoviewClassifiersModule, classifierName)(random_state=randomState, **config)
+                for monoviewClassifiersModule, config, classifierName
+                in zip(monoviewClassifiersModules, monoviewClassifiersConfigs, monoviewClassifiersNames)]
         else:
-            self.monoviewClassifiersConfigs = monoviewClassifiersConfigs
+            self.monoviewClassifiers = [
+                getattr(monoviewClassifiersModule, classifierName)(random_state=randomState,)
+                for monoviewClassifiersModule, config, classifierName
+                in zip(monoviewClassifiersModules, monoviewClassifiersConfigs, monoviewClassifiersNames)]
         self.nbCores = NB_CORES
         self.accuracies = np.zeros(len(monoviewClassifiersNames))
         self.needProbas = False
@@ -136,8 +141,8 @@ class LateFusionClassifier(object):
         if trainIndices is None:
             trainIndices = range(DATASET.get("Metadata").attrs["datasetLength"])
         self.monoviewClassifiers = Parallel(n_jobs=self.nbCores)(
-                delayed(fitMonoviewClassifier)(self.monoviewClassifiersNames[index],
+                delayed(fitMonoviewClassifier)(self.monoviewClassifiers[index],
                                                getV(DATASET, viewIndex, trainIndices),
                                                labels[trainIndices],
-                                               self.monoviewClassifiersConfigs[index], self.needProbas, self.randomState)
+                                               self.needProbas, self.randomState)
                 for index, viewIndex in enumerate(viewsIndices))
diff --git a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/BayesianInference.py b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/BayesianInference.py
index 1eade801..d825f24a 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/BayesianInference.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/BayesianInference.py
@@ -87,9 +87,8 @@ class BayesianInference(LateFusionClassifier):
     def getConfig(self, fusionMethodConfig, monoviewClassifiersNames, monoviewClassifiersConfigs):
         configString = "with Bayesian Inference using a weight for each view : " + ", ".join(map(str, self.weights)) + \
                        "\n\t-With monoview classifiers : "
-        for monoviewClassifierConfig, monoviewClassifierName in zip(monoviewClassifiersConfigs,
-                                                                    monoviewClassifiersNames):
-            monoviewClassifierModule = getattr(MonoviewClassifiers, monoviewClassifierName)
-            configString += monoviewClassifierModule.getConfig(monoviewClassifierConfig)
+        for monoviewClassifier in self.monoviewClassifiers:
+
+            configString += monoviewClassifier.getConfig()
         configString += "\n\t -Method used to select monoview classifiers : " + self.monoviewSelection
         return configString
diff --git a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/MajorityVoting.py b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/MajorityVoting.py
index 33b5c2fb..34086cc8 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/MajorityVoting.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/MajorityVoting.py
@@ -100,8 +100,7 @@ class MajorityVoting(LateFusionClassifier):
     def getConfig(self, fusionMethodConfig, monoviewClassifiersNames, monoviewClassifiersConfigs):
         configString = "with Majority Voting \n\t-With weights : " + str(
             self.weights) + "\n\t-With monoview classifiers : "
-        for monoviewClassifierConfig, monoviewClassifierName in zip(monoviewClassifiersConfigs,
-                                                                    monoviewClassifiersNames):
-            monoviewClassifierModule = getattr(MonoviewClassifiers, monoviewClassifierName)
-            configString += monoviewClassifierModule.getConfig(monoviewClassifierConfig)
+        for monoviewClassifier in self.monoviewClassifiers:
+
+            configString += monoviewClassifier.getConfig()
         return configString
diff --git a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/SCMForLinear.py b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/SCMForLinear.py
index 8e70b8f3..705c6a8f 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/SCMForLinear.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/SCMForLinear.py
@@ -119,12 +119,8 @@ class SCMForLinear(LateFusionClassifier):
         if trainIndices is None:
             trainIndices = range(DATASET.get("Metadata").attrs["datasetLength"])
         for index, viewIndex in enumerate(viewsIndices):
-            monoviewClassifier = getattr(MonoviewClassifiers, self.monoviewClassifiersNames[index])
-            self.monoviewClassifiers.append(
-                monoviewClassifier.fit(getV(DATASET, viewIndex, trainIndices),
-                                       labels[trainIndices], self.randomState,
-                                       NB_CORES=self.nbCores,
-                                       **self.monoviewClassifiersConfigs[index]))
+            self.monoviewClassifiers[index].fit(getV(DATASET, viewIndex, trainIndices),
+                                       labels[trainIndices])
         self.SCMForLinearFusionFit(DATASET, labels, usedIndices=trainIndices, viewsIndices=viewsIndices)
 
     def predict_hdf5(self, DATASET, usedIndices=None, viewsIndices=None):
@@ -184,8 +180,7 @@ class SCMForLinear(LateFusionClassifier):
         configString = "with SCM for linear with max_attributes : " + str(self.maxAttributes) + ", p : " + str(self.p) + \
                        " model_type : " + str(self.modelType) + " order : " + str(self.order)+ " has chosen " + \
                        str(0.1) + " rule(s) \n\t-With monoview classifiers : "
-        for monoviewClassifierConfig, monoviewClassifierName in zip(monoviewClassifiersConfigs,
-                                                                    monoviewClassifiersNames):
-            monoviewClassifierModule = getattr(MonoviewClassifiers, monoviewClassifierName)
-            configString += monoviewClassifierModule.getConfig(monoviewClassifierConfig)
+        for monoviewClassifier in self.monoviewClassifiers:
+
+            configString += monoviewClassifier.getConfig()
         return configString
diff --git a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/SVMForLinear.py b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/SVMForLinear.py
index ce242717..260cef57 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/SVMForLinear.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/SVMForLinear.py
@@ -62,21 +62,9 @@ class SVMForLinear(LateFusionClassifier):
             viewsIndices = np.arange(DATASET.get("Metadata").attrs["nbView"])
         if trainIndices is None:
             trainIndices = range(DATASET.get("Metadata").attrs["datasetLength"])
-        if type(self.monoviewClassifiersConfigs[0]) == dict:
-            for index, viewIndex in enumerate(viewsIndices):
-                monoviewClassifier = getattr(MonoviewClassifiers, self.monoviewClassifiersNames[index])
-                if type(self.monoviewClassifiersConfigs[index]) is dict:
-                    pass
-                else:
-                    self.monoviewClassifiersConfigs[index] = dict((str(configIndex), config)
-                                            for configIndex, config in enumerate(self.monoviewClassifiersConfigs[index]))
-                self.monoviewClassifiers.append(
-                    monoviewClassifier.fit(getV(DATASET, viewIndex, trainIndices),
-                                           labels[trainIndices], self.randomState,
-                                           NB_CORES=self.nbCores,
-                                           **self.monoviewClassifiersConfigs[index]))
-        else:
-            self.monoviewClassifiers = self.monoviewClassifiersConfigs
+        for index, viewIndex in enumerate(viewsIndices):
+            self.monoviewClassifiers[index].fit(getV(DATASET, viewIndex, trainIndices),
+                                       labels[trainIndices])
         self.SVMForLinearFusionFit(DATASET, labels, usedIndices=trainIndices, viewsIndices=viewsIndices)
 
     def setParams(self, paramsSet):
@@ -109,8 +97,7 @@ class SVMForLinear(LateFusionClassifier):
 
     def getConfig(self, fusionMethodConfig, monoviewClassifiersNames, monoviewClassifiersConfigs):
         configString = "with SVM for linear \n\t-With monoview classifiers : "
-        for monoviewClassifierConfig, monoviewClassifierName in zip(monoviewClassifiersConfigs,
-                                                                    monoviewClassifiersNames):
-            monoviewClassifierModule = getattr(MonoviewClassifiers, monoviewClassifierName)
-            configString += monoviewClassifierModule.getConfig(monoviewClassifierConfig)
+        for monoviewClassifier in self.monoviewClassifiers:
+
+            configString += monoviewClassifier.getConfig()
         return configString
diff --git a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/WeightedLinear.py b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/WeightedLinear.py
index db86de2e..ad5b2fad 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/WeightedLinear.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusionPackage/WeightedLinear.py
@@ -85,8 +85,7 @@ class WeightedLinear(LateFusionClassifier):
     def getConfig(self, fusionMethodConfig, monoviewClassifiersNames, monoviewClassifiersConfigs):
         configString = "with Weighted linear using a weight for each view : " + ", ".join(map(str, self.weights)) + \
                        "\n\t-With monoview classifiers : "
-        for monoviewClassifierConfig, monoviewClassifierName in zip(monoviewClassifiersConfigs,
-                                                                    monoviewClassifiersNames):
-            monoviewClassifierModule = getattr(MonoviewClassifiers, monoviewClassifierName)
-            configString += monoviewClassifierModule.getConfig(monoviewClassifierConfig)
+        for monoviewClassifier in self.monoviewClassifiers:
+
+            configString += monoviewClassifier.getConfig()
         return configString
diff --git a/multiview_platform/MonoMultiViewClassifiers/utils/execution.py b/multiview_platform/MonoMultiViewClassifiers/utils/execution.py
index 961091a2..9493fbee 100644
--- a/multiview_platform/MonoMultiViewClassifiers/utils/execution.py
+++ b/multiview_platform/MonoMultiViewClassifiers/utils/execution.py
@@ -61,7 +61,7 @@ def parseTheArgs(arguments):
                                  'selected', default=["yes", "no"])
     groupClass.add_argument('--CL_type', metavar='STRING', action='store', nargs="+",
                             help='Determine whether to use Multiview and/or Monoview, or Benchmark classification',
-                            default=['Benchmark'])
+                            default=['Monoview', 'Multiview'])
     groupClass.add_argument('--CL_algos_monoview', metavar='STRING', action='store', nargs="+",
                             help='Determine which monoview classifier to use if empty, considering all',
                             default=[''])
-- 
GitLab