diff --git a/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/QarBoostUtils.py b/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/QarBoostUtils.py index 7e51a32f9ba08eaf1b993c148e9f1257b583a415..a57f145e4e2de27c8f60252029b649a6683e1742 100644 --- a/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/QarBoostUtils.py +++ b/multiview_platform/MonoMultiViewClassifiers/Monoview/Additions/QarBoostUtils.py @@ -187,6 +187,7 @@ class ColumnGenerationClassifierQar(BaseEstimator, ClassifierMixin, BaseBoost): """Is used at each iteration to compute and store all the needed quantities for later analysis""" self.example_weights_.append(self.example_weights) self.tau.append(np.sum(np.multiply(self.previous_vote, self.new_voter))/float(self.n_total_examples)) + print(np.sum(np.multiply(self.previous_vote, self.new_voter))/float(self.n_total_examples)) self.previous_vote += self.q * self.new_voter self.norm.append(np.linalg.norm(self.previous_vote)**2) self.previous_votes.append(self.previous_vote) diff --git a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/MinCQ.py b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/MinCQ.py index ed018d5d73b1a247c264ff6ed311989b5c67decf..b7dcd3cfcc56b6d9c64febbba1dbc7dfb56e3498 100644 --- a/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/MinCQ.py +++ b/multiview_platform/MonoMultiViewClassifiers/MonoviewClassifiers/MinCQ.py @@ -75,13 +75,16 @@ class MinCqLearner(BaseEstimator, ClassifierMixin): X : ndarray, shape=(n_samples, n_features) Training data - y : ndarray, shape=(n_samples,), optional + y_reworked : ndarray, shape=(n_samples,), optional Training labels voters : shape=(n_voters,), optional A priori generated voters """ # Preparation of the majority vote, using a voter generator that depends on class attributes + if (np.unique(y)!= [-1,1]).any(): + y_reworked = np.copy(y) + y_reworked[np.where(y_reworked==0)] = -1 assert self.voters_type in ['stumps', 'kernel', 'manual'], "MinCqLearner: voters_type must be 'stumps', 'kernel' or 'manual'" @@ -111,7 +114,7 @@ class MinCqLearner(BaseEstimator, ClassifierMixin): elif self.kernel == 'rbf': voters_generator = KernelVotersGenerator(rbf_kernel, gamma=gamma) - voters = voters_generator.generate(X, y) + voters = voters_generator.generate(X, y_reworked) if self.log: logging.info("MinCq training started...") @@ -125,7 +128,7 @@ class MinCqLearner(BaseEstimator, ClassifierMixin): if self.log: logging.info("Preparing QP...") - self._prepare_qp(X, y) + self._prepare_qp(X, y_reworked) try: if self.log: @@ -136,15 +139,16 @@ class MinCqLearner(BaseEstimator, ClassifierMixin): # See Section 7.1 of [2] for an explanation. self.majority_vote.weights = np.array([2 * q - 1.0 / n_base_voters for q in solver_weights]) if self.log: - logging.info("First moment of the margin on the training set: {:.4f}".format(np.mean(y * self.majority_vote.margin(X)))) + logging.info("First moment of the margin on the training set: {:.4f}".format(np.mean(y_reworked * self.majority_vote.margin(X)))) except Exception as e: logging.error("{}: Error while solving the quadratic program: {}.".format(str(self), str(e))) self.majority_vote = None + self.cbound_train = self.majority_vote.cbound_value(X, y_reworked) return self - def predict(self, X): + def predict(self, X, save_data=True): """ Using previously learned majority vote weights, predict the labels of new data points. Parameters @@ -162,8 +166,12 @@ class MinCqLearner(BaseEstimator, ClassifierMixin): if self.majority_vote is None: logging.error("{}: Error while predicting: MinCq has not been fit or fitting has failed. Will output invalid labels".format(str(self))) return np.zeros((len(X),)) + if save_data: + self.x_test = X - return self.majority_vote.vote(X) + vote = self.majority_vote.vote(X) + vote[np.where(vote==-1)] = 0 + return vote def predict_proba(self, X): """ Using previously learned majority vote weights, predict the labels of new data points with a confidence @@ -516,38 +524,39 @@ class KernelVotersGenerator(VotersGenerator): class MinCQ(MinCqLearner, BaseMonoviewClassifier): - def __init__(self, random_state=None, **kwargs): - def __init__(self, random_state=None, mu=0.01, epsilon=1e-06, **kwargs): - super(MinCQ, self).__init__( - random_state=random_state, - mu=mu, - voters_type='stumps', - n_stumps_per_attribute = 1 - ) - self.param_names = ["mu"] - self.distribs = [CustomUniform(loc=0.5, state=1.0, multiplier="e-"), - ] - self.classed_params = [] - self.weird_strings = {} - if "nbCores" not in kwargs: - self.nbCores = 1 - else: - self.nbCores = kwargs["nbCores"] + def __init__(self, random_state=None, mu=0.01, epsilon=1e-06, **kwargs): + super(MinCQ, self).__init__(mu=mu, + voters_type='stumps', + n_stumps_per_attribute = 10 + ) + self.param_names = ["mu"] + self.distribs = [CustomUniform(loc=0.5, state=1.0, multiplier="e-"), + ] + self.classed_params = [] + self.weird_strings = {} + if "nbCores" not in kwargs: + self.nbCores = 1 + else: + self.nbCores = kwargs["nbCores"] def canProbas(self): """Used to know if the classifier can return label probabilities""" return True def getInterpret(self, directory, y_test): - return getInterpretBase(directory, y_test, "MinCq", self.majority_vote.weights) + interpret_string = "Train C_bound value : "+str(self.cbound_train) + y_rework = np.copy(y_test) + y_rework[np.where(y_rework==0)] = -1 + interpret_string += "\n Test c_bound value : "+str(self.majority_vote.cbound_value(self.x_test, y_rework)) + return interpret_string def get_name_for_fusion(self): - return "QBN2" + return "MCQ" def formatCmdArgs(args): """Used to format kwargs for the parsed args""" - kwargsDict = {} + kwargsDict = {"mu":args.MCQ_mu,} return kwargsDict diff --git a/multiview_platform/MonoMultiViewClassifiers/utils/execution.py b/multiview_platform/MonoMultiViewClassifiers/utils/execution.py index 0bd1241e9bcd13b5d687b7222f67610e40309dfd..a22ccb90881fd1b9ba7065df008507648e3e1399 100644 --- a/multiview_platform/MonoMultiViewClassifiers/utils/execution.py +++ b/multiview_platform/MonoMultiViewClassifiers/utils/execution.py @@ -202,6 +202,13 @@ def parseTheArgs(arguments): help='Set the n_estimators_parameter for Gradient Boosting', default=100) + groupMinCQ = parser.add_argument_group( + 'MinCQ arguments') + groupMinCQ.add_argument('--MCQ_mu', metavar='float', type=int, + action='store', + help='Set the mu_parameter for MinCQ', + default=1e-3) + groupQarBoostv3 = parser.add_argument_group('QarBoostv3 arguments') groupQarBoostv3.add_argument('--QarB3_mu', metavar='FLOAT', type=float, action='store', help='Set the mu parameter for QarBoostv3', default=0.001)