Source code for mafese.utils.encoder

#!/usr/bin/env python
# Created by "Thieu" at 13:58, 09/05/2023 ----------%                                                                               
#       Email: nguyenthieu2102@gmail.com            %                                                    
#       Github: https://github.com/thieu1995        %                         
# --------------------------------------------------%

import numpy as np


[docs]class LabelEncoder: """ Encode categorical features as integer labels. """ def __init__(self): self.unique_labels = None self.label_to_index = {}
[docs] def fit(self, y): """ Fit label encoder to a given set of labels. Parameters: ----------- y : array-like Labels to encode. """ self.unique_labels = np.unique(y) self.label_to_index = {label: i for i, label in enumerate(self.unique_labels)}
[docs] def transform(self, y): """ Transform labels to encoded integer labels. Parameters: ----------- y : array-like Labels to encode. Returns: -------- encoded_labels : array-like Encoded integer labels. """ if self.unique_labels is None: raise ValueError("Label encoder has not been fit yet.") return np.array([self.label_to_index[label] for label in y])
[docs] def fit_transform(self, y): """Fit label encoder and return encoded labels. Parameters ---------- y : array-like of shape (n_samples,) Target values. Returns ------- y : array-like of shape (n_samples,) Encoded labels. """ self.fit(y) return self.transform(y)
[docs] def inverse_transform(self, y): """ Transform integer labels to original labels. Parameters: ----------- y : array-like Encoded integer labels. Returns: -------- original_labels : array-like Original labels. """ if self.unique_labels is None: raise ValueError("Label encoder has not been fit yet.") return np.array([self.unique_labels[i] if i in self.label_to_index.values() else "unknown" for i in y])
[docs]class ObjectiveScaler: """ For label scaler in classification (binary and multiple classification) """ def __init__(self, obj_name="sigmoid", ohe_scaler=None): """ ohe_scaler: Need to be an instance of One-Hot-Encoder for softmax scaler (multiple classification problem) """ self.obj_name = obj_name self.ohe_scaler = ohe_scaler
[docs] def transform(self, data): if self.obj_name == "sigmoid" or self.obj_name == "self": return data elif self.obj_name == "hinge": data = np.squeeze(np.array(data)) data[np.where(data == 0)] = -1 return data elif self.obj_name == "softmax": data = self.ohe_scaler.fit_transform(np.reshape(data, (-1, 1))) return data
[docs] def inverse_transform(self, data): if self.obj_name == "sigmoid": data = np.squeeze(np.array(data)) data = np.rint(data).astype(int) elif self.obj_name == "hinge": data = np.squeeze(np.array(data)) data = np.ceil(data).astype(int) data[np.where(data == -1)] = 0 elif self.obj_name == "softmax": data = np.squeeze(np.array(data)) data = np.argmax(data, axis=1) return data