diff --git a/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/BoostUtils.py b/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/BoostUtils.py index f5191941440f620e4f3665bf996f0d6378e1b4c0..3f1e4c4e868988693b2c5199f5e1e1716a6ee7b6 100644 --- a/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/BoostUtils.py +++ b/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/BoostUtils.py @@ -696,7 +696,7 @@ def get_accuracy_graph(train_accuracies, classifier_name, file_name, name="Accur class BaseBoost(object): def __init__(self): - self.n_stumps = 1 + self.n_stumps_per_attribute = 1 def _collect_probas(self, X): return np.asarray([clf.predict_proba(X) for clf in self.estimators_generator.estimators_]) diff --git a/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/CQBoostUtils.py b/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/CQBoostUtils.py index c7ebf500968c67104e7f1e4594a26352c6286e46..f5ba4681e3b27c3ed730cf5f14e408ed2813d547 100644 --- a/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/CQBoostUtils.py +++ b/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/CQBoostUtils.py @@ -32,7 +32,7 @@ class ColumnGenerationClassifier(BaseEstimator, ClassifierMixin, BaseBoost): y[y == 0] = -1 if self.estimators_generator is None: - self.estimators_generator = StumpsClassifiersGenerator(n_stumps_per_attribute=self.n_stumps, self_complemented=True) + self.estimators_generator = StumpsClassifiersGenerator(n_stumps_per_attribute=self.n_stumps_per_attribute, self_complemented=True) self.estimators_generator.fit(X, y) self.classification_matrix = self._binary_classification_matrix(X) diff --git a/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/QarBoostUtils.py b/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/QarBoostUtils.py index 5fdb396fd98608cc0464e661b3f188cc441b02f9..f684a51804deddd1f848aab7c5253d1486963bfe 100644 --- a/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/QarBoostUtils.py +++ b/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/QarBoostUtils.py @@ -6,7 +6,6 @@ from collections import defaultdict import math from sklearn.utils.validation import check_is_fitted from sklearn.base import BaseEstimator, ClassifierMixin -from sklearn.metrics import accuracy_score import time import matplotlib.pyplot as plt @@ -15,19 +14,18 @@ from ... import Metrics class ColumnGenerationClassifierQar(BaseEstimator, ClassifierMixin, BaseBoost): - def __init__(self, n_max_iterations=350, estimators_generator=None, dual_constraint_rhs=0, + def __init__(self, n_max_iterations=350, estimators_generator=None, random_state=42, self_complemented=True, twice_the_same=False, old_fashioned=False, previous_vote_weighted=True, c_bound_choice = True, random_start = True, - two_wieghts_problem=False, divided_ponderation=True, n_stumps_per_attribute=None): + two_wieghts_problem=False, divided_ponderation=True, n_stumps_per_attribute=None, use_r=True, plotted_metric=Metrics.zero_one_loss): super(ColumnGenerationClassifierQar, self).__init__() self.n_max_iterations = n_max_iterations self.estimators_generator = estimators_generator - self.dual_constraint_rhs = dual_constraint_rhs if type(random_state) is int: self.random_state = np.random.RandomState(random_state) else: self.random_state = random_state - self.self_complemented =self_complemented + self.self_complemented = self_complemented self.twice_the_same = twice_the_same self.train_time = 0 self.old_fashioned = old_fashioned @@ -36,13 +34,13 @@ class ColumnGenerationClassifierQar(BaseEstimator, ClassifierMixin, BaseBoost): self.random_start = random_start self.two_wieghts_problem = two_wieghts_problem self.divided_ponderation = divided_ponderation - self.plotted_metric = Metrics.zero_one_loss + self.plotted_metric = plotted_metric if n_stumps_per_attribute: - self.n_stumps = n_stumps_per_attribute - + self.n_stumps_per_attribute = n_stumps_per_attribute + self.use_r = use_r self.printed_args_name_list = ["n_max_iterations", "self_complemented", "twice_the_same", "old_fashioned", "previous_vote_weighted", "c_bound_choice", "random_start", - "two_wieghts_problem", "divided_ponderation", "n_stumps"] + "two_wieghts_problem", "divided_ponderation", "n_stumps", "use_r"] def set_params(self, **params): self.self_complemented = params["self_complemented"] @@ -60,7 +58,7 @@ class ColumnGenerationClassifierQar(BaseEstimator, ClassifierMixin, BaseBoost): X = np.array(X.todense()) if self.estimators_generator is None: - self.estimators_generator = StumpsClassifiersGenerator(n_stumps_per_attribute=self.n_stumps, + self.estimators_generator = StumpsClassifiersGenerator(n_stumps_per_attribute=self.n_stumps_per_attribute, self_complemented=self.self_complemented) # Initialization y[y == 0] = -1 @@ -93,7 +91,7 @@ class ColumnGenerationClassifierQar(BaseEstimator, ClassifierMixin, BaseBoost): self.n_total_hypotheses_ = n self.n_total_examples = m - self.n_max_iterations = 100 + self.n_max_iterations = n self.break_cause = " the maximum number of iterations was attained." for k in range(min(n, self.n_max_iterations if self.n_max_iterations is not None else np.inf)): @@ -134,14 +132,24 @@ class ColumnGenerationClassifierQar(BaseEstimator, ClassifierMixin, BaseBoost): # Generate the new weight for the new voter epsilon = self._compute_epsilon(y) self.epsilons.append(epsilon) + + r = self._compute_r(y) + if epsilon == 0. or math.log((1 - epsilon) / epsilon) == math.inf: self.chosen_columns_.pop() self.break_cause = " epsilon was too small." break + if self.divided_ponderation: - self.q = (1/(self.n_max_iterations-k))*math.log((1 - epsilon) / epsilon) + if self.use_r: + self.q = (1 / (self.n_max_iterations - k)) * 0.5*math.log((1+r)/(1-r)) + else: + self.q = (1/(self.n_max_iterations-k))*math.log((1 - epsilon) / epsilon) else: - self.q = math.log((1 - epsilon) / epsilon) + if self.use_r: + self.q = 0.5*math.log((1+r)/(1-r)) + else: + self.q = math.log((1 - epsilon) / epsilon) self.weights_.append(self.q) # Update the distribution on the examples. @@ -156,7 +164,7 @@ class ColumnGenerationClassifierQar(BaseEstimator, ClassifierMixin, BaseBoost): self.previous_margins.append(np.multiply(y, self.previous_vote)) self.train_metrics.append(self.plotted_metric.score(y, np.sign(self.previous_vote))) # self.bounds.append(np.prod(np.sqrt(1-4*np.square(0.5-np.array(self.epsilons))))) - r = self._compute_r(y) + if k!=0: self.bounds.append(self.bounds[-1]*math.sqrt(1-r**2)) else: @@ -322,7 +330,7 @@ class ColumnGenerationClassifierQar(BaseEstimator, ClassifierMixin, BaseBoost): if C1 == 0: return ['break', "the derivate was constant"] else : - is_acceptable, sol = self._analyze_solutions_one_weight(np.array(float(C0)/C1)) + is_acceptable, sol = self._analyze_solutions_one_weight(np.array(float(C0)/C1).reshape((1,1))) if is_acceptable: return np.array([sol]) try: diff --git a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoostv21.py b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoostv21.py index 9274d9dc11ecaff6c5d107c20f305176650626f7..f5b0ba94ef828e6dc505dd4ab09eb4f86a5b80ae 100644 --- a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoostv21.py +++ b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoostv21.py @@ -28,7 +28,7 @@ class ColumnGenerationClassifierv21(BaseEstimator, ClassifierMixin, BaseBoost): X = np.array(X.todense()) if self.estimators_generator is None: - self.estimators_generator = StumpsClassifiersGenerator(n_stumps_per_attribute=self.n_stumps, self_complemented=True) + self.estimators_generator = StumpsClassifiersGenerator(n_stumps_per_attribute=self.n_stumps_per_attribute, self_complemented=True) y[y == 0] = -1 diff --git a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostNC.py b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostNC.py index 34dc7bb0ff662f5badadbd7367d6f6c939a4818f..0279ac4ac9080013e76dcb6842a9559e84487ca9 100644 --- a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostNC.py +++ b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostNC.py @@ -3,7 +3,6 @@ from ..Monoview.Additions.BoostUtils import getInterpretBase from ..Monoview.Additions.QarBoostUtils import ColumnGenerationClassifierQar - class QarBoostNC(ColumnGenerationClassifierQar, BaseMonoviewClassifier): def __init__(self, random_state=None, **kwargs): @@ -13,11 +12,12 @@ class QarBoostNC(ColumnGenerationClassifierQar, BaseMonoviewClassifier): twice_the_same=False, old_fashioned=False, previous_vote_weighted=False, - c_bound_choice=False, - random_start=True, - two_wieghts_problem=True, + c_bound_choice=True, + random_start=False, + two_wieghts_problem=False, divided_ponderation=False, - n_stumps_per_attribute=100 + n_stumps_per_attribute=1, + use_r=True ) self.param_names = [] self.distribs = [] diff --git a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostNC2.py b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostNC2.py index dac1ca07d01ea532b201f753e496072a80be5b06..2739affea598beee878ca939fc8d7393172d1047 100644 --- a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostNC2.py +++ b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostNC2.py @@ -8,14 +8,16 @@ class QarBoostNC2(ColumnGenerationClassifierQar, BaseMonoviewClassifier): def __init__(self, random_state=None, **kwargs): super(QarBoostNC2, self).__init__( random_state=random_state, - self_complemented=False, + self_complemented=True, twice_the_same=False, old_fashioned=False, previous_vote_weighted=False, c_bound_choice=True, random_start=True, two_wieghts_problem=False, - divided_ponderation=True + divided_ponderation=False, + n_stumps_per_attribute=10, + use_r=True ) self.param_names = [] self.distribs = [] diff --git a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostNC3.py b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostNC3.py index dbafa810e61f52c47c0ae9e2c2e592b770e00289..7cb49df54f584f395117f33368386c7e401887ca 100644 --- a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostNC3.py +++ b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostNC3.py @@ -15,8 +15,9 @@ class QarBoostNC3(ColumnGenerationClassifierQar, BaseMonoviewClassifier): c_bound_choice=True, random_start=True, two_wieghts_problem=False, - divided_ponderation=False, - n_stumps_per_attribute=10 + divided_ponderation=True, + n_stumps_per_attribute=1, + use_r=True ) self.param_names = [] self.distribs = [] @@ -31,7 +32,7 @@ class QarBoostNC3(ColumnGenerationClassifierQar, BaseMonoviewClassifier): return self.getInterpretQar(directory) def get_name_for_fusion(self): - return "QBN2" + return "QBN3" def formatCmdArgs(args): diff --git a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostv2.py b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostv2.py index e72688f6c8f7ec97363792631d283e14a2cd42e9..7fb2239a9f8fc71c09d1ac70604adf73c5cc702c 100644 --- a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostv2.py +++ b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostv2.py @@ -8,15 +8,16 @@ class QarBoostv2(ColumnGenerationClassifierQar, BaseMonoviewClassifier): def __init__(self, random_state=None, **kwargs): super(QarBoostv2, self).__init__( random_state=random_state, - self_complemented=True, + self_complemented=False, twice_the_same=False, old_fashioned=False, previous_vote_weighted=False, c_bound_choice=True, - random_start=True, + random_start=False, two_wieghts_problem=False, divided_ponderation=False, - n_stumps_per_attribute=10 + n_stumps_per_attribute=1, + use_r=True ) self.param_names = [] self.distribs = [] @@ -28,7 +29,7 @@ class QarBoostv2(ColumnGenerationClassifierQar, BaseMonoviewClassifier): return True def getInterpret(self, directory): - return getInterpretBase(self, directory, "QarBoostv2", self.weights_, self.break_cause) + return self.getInterpretQar(directory) def get_name_for_fusion(self): return "QBv2" diff --git a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostv3.py b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostv3.py index 7b63ea7597fb8117f901281aaba0415468b18c7e..aca342a5ed3fd6483581a1eb86df97e1cea3ad9c 100644 --- a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostv3.py +++ b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/QarBoostv3.py @@ -8,15 +8,16 @@ class QarBoostv3(ColumnGenerationClassifierQar, BaseMonoviewClassifier): def __init__(self, random_state=None, **kwargs): super(QarBoostv3, self).__init__( random_state=random_state, - self_complemented=True, + self_complemented=False, twice_the_same=False, old_fashioned=False, previous_vote_weighted=False, c_bound_choice=True, random_start=True, two_wieghts_problem=False, - divided_ponderation=False, - n_stumps_per_attribute=1 + divided_ponderation=True, + n_stumps_per_attribute=1, + use_r=False ) self.param_names = [] self.distribs = [] @@ -28,7 +29,7 @@ class QarBoostv3(ColumnGenerationClassifierQar, BaseMonoviewClassifier): return True def getInterpret(self, directory): - return getInterpretBase(self, directory, "QarBoostv3", self.weights_, self.break_cause) + return self.getInterpretQar(directory) def get_name_for_fusion(self): return "QBv3"