From f62991d7ce7c3b0b8dcd866e5ff4496c5ca6df74 Mon Sep 17 00:00:00 2001
From: Baptiste Bauvin <baptiste.bauvin@lis-lab.fr>
Date: Wed, 25 Jul 2018 10:22:00 -0400
Subject: [PATCH] Modified distrib of HPs for CQB and CQBv2

---
 .../Monoview/ExecClassifMonoView.py           |  2 +-
 .../Monoview/MonoviewUtils.py                 | 24 +++++++++++++++++++
 .../MonoviewClassifiers/CQBoost.py            | 14 +++++++----
 .../MonoviewClassifiers/CQBoostv2.py          | 22 +++++++++--------
 4 files changed, 47 insertions(+), 15 deletions(-)

diff --git a/multiview_platform/MonoMultiViewClassifiers/Monoview/ExecClassifMonoView.py b/multiview_platform/MonoMultiViewClassifiers/Monoview/ExecClassifMonoView.py
index 14398878..e0d532dc 100644
--- a/multiview_platform/MonoMultiViewClassifiers/Monoview/ExecClassifMonoView.py
+++ b/multiview_platform/MonoMultiViewClassifiers/Monoview/ExecClassifMonoView.py
@@ -161,7 +161,7 @@ def getHPs(classifierModule, hyperParamSearch, nIter, CL_type, X_train, y_train,
                                       outputFileName, classifierModule,
                                       KFolds=KFolds, nbCores=nbCores,
                                       metric=metrics[0], nIter=nIter)
-        logging.debug("Done:\t " + hyperParamSearch + "RandomSearch best settings")
+        logging.debug("Done:\t " + hyperParamSearch + " best settings")
     else:
         clKWARGS = kwargs[CL_type + "KWARGS"]
     return clKWARGS, testFoldsPreds
diff --git a/multiview_platform/MonoMultiViewClassifiers/Monoview/MonoviewUtils.py b/multiview_platform/MonoMultiViewClassifiers/Monoview/MonoviewUtils.py
index dd7c33fa..30a342c3 100644
--- a/multiview_platform/MonoMultiViewClassifiers/Monoview/MonoviewUtils.py
+++ b/multiview_platform/MonoMultiViewClassifiers/Monoview/MonoviewUtils.py
@@ -1,5 +1,6 @@
 from sklearn.model_selection import RandomizedSearchCV
 import numpy as np
+from scipy.stats import uniform, randint
 
 from .. import Metrics
 from ..utils import HyperParameterSearch
@@ -50,6 +51,29 @@ def genTestFoldsPreds(X_train, y_train, KFolds, estimator):
     testFoldsPreds = np.array([testFoldPreds[:minFoldLength] for testFoldPreds in testFoldsPreds])
     return testFoldsPreds
 
+
+class CustomRandint:
+    def __init__(self, low=0, high=0, multiplier="e-"):
+        self.randint = randint(low, high)
+        self.multiplier = multiplier
+
+    def rvs(self, random_state=None):
+        randinteger = self.randint.rvs(random_state=random_state)
+        if self.multiplier == "e-":
+            return 10 ** -randinteger
+
+
+class CustomUniform:
+    def __init__(self, loc=0, state=1, multiplier="e-"):
+        self.uniform = uniform(loc, state)
+        self.multiplier = multiplier
+
+    def rvs(self, random_state=None):
+        unif = self.uniform.rvs(random_state=random_state)
+        if self.multiplier == 'e-':
+            return 10 ** -unif
+
+
 # def isUseful(labelSupports, index, CLASS_LABELS, labelDict):
 #     if labelSupports[labelDict[CLASS_LABELS[index]]] != 0:
 #         labelSupports[labelDict[CLASS_LABELS[index]]] -= 1
diff --git a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoost.py b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoost.py
index b53ab517..0d1ecb15 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoost.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoost.py
@@ -19,9 +19,11 @@ from sklearn.base import BaseEstimator, ClassifierMixin
 from sklearn.pipeline import Pipeline
 from sklearn.model_selection import RandomizedSearchCV
 from sklearn.tree import DecisionTreeClassifier
-from scipy.stats import randint
+from scipy.stats import randint, uniform
 import numpy as np
 
+from ..Monoview.MonoviewUtils import CustomUniform, CustomRandint
+
 
 
 class ColumnGenerationClassifier(BaseEstimator, ClassifierMixin):
@@ -293,6 +295,10 @@ class CQBoost(CqBoostClassifier):
         return interpretString
 
 
+
+
+
+
 def canProbas():
     return False
 
@@ -311,7 +317,7 @@ def paramsToSet(nIter, randomState):
     """Used for weighted linear early fusion to generate random search sets"""
     paramsSet = []
     for _ in range(nIter):
-        paramsSet.append({"mu": randomState.uniform(1e-02, 10**(-0.5)),
+        paramsSet.append({"mu": 10**-randomState.uniform(0.5, 1.5),
                           "epsilon": 10**-randomState.randint(1, 15),
                           "n_max_iterations": None})
     return paramsSet
@@ -331,8 +337,8 @@ def genPipeline():
 
 
 def genParamsDict(randomState):
-    return {"classifier__mu": [0.001, 0.002],
-                "classifier__epsilon": [1e-08, 2e-08],
+    return {"classifier__mu": CustomUniform(loc=.5, state=2, multiplier='e-'),
+                "classifier__epsilon": CustomRandint(low=1, high=15, multiplier='e-'),
                 "classifier__n_max_iterations": [None]}
 
 
diff --git a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoostv2.py b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoostv2.py
index 0039a4f4..839cd7c6 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoostv2.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoostv2.py
@@ -7,21 +7,23 @@ from collections import defaultdict, OrderedDict
 import pandas as pd
 import sys
 from functools import partial
-import numpy as np
-from scipy.spatial import distance
 from sklearn.base import BaseEstimator, ClassifierMixin, TransformerMixin
 from sklearn.utils.validation import check_is_fitted
 from sklearn.preprocessing import LabelEncoder
-from sklearn.tree import DecisionTreeClassifier
-from sklearn.metrics.pairwise import rbf_kernel, linear_kernel
-import numpy as np
 from sklearn.base import BaseEstimator, ClassifierMixin
 from sklearn.pipeline import Pipeline
-from sklearn.model_selection import RandomizedSearchCV
-from sklearn.tree import DecisionTreeClassifier
-from scipy.stats import randint
 import numpy as np
 
+# import numpy as np
+# from scipy.spatial import distance
+# from sklearn.tree import DecisionTreeClassifier
+# from sklearn.metrics.pairwise import rbf_kernel, linear_kernel
+# from sklearn.model_selection import RandomizedSearchCV
+# from sklearn.tree import DecisionTreeClassifier
+# from scipy.stats import randint
+
+
+from ..Monoview.MonoviewUtils import CustomRandint, CustomUniform
 
 class ColumnGenerationClassifierv2(BaseEstimator, ClassifierMixin):
     def __init__(self, epsilon=1e-06, n_max_iterations=None, estimators_generator=None, dual_constraint_rhs=0, save_iteration_as_hyperparameter_each=None):
@@ -350,8 +352,8 @@ def genPipeline():
 
 
 def genParamsDict(randomState):
-    return {"classifier__mu": [0.001, 0.002],
-                "classifier__epsilon": [1e-08, 2e-08],
+    return {"classifier__mu": CustomUniform(loc=.5, state=2, multiplier='e-'),
+                "classifier__epsilon": CustomRandint(low=1, high=15, multiplier='e-'),
                 "classifier__n_max_iterations": [None]}
 
 
-- 
GitLab