diff --git a/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/CQBoostUtils.py b/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/CQBoostUtils.py index 16821bd75237ab3800b858465719732354f3f431..154ead82d19802171f4ee6dfe752e92afe382219 100644 --- a/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/CQBoostUtils.py +++ b/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/CQBoostUtils.py @@ -14,7 +14,7 @@ from ... import Metrics class ColumnGenerationClassifier(BaseEstimator, ClassifierMixin, BaseBoost): - def __init__(self, mu=0.01, epsilon=1e-06, n_max_iterations=None, estimators_generator=None, dual_constraint_rhs=0, save_iteration_as_hyperparameter_each=None, random_state=None): + def __init__(self, mu=0.01, epsilon=1e-06, n_max_iterations=100, estimators_generator=None, dual_constraint_rhs=0, save_iteration_as_hyperparameter_each=None, random_state=None): super(ColumnGenerationClassifier, self).__init__() self.epsilon = epsilon self.n_max_iterations = n_max_iterations @@ -36,6 +36,7 @@ class ColumnGenerationClassifier(BaseEstimator, ClassifierMixin, BaseBoost): self.estimators_generator.fit(X, y) self.classification_matrix = self._binary_classification_matrix(X) + self.c_bounds = [] self.infos_per_iteration_ = defaultdict(list) @@ -76,6 +77,8 @@ class ColumnGenerationClassifier(BaseEstimator, ClassifierMixin, BaseBoost): # Solve restricted master for new costs. w, alpha = self._restricted_master_problem(previous_w=w, previous_alpha=alpha) + cbound = self.compute_empiric_cbound(w, y_kernel_matrix) + self.c_bounds.append(cbound) self.update_values(h_values, worst_h_index, alpha, w) @@ -113,6 +116,11 @@ class ColumnGenerationClassifier(BaseEstimator, ClassifierMixin, BaseBoost): self.step_predict(classification_matrix) return signs_array + def compute_empiric_cbound(self, w, y_kernel_matrix): + cbound = 1 - (1.0/self.n_total_examples) * (np.sum(np.average(y_kernel_matrix[:, self.chosen_columns_], axis=1, weights=w))**2/ + np.sum(np.average(y_kernel_matrix[:, self.chosen_columns_], axis=1, weights=w)**2)) + return cbound + def step_predict(self, classification_matrix): if classification_matrix.shape != self.train_shape: self.step_decisions = np.zeros(classification_matrix.shape) diff --git a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoost.py b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoost.py index 19297fc3c506a6915b61820fa54c29861de1e246..0ecdd66618095e0054e943e292d89e632a0aafa7 100644 --- a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoost.py +++ b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/CQBoost.py @@ -39,6 +39,8 @@ class CQBoost(ColumnGenerationClassifier, BaseMonoviewClassifier): def getInterpret(self, directory, y_test): np.savetxt(directory + "train_metrics.csv", self.train_metrics, delimiter=',') + np.savetxt(directory + "c_bounds.csv", self.c_bounds, + delimiter=',') np.savetxt(directory + "y_test_step.csv", self.step_decisions, delimiter=',') step_metrics = [] diff --git a/multiview_platform/MonoMultiViewClassifiers/utils/execution.py b/multiview_platform/MonoMultiViewClassifiers/utils/execution.py index 9f3b4939ab91755b4909ddda6b47fd31f1806eb9..c16c4e26a36fd1cbf46bea8cdfe4f031ca9fc037 100644 --- a/multiview_platform/MonoMultiViewClassifiers/utils/execution.py +++ b/multiview_platform/MonoMultiViewClassifiers/utils/execution.py @@ -161,10 +161,10 @@ def parseTheArgs(arguments): help='Set the mu parameter for CQBoost', default=0.001) groupCQBoost.add_argument('--CQB_epsilon', metavar='FLOAT', type=float, action='store', help='Set the epsilon parameter for CQBoost', default=1e-08) - groupCQBoost.add_argument('--CQB_stump', metavar='INT', type=int, + groupCQBoost.add_argument('--CQB_stumps', metavar='INT', type=int, action='store', help='Set the number of stumps for CQBoost', - default=10) + default=1) groupCQBoostv2 = parser.add_argument_group('CQBoostv2 arguments') groupCQBoostv2.add_argument('--CQB2_mu', metavar='FLOAT', type=float, action='store', @@ -186,7 +186,7 @@ def parseTheArgs(arguments): groupCGreed = parser.add_argument_group('CGreed arguments') groupCGreed.add_argument('--CGR_stumps', metavar='INT', type=int, action='store', - help='Set the n_stumps_per_attribute parameter for CGreed', default=10) + help='Set the n_stumps_per_attribute parameter for CGreed', default=1) groupCGreed.add_argument('--CGR_n_iter', metavar='INT', type=int, action='store', help='Set the n_max_iterations parameter for CGreed', default=100) @@ -194,7 +194,7 @@ def parseTheArgs(arguments): groupCGDesc.add_argument('--CGD_stumps', metavar='INT', type=int, action='store', help='Set the n_stumps_per_attribute parameter for CGreed', - default=10) + default=1) groupCGDesc.add_argument('--CGD_n_iter', metavar='INT', type=int, action='store', help='Set the n_max_iterations parameter for CGreed',