def _predict_proba_drcif(self, X, X_p, X_d, c22, n_intervals, intervals, dims, atts): """Embedded predict proba for the DrCIF classifier.""" if not self._is_fitted: raise NotFittedError( f"This instance of {self.__class__.__name__} has not " f"been fitted yet; please call `fit` first.") X = check_X(X, coerce_to_numpy=True) n_instances, n_dims, series_length = X.shape dists = np.zeros((n_instances, self.n_classes)) for i in range(n_instances): r = [ X[i].reshape((1, n_dims, series_length)), X_p[i].reshape((1, n_dims, X_p.shape[2])), X_d[i].reshape((1, n_dims, X_d.shape[2])), ] dists[i] = self.root.predict_proba_drcif( r, c22, n_intervals, intervals, dims, atts, self.n_classes, ) return dists
def check_is_fitted(self, method_name=None): """Check if `fit` has been called. Parameters ---------- method_name : str Name of the calling method. Raises ------ NotFittedError If forecaster has not been fitted yet. """ super(BaseGridSearch, self).check_is_fitted() # We additionally check if the tuned forecaster has been fitted. if method_name is not None: if not self.refit: raise NotFittedError( "This %s instance was initialized " "with refit=False. %s is " "available only after refitting on the " "best parameters. You can refit an forecaster " "manually using the ``best_params_`` " "attribute" % (type(self).__name__, method_name)) else: self.best_forecaster_.check_is_fitted()
def predict_proba(self, X): """Probability estimates for each class for all cases in X. Parameters ---------- X : The training input samples. array-like or sparse matrix of shape = [n_test_instances,n_attributes] Returns ------- output : array of shape = [n_test_instances, num_classes] of probabilities """ if not self._is_fitted: raise NotFittedError( f"This instance of {self.__class__.__name__} has not " f"been fitted yet; please call `fit` first.") if isinstance(X, np.ndarray) and len(X.shape) == 3 and X.shape[1] == 1: X = np.reshape(X, (X.shape[0], -1)) elif not isinstance(X, np.ndarray) or len(X.shape) > 2: raise ValueError( "ContinuousIntervalTree is not a time series classifier. " "A 2d numpy array is required.") dists = np.zeros((X.shape[0], self.n_classes)) for i in range(X.shape[0]): dists[i] = self.root.predict_proba(X[i], self.n_classes) return dists
def check_is_fitted(self): """Check if the estimator has been fitted. Raises ------ NotFittedError If the estimator has not been fitted yet. """ if not self.is_fitted: raise NotFittedError( f"This instance of {self.__class__.__name__} has not " f"been fitted yet; please call `fit` first.")
def check_is_fitted(self, method_name=None): super(BaseGridSearch, self).check_is_fitted() if method_name is not None: if not self.refit: raise NotFittedError("This %s instance was initialized " "with refit=False. %s is " "available only after refitting on the " "best " "parameters. You can refit an forecaster " "manually using the ``best_params_`` " "attribute" % (type(self).__name__, method_name)) else: self.best_forecaster_.check_is_fitted()
def _get_train_probs(self, X, y): if not self._is_fitted: raise NotFittedError( f"This instance of {self.__class__.__name__} has not " f"been fitted yet; please call `fit` first.") if isinstance(X, np.ndarray) and len(X.shape) == 3 and X.shape[1] == 1: X = np.reshape(X, (X.shape[0], -1)) elif isinstance(X, pd.DataFrame) and len(X.shape) == 2: X = X.to_numpy() elif not isinstance(X, np.ndarray) or len(X.shape) > 2: raise ValueError("RotationForest is not a time series classifier. " "A 2d numpy array is required.") n_instances, n_atts = X.shape if n_instances != self.n_instances or n_atts != self.n_atts: raise ValueError( "n_instances, n_atts mismatch. X should be the same as the training " "data used in fit for generating train probabilities.") if not self.save_transformed_data: raise ValueError( "Currently only works with saved transform data from fit.") p = Parallel(n_jobs=self._n_jobs)( delayed(self._train_probas_for_estimator)( y, i, ) for i in range(self._n_estimators)) y_probas, oobs = zip(*p) results = np.sum(y_probas, axis=0) divisors = np.zeros(n_instances) for oob in oobs: for inst in oob: divisors[inst] += 1 for i in range(n_instances): results[i] = (np.ones(self.n_classes) * (1 / self.n_classes) if divisors[i] == 0 else results[i] / (np.ones(self.n_classes) * divisors[i])) return results
def check_is_fitted(estimator, msg=None): """Perform is_fitted validation for estimator. Adapted from sklearn.utils.validation.check_is_fitted Checks if the estimator is fitted by verifying the presence and positivity of self.is_fitted_ Parameters ---------- msg : string The default error message is, "This %(name)s instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator." For custom messages if "%(name)s" is present in the message string, it is substituted for the estimator name. Eg. : "Estimator, %(name)s, must be fitted before sparsifying". Returns ------- None Raises ------ NotFittedError If the attributes are not found. """ if isclass(estimator): raise TypeError("{} is a class, not an instance.".format(estimator)) if msg is None: msg = ( "This %(name)s instance is not fitted yet. Call 'fit' with " "appropriate arguments before using this estimator." ) if not hasattr(estimator, "fit"): raise TypeError("%s is not an estimator instance." % (estimator)) if not hasattr(estimator, "_is_fitted") or not estimator.is_fitted: raise NotFittedError(msg % {"name": type(estimator).__name__})
def predict_proba(self, X): """Probability estimates for each class for all cases in X. Parameters ---------- X : ndarray of shape = [n_instances,n_attributes] Returns ------- output : array of shape = [n_test_instances, num_classes] of probabilities """ if not self._is_fitted: raise NotFittedError( f"This instance of {self.__class__.__name__} has not " f"been fitted yet; please call `fit` first.") if isinstance(X, np.ndarray) and len(X.shape) == 3 and X.shape[1] == 1: X = np.reshape(X, (X.shape[0], -1)) elif isinstance(X, pd.DataFrame) and len(X.shape) == 2: X = X.to_numpy() elif not isinstance(X, np.ndarray) or len(X.shape) > 2: raise ValueError("RotationForest is not a time series classifier. " "A 2d numpy array is required.") # replace missing values with 0 and remove useless attributes X = np.nan_to_num(X, False, 0, 0, 0) X = X[:, self._useful_atts] # normalise the data. X = (X - self._min) / self._ptp y_probas = Parallel(n_jobs=self._n_jobs)( delayed(self._predict_proba_for_estimator)( X, self.estimators_[i], self._pcas[i], self._groups[i], ) for i in range(self._n_estimators)) output = np.sum( y_probas, axis=0) / (np.ones(self.n_classes) * self._n_estimators) return output
def predict_proba_cif(self, X, c22, intervals, dims, atts): if not self._is_fitted: raise NotFittedError( f"This instance of {self.__class__.__name__} has not " f"been fitted yet; please call `fit` first.") X = check_X(X, coerce_to_numpy=True) n_instances, n_dims, series_length = X.shape dists = np.zeros((n_instances, self.n_classes)) for i in range(n_instances): dists[i] = self.root.predict_proba_cif( X[i].reshape((1, n_dims, series_length)), c22, intervals, dims, atts, self.n_classes, self.class_dictionary, ) return dists