Spaces:
Runtime error
Runtime error
| import numpy as np | |
| from sklearn.neighbors import KNeighborsClassifier | |
| from sklearn.naive_bayes import GaussianNB | |
| from sklearn.preprocessing import StandardScaler | |
| from sklearn.decomposition import PCA | |
| from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix | |
| class BaselineModels: | |
| """ | |
| A wrapper class for baseline classifiers. | |
| Currently supports KNN and GNB. | |
| """ | |
| def __init__(self, knn_k=5, use_scaler=True, use_pca=False, pca_components=50): | |
| self.knn_k = knn_k | |
| self.use_scaler = use_scaler | |
| self.use_pca = use_pca | |
| self.pca_components = pca_components | |
| self.scaler = StandardScaler() if use_scaler else None | |
| self.pca = PCA(n_components=pca_components) if use_pca else None | |
| # supported classifiers | |
| self.knn = KNeighborsClassifier(n_neighbors=self.knn_k) | |
| self.nb = GaussianNB() | |
| self._fitted = False | |
| def _prepare(self, X, fit=False): | |
| Xp = X | |
| if self.scaler is not None: | |
| if fit: | |
| Xp = self.scaler.fit_transform(Xp) | |
| else: | |
| Xp = self.scaler.transform(Xp) | |
| if self.pca is not None: | |
| if fit: | |
| Xp = self.pca.fit_transform(Xp) | |
| else: | |
| Xp = self.pca.transform(Xp) | |
| return Xp | |
| def fit(self, X, y): | |
| Xp = self._prepare(X, fit=True) | |
| self.knn.fit(Xp, y) | |
| self.nb.fit(Xp, y) | |
| self._fitted = True | |
| def predict(self, X, model='knn'): | |
| if not self._fitted: | |
| raise RuntimeError('Models not fitted. Call fit() first.') | |
| Xp = self._prepare(X, fit=False) | |
| if model == 'knn': | |
| return self.knn.predict(Xp) | |
| elif model == 'nb' or model == 'naivebayes': | |
| return self.nb.predict(Xp) | |
| else: | |
| raise ValueError('Unknown model: choose "knn" or "nb"') | |
| def evaluate(self, X, y, model='knn', average='macro'): | |
| y_pred = self.predict(X, model=model) | |
| metrics = { | |
| 'accuracy': accuracy_score(y, y_pred), | |
| 'precision': precision_score(y, y_pred, average=average, zero_division=0), | |
| 'recall': recall_score(y, y_pred, average=average, zero_division=0), | |
| 'f1': f1_score(y, y_pred, average=average, zero_division=0), | |
| 'confusion_matrix': confusion_matrix(y, y_pred), | |
| } | |
| return metrics | |