diff --git a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/kernel_learning.py b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/kernel_learning.py index 3eda3730f720c90403aff91ee3aa3757eae032e9..c2a18ed33c066a15229c60867fee3145b6ec081b 100644 --- a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/kernel_learning.py +++ b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/additions/kernel_learning.py @@ -1,8 +1,9 @@ from sklearn.metrics import pairwise import numpy as np -from ...multiview.multiview_utils import BaseMultiviewClassifier +from ...multiview.multiview_utils import BaseMultiviewClassifier, get_examples_views_indices from ...utils.hyper_parameter_search import CustomUniform, CustomRandint +from ...utils.transformations import sign_labels, unsign_labels class KernelClassifier(BaseMultiviewClassifier): @@ -21,6 +22,23 @@ class KernelClassifier(BaseMultiviewClassifier): **kernel_config) return new_X + def _init_fit(self, X, y, train_indices, view_indices): + train_indices, view_indices = get_examples_views_indices(X, + train_indices, + view_indices) + self.init_kernels(nb_view=len(view_indices), ) + new_X = self._compute_kernels(X, + train_indices, view_indices) + new_y = sign_labels(y[train_indices]) + return new_X, new_y + + def extract_labels(self, predicted_labels): + signed_labels = np.sign(predicted_labels) + return unsign_labels(signed_labels) + + + + def init_kernels(self, nb_view=2, ): if isinstance(self.kernel_types, KernelDistribution): self.kernel_functions = self.kernel_types.draw(nb_view) @@ -58,11 +76,11 @@ class KernelConfigDistribution: def __init__(self, seed=42): self.random_state=np.random.RandomState(seed) self.possible_config = { - "polynomial_kernel":{"degree": CustomRandint(low=1, high=7), - "gamma": CustomUniform(), - "coef0": CustomUniform() - - }, + # "polynomial_kernel":{"degree": CustomRandint(low=1, high=7), + # "gamma": CustomUniform(), + # "coef0": CustomUniform() + # + # }, "chi2_kernel": {"gamma": CustomUniform()}, "rbf_kernel": {"gamma": CustomUniform()}, } @@ -90,8 +108,7 @@ class KernelDistribution: def __init__(self, seed=42): self.random_state=np.random.RandomState(seed) - self.available_kernels = [pairwise.polynomial_kernel, - pairwise.chi2_kernel, + self.available_kernels = [pairwise.chi2_kernel, pairwise.rbf_kernel,] def draw(self, nb_view): diff --git a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/lp_norm_mkl.py b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/lp_norm_mkl.py index f68973f8eb61546c2a7d0f58d783c009fe06366f..f93f632c0982f7203f02feb727095dea6a1b966b 100644 --- a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/lp_norm_mkl.py +++ b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/lp_norm_mkl.py @@ -147,7 +147,6 @@ class MKL(BaseEstimator, ClassifierMixin): else: return C, weights - def predict(self, X, views_ind=None): if isinstance(X, Metriclearn_array): # self.X_ = X @@ -157,10 +156,9 @@ class MKL(BaseEstimator, ClassifierMixin): elif isinstance(X, np.ndarray): X = Metriclearn_array(X, views_ind) C = self.C - weights = self.weights + weights = self.weights return self.lpMKL_predict(X , C, weights) - def lpMKL_predict(self, X, C, weights, views_ind=None): if isinstance(X, Metriclearn_array): # self.X_ = X @@ -177,7 +175,6 @@ class MKL(BaseEstimator, ClassifierMixin): # kernel = weights[0] * self.data.test_kernel_dict[0] # for v in range(1, views): # kernel = kernel + weights[v] * self.data.test_kernel_dict[v] - # TEST KERNEL APPROXIMATION kernel = np.zeros((tt, self.X_.shape[0])) for v in range(0, views): @@ -221,19 +218,15 @@ class LPNormMKL(KernelClassifier, MKL): self.prev_alpha = prev_alpha 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_kernels(nb_view= len(view_indices), ) - new_X = self._compute_kernels(X, - train_indices, view_indices) - return super(LPNormMKL, self).fit(new_X, y[train_indices]) + new_X, new_y = self._init_fit(X, y, train_indices, view_indices) + return super(LPNormMKL, self).fit(new_X, new_y) def predict(self, X, example_indices=None, view_indices=None): example_indices, view_indices = get_examples_views_indices(X, example_indices, view_indices) new_X = self._compute_kernels(X, example_indices, view_indices) - return super(LPNormMKL, self).predict(new_X) + return self.extract_labels(super(LPNormMKL, self).predict(new_X)) diff --git a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/mvml.py b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/mvml.py index 5054ec54eb565f31488c29d4f312fafc2b03133b..3e5af0a9cc83bf1ef65fb1a027d23efb57c97321 100644 --- a/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/mvml.py +++ b/multiview_platform/mono_multi_view_classifiers/multiview_classifiers/mvml.py @@ -503,17 +503,14 @@ class MVMLClassifier(KernelClassifier, MVML): [0,1], CustomRandint(low=1, high=100), [[0.1,0.9]]] 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_kernels(nb_view=len(view_indices), ) - new_X = self._compute_kernels(X, - train_indices, view_indices) - return super(MVMLClassifier, self).fit(new_X, y[train_indices]) + new_X, new_y = self._init_fit(X, y, train_indices, view_indices) + return super(MVMLClassifier, self).fit(new_X, new_y) def predict(self, X, example_indices=None, view_indices=None): example_indices, view_indices = get_examples_views_indices(X, example_indices, view_indices) new_X = self._compute_kernels(X, example_indices, view_indices) - return super(MVMLClassifier, self).predict(new_X) \ No newline at end of file + print(self.extract_labels(super(MVMLClassifier, self).predict(new_X))) + return self.extract_labels(super(MVMLClassifier, self).predict(new_X)) + diff --git a/multiview_platform/mono_multi_view_classifiers/utils/transformations.py b/multiview_platform/mono_multi_view_classifiers/utils/transformations.py index 9d26ddde8bd02fea2ef1176385ac251260027e40..e2cdfdf132364ec0da54d98591d202b116dda339 100644 --- a/multiview_platform/mono_multi_view_classifiers/utils/transformations.py +++ b/multiview_platform/mono_multi_view_classifiers/utils/transformations.py @@ -1,8 +1,45 @@ import numpy as np - +from sklearn.preprocessing import LabelEncoder def sign_labels(labels): - if set(labels) == (0, 1): + """ + Returns a label array with (-1,1) as labels. + If labels was already made of (-1,1), returns labels. + If labels is made of (0,1), returns labels with all + zeros transformed in -1. + + Parameters + ---------- + labels + + The original label numpy array + + Returns + ------- + A np.array with labels made of (-1,1) + """ + if 0 in labels: return np.array([label if label != 0 else -1 for label in labels]) else: return labels + +def unsign_labels(labels): + """ + The inverse function + + Parameters + ---------- + labels + + Returns + ------- + + """ + if len(labels.shape)==2: + labels = labels.reshape((labels.shape[0], )) + print(labels) + if -1 in labels: + return np.array([label if label != -1 else 0 for label in labels]) + else: + return labels +