diff --git a/config_files/config_test.yml b/config_files/config_test.yml index db2a33152464f8e0b67a0dfa063aa8a73d358bd2..8476b0e445d290f1f25b10898e39a842b9014d9e 100644 --- a/config_files/config_test.yml +++ b/config_files/config_test.yml @@ -20,12 +20,12 @@ Classification: multiclass_method: "oneVersusOne" split: 0.4 nb_folds: 2 - nb_class: 3 + nb_class: 2 classes: - type: ["monoview", "multiview"] + type: ["multiview"] algos_monoview: ["adaboost",] - algos_multiview: ["weighted_linear_early_fusion"] - stats_iter: 2 + algos_multiview: ["svm_jumbo_fusion"] + stats_iter: 1 metrics: ["accuracy_score", "f1_score"] metric_princ: "f1_score" hps_type: "randomized_search-equiv" @@ -221,3 +221,6 @@ mvml: kernel_types: ["rbf_kernel"] kernel_configs: gamma: [0.1] + +svm_jumbo_fusion: + degree: [1] diff --git a/multiview_platform/mono_multi_view_classifiers/multiview/exec_multiview.py b/multiview_platform/mono_multi_view_classifiers/multiview/exec_multiview.py index 607c2a3d513acc225d2ffa123a7ce4d21d8f0799..abea7e64e38475d671e89dd4bafba594d3892b1a 100644 --- a/multiview_platform/mono_multi_view_classifiers/multiview/exec_multiview.py +++ b/multiview_platform/mono_multi_view_classifiers/multiview/exec_multiview.py @@ -292,9 +292,9 @@ def exec_multiview(directory, dataset_var, name, classification_indices, k_folds for test_index, index in enumerate(validation_indices): full_labels[index] = test_labels[test_index] if test_indices_multiclass != []: - test_labels_multiclass = classifier.predict_hdf5(dataset_var, - used_indices=test_indices_multiclass, - views_indices=views_indices) + test_labels_multiclass = classifier.predict(dataset_var, + example_indices=test_indices_multiclass, + view_indices=views_indices) else: test_labels_multiclass = [] logging.info("Done:\t Pertidcting") diff --git a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/diversity_utils.py b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/diversity_utils.py index 7b40beaff1366dae890b5d65e99a7cbbea452809..680412c17568cd2b924971a6bf8a62c4972ead78 100644 --- a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/diversity_utils.py +++ b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/diversity_utils.py @@ -35,8 +35,8 @@ class DiversityFusionClassifier(BaseMultiviewClassifier, self.estimator_pool = [] for classifier_idx, classifier_name in enumerate(self.classifier_names): self.estimator_pool.append([]) - estimator = self.init_monoview_estimator(classifier_name, self.classifier_configs) for idx, view_idx in enumerate(view_indices): + estimator = self.init_monoview_estimator(classifier_name, self.classifier_configs) estimator.fit(X.get_v(view_idx, train_indices), y[train_indices]) self.estimator_pool[classifier_idx].append(estimator) else: @@ -49,14 +49,19 @@ class DiversityFusionClassifier(BaseMultiviewClassifier, example_indices, view_indices = get_examples_views_indices(X, example_indices, view_indices) - nb_class = X.get_nb_class(example_indices) + nb_class = X.get_nb_class() + if nb_class>2: + nb_class=3 votes = np.zeros((len(example_indices), nb_class), dtype=float) monoview_predictions = [monoview_estimator.predict(X.get_v(view_idx, example_indices)) for view_idx, monoview_estimator in zip(view_indices, self.monoview_estimators)] for idx, example_index in enumerate(example_indices): for monoview_estimator_index, monoview_prediciton in enumerate(monoview_predictions): - votes[idx, int(monoview_prediciton[idx])] += 1 + if int(monoview_prediciton[idx]) == -100: + votes[idx, 2] += 1 + else: + votes[idx, int(monoview_prediciton[idx])] += 1 predicted_labels = np.argmax(votes, axis=1) return predicted_labels diff --git a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/jumbo_multiview_utils.py b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/jumbo_multiview_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..bceee169bf991f92b5a6ab505cac157ab2e9d561 --- /dev/null +++ b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/jumbo_multiview_utils.py @@ -0,0 +1,60 @@ +import numpy as np + +from ...multiview.multiview_utils import get_examples_views_indices +from .late_fusion_utils import LateFusionClassifier +from ...monoview.monoview_utils import CustomRandint + +class BaseJumboFusion(LateFusionClassifier): + + def __init__(self, random_state, classifiers_names=None, + classifier_configs=None, + nb_cores=1, weights=None, nb_monoview_per_view=1): + super(BaseJumboFusion, self).__init__(random_state, classifiers_names=classifiers_names, + classifier_configs=classifier_configs, + nb_cores=nb_cores, weights=weights) + self.param_names += ["nb_monoview_per_view", ] + self.distribs += [CustomRandint(1,10)] + self.nb_monoview_per_view = nb_monoview_per_view + + def set_params(self, **params): + self.nb_monoview_per_view = params["nb_monoview_per_view"] + super(BaseJumboFusion, self).set_params(**params) + + def predict(self, X, example_indices=None, view_indices=None): + example_indices, view_indices = get_examples_views_indices(X, example_indices, view_indices) + monoview_decisions = self.predict_monoview(X, example_indices=example_indices, view_indices=view_indices) + return self.aggregation_estimator.predict(monoview_decisions) + + def fit(self, X, y, train_indices=None, view_indices=None): + train_indices, view_indices = get_examples_views_indices(X, train_indices, view_indices) + self.init_classifiers(len(view_indices), nb_monoview_per_view=self.nb_monoview_per_view) + print(self.classifiers_names, self.nb_monoview_per_view) + self.fit_monoview_estimators(X, y, train_indices=train_indices, view_indices=view_indices) + monoview_decisions = self.predict_monoview(X, example_indices=train_indices, view_indices=view_indices) + self.aggregation_estimator.fit(monoview_decisions, y[train_indices]) + return self + + def fit_monoview_estimators(self, X, y, train_indices=None, view_indices=None): + self.monoview_estimators = [[self.init_monoview_estimator(classifier_name, + self.classifier_configs[classifier_index]) + for classifier_index, classifier_name + in enumerate(self.classifiers_names)] + for _ in view_indices] + + self.monoview_estimators = [[estimator.fit(X.get_v(view_indices[idx], train_indices), y[train_indices]) + for estimator in view_estimators] + for idx, view_estimators in enumerate(self.monoview_estimators)] + return self + + def predict_monoview(self, X, example_indices=None, view_indices=None): + monoview_decisions = np.zeros((len(example_indices), len(view_indices)*len(self.classifiers_names))) + for idx, view_estimators in enumerate(self.monoview_estimators): + for estimator_index, estimator in enumerate(view_estimators): + monoview_decisions[:, len(self.classifiers_names)*idx+estimator_index] = estimator.predict(X.get_v(view_indices[idx], + example_indices)) + return monoview_decisions + + + + + diff --git a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/late_fusion_utils.py b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/late_fusion_utils.py index 487e427600c331646f58a650e3984add30616766..f54fa286e9f25fe9a513cc5f885e56139904342e 100644 --- a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/late_fusion_utils.py +++ b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/late_fusion_utils.py @@ -73,14 +73,14 @@ class WeightsGenerator: class LateFusionClassifier(BaseMultiviewClassifier, BaseFusionClassifier): - def __init__(self, random_state=None, classifier_names=None, + def __init__(self, random_state=None, classifiers_names=None, classifier_configs=None, nb_cores=1, weights=None): super(LateFusionClassifier, self).__init__(random_state) - self.classifiers_names = classifier_names + self.classifiers_names = classifiers_names self.classifier_configs = classifier_configs self.nb_cores = nb_cores self.weights = weights - self.param_names = ["classifier_names", "classifier_configs", "weights"] + self.param_names = ["classifiers_names", "classifier_configs", "weights"] self.distribs =[ClassifierCombinator(need_probas=self.need_probas), MultipleConfigGenerator(), WeightsGenerator()] @@ -106,15 +106,7 @@ class LateFusionClassifier(BaseMultiviewClassifier, BaseFusionClassifier): else: self.weights = self.weights/np.sum(self.weights) - if isinstance(self.classifiers_names, ClassifierDistribution): - self.classifiers_names = self.classifiers_names.draw(nb_view) - elif self.classifiers_names is None: - self.classifiers_names = ["decision_tree" for _ in range(nb_view)] - - if isinstance(self.classifier_configs, ConfigDistribution): - self.classifier_configs = self.classifier_configs.draw(nb_view) - elif isinstance(self.classifier_configs, dict): - self.classifier_configs = [{classifier_name: self.classifier_configs[classifier_name]} for classifier_name in self.classifiers_names] + self.init_classifiers(nb_view) self.monoview_estimators = [ self.init_monoview_estimator(classifier_name, @@ -123,7 +115,23 @@ class LateFusionClassifier(BaseMultiviewClassifier, BaseFusionClassifier): for classifier_index, classifier_name in enumerate(self.classifiers_names)] - # def verif_clf_views(self, classifier_names, nb_view): + def init_classifiers(self, nb_view, nb_monoview_per_view=None): + if nb_monoview_per_view is not None: + nb_clfs = nb_monoview_per_view + else: + nb_clfs = nb_view + if isinstance(self.classifiers_names, ClassifierDistribution): + self.classifiers_names = self.classifiers_names.draw(nb_clfs) + elif self.classifiers_names is None: + self.classifiers_names = ["decision_tree" for _ in range(nb_clfs)] + + if isinstance(self.classifier_configs, ConfigDistribution): + self.classifier_configs = self.classifier_configs.draw(nb_clfs) + elif isinstance(self.classifier_configs, dict): + self.classifier_configs = [{classifier_name: self.classifier_configs[classifier_name]} for classifier_name in self.classifiers_names] + + +# def verif_clf_views(self, classifier_names, nb_view): # if classifier_names is None: # if nb_view is None: # raise AttributeError(self.__class__.__name__+" must have either classifier_names or nb_views provided.") diff --git a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/svm_jumbo_fusion.py b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/svm_jumbo_fusion.py new file mode 100644 index 0000000000000000000000000000000000000000..f88c344d095fa1da6a187c4eea6e787f1fb72c69 --- /dev/null +++ b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/svm_jumbo_fusion.py @@ -0,0 +1,27 @@ +from sklearn.svm import SVC + +from .additions.jumbo_multiview_utils import BaseJumboFusion +from ..monoview.monoview_utils import CustomUniform, CustomRandint + +classifier_class_name = "SVMJumboFusion" + +class SVMJumboFusion(BaseJumboFusion): + + def __init__(self, random_state=None, classifiers_names=None, + classifier_configs=None, nb_cores=1, weights=None, nb_monoview_per_view=1, C=1.0, kernel="rbf", degree=2): + self.need_probas=False + super(SVMJumboFusion, self).__init__(random_state, classifiers_names=classifiers_names, + classifier_configs=classifier_configs, + nb_cores=nb_cores, weights=weights, nb_monoview_per_view=nb_monoview_per_view) + self.param_names += ["C", "kernel", "degree"] + self.distribs += [CustomUniform(), ["rbf", "poly", "linear"], CustomRandint(2, 5)] + self.aggregation_estimator = SVC(C=C, kernel=kernel, degree=degree) + + def set_params(self, **params): + super(SVMJumboFusion, self).set_params(**params) + self.aggregation_estimator.set_params(**dict((key, value) for key, value in params.items() if key in ["C", "kernel", "degree"])) + return self + + + +