diff --git a/config_files/config.yml b/config_files/config.yml index 22a51e7214341a2df96002f19cf33d1456b68876..4baa1dae8537a94d62db23c4acb26a5dd1623c97 100644 --- a/config_files/config.yml +++ b/config_files/config.yml @@ -110,15 +110,6 @@ cb_boost: n_max_iterations: [10] n_stumps: [1] -min_cq_graalpy: - mu: [0.01] - n_stumps_per_attribute: [1] - -min_cq_graalpy_tree: - mu: [0.01] - n_stumps_per_attribute: [1] - max_depth: [2] - lasso: alpha: [1] max_iter: [2] @@ -126,10 +117,6 @@ lasso: gradient_boosting: n_estimators: [2] -min_cq: - mu: [0.01] - n_stumps_per_attribute: [1] - ###################################### # The Multiview Classifier arguments # diff --git a/multiview_platform/mono_multi_view_classifiers/monoview_classifiers/min_cq.py b/multiview_platform/mono_multi_view_classifiers/monoview_classifiers/min_cq.py deleted file mode 100644 index 21345552b14dc0c2493e3d92d88a152b46de5a80..0000000000000000000000000000000000000000 --- a/multiview_platform/mono_multi_view_classifiers/monoview_classifiers/min_cq.py +++ /dev/null @@ -1,632 +0,0 @@ -from ..monoview.monoview_utils import CustomUniform, BaseMonoviewClassifier - -#### Algorithm code #### - -# -*- coding:utf-8 -*- -""" MinCq learning algorithm - -Related papers: -[1] From PAC-Bayes Bounds to Quadratic Programs for Majority Votes (Laviolette et al., 2011) -[2] Risk Bounds for the Majority Vote: From a PAC-Bayesian Analysis to a Learning Algorithm (Germain et al., 2014) - -http://graal.ift.ulaval.ca/majorityvote/ -""" -__author__ = 'Jean-Francis Roy' -import time -import logging -from sklearn.base import BaseEstimator, ClassifierMixin -from sklearn.metrics.pairwise import rbf_kernel, linear_kernel, \ - polynomial_kernel -# from qp import QP -from ..monoview.additions.BoostUtils import ConvexProgram as QP - - -classifier_class_name = "MinCQ" - -# from majority_vote import MajorityVote -# from voter import StumpsVotersGenerator, KernelVotersGenerator - -class MinCqLearner(BaseEstimator, ClassifierMixin): - """ - MinCq algorithm learner. See [1, 2] - - Parameters - ---------- - mu : float - The fixed value of the first moment of the margin. - - voters_type : string, optional (default='kernel') - Specifies the type of voters. - It must be one of 'kernel', 'stumps' or 'manual'. If 'manual' is specified, the voters have to be manually set - using the "voters" parameter of the fit function. - - n_stumps_per_attribute : int, optional (default=10) - Specifies the amount of decision stumps per attribute. - It is only significant with 'stumps' voters_type. - - kernel : string, optional (default='rbf') - Specifies the kernel type to be used in the algorithm. - It must be one of 'linear', 'poly', 'rbf'. - - degree : int, optional (default=3) - Degree of the polynomial kernel function ('poly'). - Ignored by all other kernels. - - gamma : float, optional (default=0.0) - Kernel coefficient for 'rbf' and 'poly'. - If gamma is 0.0 then 1/n_features will be used instead. - """ - - def __init__(self, mu, voters_type, n_stumps_per_attribute=10, kernel='rbf', - degree=3, gamma=0.0, self_complemented=True): - assert 0 < mu <= 1, "MinCqLearner: mu parameter must be in (0, 1]" - self.mu = mu - self.voters_type = voters_type - self.n_stumps_per_attribute = n_stumps_per_attribute - self.kernel = kernel - self.degree = degree - self.gamma = gamma - self.log = False - self.self_complemented = self_complemented - - self.majority_vote = None - self.qp = None - - def fit(self, X, y, voters=None): - """ Learn a majority vote weights using MinCq. - - Parameters - ---------- - X : ndarray, shape=(n_samples, n_features) - Training data - - 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 - else: - y_reworked = y - - assert self.voters_type in ['stumps', 'kernel', - 'manual'], "MinCqLearner: voters_type must be 'stumps', 'kernel' or 'manual'" - - if self.voters_type == 'manual': - if voters is None: - logging.error( - "Manually set voters is True, but no voters have been set.") - return self - - else: - voters_generator = None - - if self.voters_type == 'stumps': - assert self.n_stumps_per_attribute >= 1, 'MinCqLearner: n_stumps_per_attribute must be positive' - voters_generator = StumpsVotersGenerator( - self.n_stumps_per_attribute) - - elif self.voters_type == 'kernel': - assert self.kernel in ['linear', 'poly', - 'rbf'], "MinCqLearner: kernel must be 'linear', 'poly' or 'rbf'" - - gamma = self.gamma - if gamma == 0.0: - gamma = 1.0 / np.shape(X)[1] - - if self.kernel == 'linear': - voters_generator = KernelVotersGenerator(linear_kernel) - elif self.kernel == 'poly': - voters_generator = KernelVotersGenerator(polynomial_kernel, - degree=self.degree, - gamma=gamma) - elif self.kernel == 'rbf': - voters_generator = KernelVotersGenerator(rbf_kernel, - gamma=gamma) - - voters = voters_generator.generate(X, y_reworked, - self_complemented=self.self_complemented) - - if self.log: - logging.info("MinCq training started...") - logging.info("Training dataset shape: {}".format(str(np.shape(X)))) - logging.info("Number of voters: {}".format(len(voters))) - self.majority_vote = MajorityVote(voters) - n_base_voters = len(self.majority_vote.weights) - - # Preparation and resolution of the quadratic program - - if self.log: - logging.info("Preparing QP...") - self._prepare_qp(X, y_reworked) - beg = time.time() - try: - if self.log: - logging.info("Solving QP...") - solver_weights = self.qp.solve() - - # Conversion of the weights of the n first voters to weights on the implicit 2n voters. - # 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_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) - end=time.time() - self.train_time=end-beg - return self - - def predict(self, X, save_data=True): - """ Using previously learned majority vote weights, predict the labels of new data points. - - Parameters - ---------- - X : ndarray, shape=(n_samples, n_features) - Samples to predict - - Returns - ------- - predictions : ndarray, shape=(n_samples,) - The predicted labels - """ - if self.log: - logging.info("Predicting...") - 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 - - 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 - level. The confidence level is the margin of the majority vote. - - Parameters - ---------- - X : ndarray, shape=(n_samples, n_features) - Samples to predict - - Returns - ------- - predictions : ndarray, shape=(n_samples,) - The predicted labels - """ - probabilities = np.zeros((np.shape(X)[0], 2)) - - # The margin is between -1 and 1, we rescale it to be between 0 and 1. - margins = self.majority_vote.margin(X) - margins += 1 - margins /= 2 - - # Then, the conficence for class +1 is set to the margin, and confidence for class -1 is set to 1 - margin. - probabilities[:, 1] = margins - probabilities[:, 0] = 1 - margins - return probabilities - - def _prepare_qp(self, X, y): - """ Prepare MinCq's quadratic program. See Program 1 of [2] for more details on its content. - - Parameters - ---------- - X : ndarray, shape=(n_samples, n_features) - Training data - - y : ndarray, shape=(n_samples,) - Training labels - """ - - self.qp = QP() - - n_features = len(self.majority_vote.voters) - n_examples = len(X) - classification_matrix = self.majority_vote.classification_matrix(X) - - # Objective function. - self.qp.quadratic_func = 2.0 / n_examples * classification_matrix.T.dot( - classification_matrix) - self.qp.linear_func = np.matrix( - np.matrix(-1.0 * np.mean(self.qp.quadratic_func / 2.0, axis=1))).T - - # First moment of the margin fixed to mu. - a_matrix = 2.0 / n_examples * y.T.dot(classification_matrix) - self.qp.add_equality_constraints(a_matrix, - self.mu + 1.0 / 2 * np.mean(a_matrix)) - - # Lower and upper bounds on the variables - self.qp.add_lower_bound(0.0) - self.qp.add_upper_bound(1.0 / n_features) - - -class MajorityVote(object): - """ A Majority Vote of real-valued functions. - - Parameters - ---------- - voters : ndarray of Voter instances - The voters of the majority vote. Each voter must take an example as an input, and output a real value in [-1,1]. - - weights : ndarray, optional (default: uniform distribution) - The weights associated to each voter. - """ - - def __init__(self, voters, weights=None): - self._voters = np.array(voters) - - if weights is not None: - assert (len(voters) == len(weights)) - self._weights = np.array(weights) - else: - self._weights = np.array([1.0 / len(voters)] * len(voters)) - - def vote(self, X): - """ Returns the vote of the Majority Vote on a list of samples. - - Parameters - ---------- - X : ndarray, shape=(n_samples, n_features) - Input data to classify. - - Returns - ------- - votes : ndarray, shape=(n_samples,), where each value is either -1 or 1 - The vote of the majority vote for each sample. - """ - margins = self.margin(X) - return np.array([int(x) for x in np.sign(margins)]) - - def margin(self, X): - """ Returns the margin of the Majority Vote on a list of samples. - - Parameters - ---------- - X : ndarray, shape=(n_samples, n_features) - Input data on which to calculate the margin. - - Returns - ------- - margins : ndarray, shape=(n_samples,), where each value is either -1 or 1 - The margin of the majority vote for each sample. - """ - classification_matrix = self.classification_matrix(X) - return np.squeeze( - np.asarray(np.dot(classification_matrix, self.weights))) - - def classification_matrix(self, X): - """ Returns the classification matrix of the majority vote. - - Parameters - ---------- - X : ndarray, shape=(n_samples, n_features) - Input data to classify - - Returns - ------- - classification_matrix : ndrray, shape=(n_samples, n_voters) - A matrix that contains the value output by each voter, for each sample. - - """ - return np.matrix([v.vote(X) for v in self._voters]).T - - @property - def weights(self): - return self._weights - - @weights.setter - def weights(self, weights): - self._weights = np.array(weights) - - @property - def voters(self): - return self._voters - - @voters.setter - def voters(self, voters): - self._voters = np.array(voters) - - def cbound_value(self, X, y): - """ Returns the value of the C-bound, evaluated on given examples. - - Parameters - ---------- - X : ndarray, shape=(n_samples, n_feature) - Input data - y : ndarray, shape=(n_samples, ) - Input labels, where each label is either -1 or 1. - """ - assert np.all(np.in1d(y, [-1, - 1])), 'cbound_value: labels should be either -1 or 1' - - classification_matrix = self.classification_matrix(X) - first_moment = float( - 1.0 / len(y) * classification_matrix.dot(self.weights).dot(y)) - second_moment = float(1.0 / len(y) * self.weights.T.dot( - classification_matrix.T.dot(classification_matrix)).dot( - self.weights)) - - return 1 - (first_moment ** 2 / second_moment) - - -# -*- coding:utf-8 -*- -__author__ = "Jean-Francis Roy" - -import numpy as np - - -class Voter(object): - """ Base class for a voter (function X -> [-1, 1]), where X is an array of samples - """ - - def __init__(self): - pass - - def vote(self, X): - """ Returns the output of the voter, on a sample list X - - Parameters - ---------- - X : ndarray, shape=(n_samples, n_features) - Input data to classify - - Returns - ------- - votes : ndarray, shape=(n_samples,) - The result the the voter function, for each sample - """ - raise NotImplementedError("Voter.vote: Not implemented.") - - -class BinaryKernelVoter(Voter): - """ A Binary Kernel Voter, which outputs the value of a kernel function whose first example is fixed a priori. - The sign of the output depends on the label (-1 or 1) of the sample on which the kernel voter is based - - Parameters - ---------- - x : ndarray, shape=(n_features,) - The base sample's description vector - - y : int, -1 or 1 - The label of the base sample. Determines if the voter thinks "negative" or "positive" - - kernel_function : function - The kernel function takes two samples and returns a similarity value. If the kernel has parameters, they should - be set using kwargs parameter - - kwargs : keyword arguments (optional) - Additional parameters for the kernel function - """ - - def __init__(self, x, y, kernel_function, **kwargs): - assert (y in {-1, 1}) - super(BinaryKernelVoter, self).__init__() - self._x = x - self._y = y - self._kernel_function = kernel_function - self._kernel_kwargs = kwargs - - def vote(self, X): - base_point_array = np.array([self._x]) - votes = self._y * self._kernel_function(base_point_array, X, - **self._kernel_kwargs) - votes = np.squeeze(np.asarray(votes)) - - return votes - - -class DecisionStumpVoter(Voter): - """ - Generic Attribute Threshold Binary Classifier - - Parameters - ---------- - attribute_index : int - The attribute to consider for the classification - - threshold : float - The threshold value for classification rule - - direction : int (-1 or 1) - Used to reverse classification decision - """ - - def __init__(self, attribute_index, threshold, direction=1): - super(DecisionStumpVoter, self).__init__() - self.attribute_index = attribute_index - self.threshold = threshold - self.direction = direction - - def vote(self, points): - return [((point[ - self.attribute_index] > self.threshold) * 2 - 1) * self.direction - for point in points] - - -class VotersGenerator(object): - """ Base class to create a set of voters using training samples - """ - - def generate(self, X, y=None, self_complemented=False): - """ Generates the voters using samples. - - Parameters - ---------- - X : ndarray, shape=(n_samples, n_features) - Input data on which to base the voters - - y : ndarray, shape=(n_samples,), optional - Input labels, usually determines the decision polarity of each voter - - self_complemented : bool - Determines if complement voters should be generated or not - - Returns - ------- - voters : ndarray - An array of voters - """ - raise NotImplementedError("VotersGenerator.generate: not implemented") - - -class StumpsVotersGenerator(VotersGenerator): - """ Decision Stumps Voters generator. - - Parameters - ---------- - n_stumps_per_attribute : int, (default=10) - Determines how many decision stumps will be created for each attribute. - """ - - def __init__(self, n_stumps_per_attribute=10): - self._n_stumps_per_attribute = n_stumps_per_attribute - - def _find_extremums(self, X, i): - mini = np.Infinity - maxi = -np.Infinity - for x in X: - if x[i] < mini: - mini = x[i] - if x[i] > maxi: - maxi = x[i] - return mini, maxi - - def generate(self, X, y=None, self_complemented=False, - only_complements=False): - voters = [] - if len(X) != 0: - for i in range(len(X[0])): - t = self._find_extremums(X, i) - inter = (t[1] - t[0]) / (self._n_stumps_per_attribute + 1) - - if inter != 0: - # If inter is zero, the attribute is useless as it has a constant value. We do not add stumps for - # this attribute. - for x in range(self._n_stumps_per_attribute): - - if not only_complements: - voters.append( - DecisionStumpVoter(i, t[0] + inter * (x + 1), - 1)) - - if self_complemented or only_complements: - voters.append( - DecisionStumpVoter(i, t[0] + inter * (x + 1), - -1)) - - return np.array(voters) - - -class KernelVotersGenerator(VotersGenerator): - """ Utility function to create binary kernel voters for each (x, y) sample. - - Parameters - ---------- - kernel_function : function - The kernel function takes two samples and returns a similarity value. If the kernel has parameters, they should - be set using kwargs parameter - - kwargs : keyword arguments (optional) - Additional parameters for the kernel function - """ - - def __init__(self, kernel_function, **kwargs): - self._kernel_function = kernel_function - self._kernel_kwargs = kwargs - - def generate(self, X, y=None, self_complemented=False, - only_complements=False): - if y is None: - y = np.array([1] * len(X)) - - voters = [] - - for point, label in zip(X, y): - if not only_complements: - voters.append( - BinaryKernelVoter(point, label, self._kernel_function, - **self._kernel_kwargs)) - - if self_complemented or only_complements: - voters.append( - BinaryKernelVoter(point, -1 * label, self._kernel_function, - **self._kernel_kwargs)) - - return np.array(voters) - - -class MinCQ(MinCqLearner, BaseMonoviewClassifier): - - def __init__(self, random_state=None, mu=0.01, self_complemented=True, - n_stumps_per_attribute=10, **kwargs): - super(MinCQ, self).__init__(mu=mu, - voters_type='stumps', - n_stumps_per_attribute=n_stumps_per_attribute, - self_complemented=self_complemented - ) - self.param_names = ["mu", "n_stumps_per_attribute", "random_state"] - self.distribs = [CustomUniform(loc=0.5, state=2.0, multiplier="e-"), - [n_stumps_per_attribute], [random_state]] - self.random_state = random_state - 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 set_params(self, **params): - self.mu = params["mu"] - self.random_state = params["random_state"] - self.n_stumps_per_attribute = params["n_stumps_per_attribute"] - return self - - def get_params(self, deep=True): - return {"random_state": self.random_state, "mu": self.mu, - "n_stumps_per_attribute": self.n_stumps_per_attribute} - - def getInterpret(self, directory, y_test): - 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)) - np.savetxt(directory+"times.csv", np.array([self.train_time, 0])) - return interpret_string - - def get_name_for_fusion(self): - return "MCQ" - -# -# def formatCmdArgs(args): -# """Used to format kwargs for the parsed args""" -# kwargsDict = {"mu": args.MCQ_mu, -# "n_stumps_per_attribute": args.MCQ_stumps} -# return kwargsDict - - -def paramsToSet(nIter, randomState): - """Used for weighted linear early fusion to generate random search sets""" - paramsSet = [] - for _ in range(nIter): - paramsSet.append({}) - return paramsSet diff --git a/multiview_platform/mono_multi_view_classifiers/monoview_classifiers/min_cq_graalpy.py b/multiview_platform/mono_multi_view_classifiers/monoview_classifiers/min_cq_graalpy.py deleted file mode 100644 index a55d54ae7f8acf59acf4171c37a8ac9489743671..0000000000000000000000000000000000000000 --- a/multiview_platform/mono_multi_view_classifiers/monoview_classifiers/min_cq_graalpy.py +++ /dev/null @@ -1,70 +0,0 @@ -import numpy as np - -from ..monoview.additions.BoostUtils import StumpsClassifiersGenerator -from ..monoview.additions.MinCQUtils import RegularizedBinaryMinCqClassifier -from ..monoview.monoview_utils import BaseMonoviewClassifier, CustomUniform - - -classifier_class_name = "MinCQGraalpy" - -class MinCQGraalpy(RegularizedBinaryMinCqClassifier, BaseMonoviewClassifier): - - def __init__(self, random_state=None, mu=0.01, self_complemented=True, - n_stumps_per_attribute=1, **kwargs): - super(MinCQGraalpy, self).__init__(mu=mu, - estimators_generator=StumpsClassifiersGenerator( - n_stumps_per_attribute=n_stumps_per_attribute, - self_complemented=self_complemented), - ) - self.param_names = ["mu", "n_stumps_per_attribute", "random_state"] - self.distribs = [CustomUniform(loc=0.05, state=2.0, multiplier="e-"), - [n_stumps_per_attribute], [random_state]] - self.n_stumps_per_attribute = n_stumps_per_attribute - self.classed_params = [] - self.weird_strings = {} - self.random_state = random_state - 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 False - - def set_params(self, **params): - self.mu = params["mu"] - self.random_state = params["random_state"] - self.n_stumps_per_attribute = params["n_stumps_per_attribute"] - return self - - def get_params(self, deep=True): - return {"random_state": self.random_state, "mu": self.mu, - "n_stumps_per_attribute": self.n_stumps_per_attribute} - - def getInterpret(self, directory, y_test): - interpret_string = "Cbound on train :" + str(self.train_cbound) - np.savetxt(directory + "times.csv", np.array([self.train_time, 0])) - # 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 "MCG" - - -# def formatCmdArgs(args): -# """Used to format kwargs for the parsed args""" -# kwargsDict = {"mu": args.MCG_mu, -# "n_stumps_per_attribute": args.MCG_stumps} -# return kwargsDict - - -def paramsToSet(nIter, random_state): - """Used for weighted linear early fusion to generate random search sets""" - paramsSet = [] - for _ in range(nIter): - paramsSet.append({}) - return paramsSet diff --git a/multiview_platform/mono_multi_view_classifiers/monoview_classifiers/min_cq_graalpy_tree.py b/multiview_platform/mono_multi_view_classifiers/monoview_classifiers/min_cq_graalpy_tree.py deleted file mode 100644 index 0bc6b73d2f9561ad669b1207781cf613bc88d2b9..0000000000000000000000000000000000000000 --- a/multiview_platform/mono_multi_view_classifiers/monoview_classifiers/min_cq_graalpy_tree.py +++ /dev/null @@ -1,76 +0,0 @@ -import numpy as np - -from ..monoview.additions.BoostUtils import TreeClassifiersGenerator -from ..monoview.additions.MinCQUtils import RegularizedBinaryMinCqClassifier -from ..monoview.monoview_utils import BaseMonoviewClassifier, CustomUniform - -classifier_class_name = "MinCQGraalpyTree" - -class MinCQGraalpyTree(RegularizedBinaryMinCqClassifier, - BaseMonoviewClassifier): - - def __init__(self, random_state=None, mu=0.01, self_complemented=True, - n_stumps_per_attribute=1, max_depth=2, **kwargs): - super(MinCQGraalpyTree, self).__init__(mu=mu, - estimators_generator=TreeClassifiersGenerator( - n_trees=n_stumps_per_attribute, - max_depth=max_depth, - self_complemented=self_complemented), - ) - self.param_names = ["mu", "n_stumps_per_attribute", "random_state", - "max_depth"] - self.distribs = [CustomUniform(loc=0.05, state=2.0, multiplier="e-"), - [n_stumps_per_attribute], [random_state], [max_depth]] - self.n_stumps_per_attribute = n_stumps_per_attribute - self.classed_params = [] - self.weird_strings = {} - self.max_depth = max_depth - self.random_state = random_state - 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 set_params(self, **params): - self.mu = params["mu"] - self.random_state = params["random_state"] - self.n_stumps_per_attribute = params["n_stumps_per_attribute"] - self.max_depth = params["max_depth"] - return self - - def get_params(self, deep=True): - return {"random_state": self.random_state, "mu": self.mu, - "n_stumps_per_attribute": self.n_stumps_per_attribute, - "max_depth": self.max_depth} - - def getInterpret(self, directory, y_test): - interpret_string = "Cbound on train :" + str(self.train_cbound) - np.savetxt(directory + "times.csv", np.array([self.train_time, 0])) - # 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 "MCG" - - -# def formatCmdArgs(args): -# """Used to format kwargs for the parsed args""" -# kwargsDict = {"mu": args.MCGT_mu, -# "n_stumps_per_attribute": args.MCGT_trees, -# "max_depth": args.MCGT_max_depth} -# return kwargsDict - - -def paramsToSet(nIter, randomState): - """Used for weighted linear early fusion to generate random search sets""" - paramsSet = [] - for _ in range(nIter): - paramsSet.append({}) - return paramsSet