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