def test_breast_cancer_without_intercept(self): X, y = load_breast_cancer(return_X_y=True) n_classes=2 clf = LogisticRegression(fit_intercept=False, max_iter=10000, random_state=0).fit(X, y) builder = d4p.logistic_regression_model_builder(n_classes=n_classes, n_features=X.shape[1]) builder.set_beta(clf.coef_, clf.intercept_) alg_pred = d4p.logistic_regression_prediction(nClasses=n_classes) pred_daal = alg_pred.compute(X, builder.model).prediction.flatten() pred_sklearn = clf.predict(X) self.assertTrue(np.allclose(pred_daal, pred_sklearn))
def main(): X, y = load_iris(return_X_y=True) n_classes=3 # set parameters and train clf = LogisticRegression(fit_intercept=True, max_iter=1000, random_state=0).fit(X, y) #set parameters and call model builder builder = d4p.logistic_regression_model_builder(n_classes=n_classes, n_features=X.shape[1]) builder.set_beta(clf.coef_, clf.intercept_) # set parameters and compute predictions predict_alg = d4p.logistic_regression_prediction(nClasses=n_classes, resultsToEvaluate="computeClassLabels") # set parameters and compute predictions predict_result_daal = predict_alg.compute(X, builder.model) predict_result_sklearn = clf.predict(X) assert np.allclose(predict_result_daal.prediction.flatten(), predict_result_sklearn) return (builder, predict_result_daal)
def daal4py_predict(self, X, resultsToEvaluate): check_is_fitted(self) X = check_array(X, accept_sparse='csr', dtype=[np.float64, np.float32]) try: fptype = getFPType(X) except ValueError: fptype = None daal_ready = self.multi_class in ["multinomial", "warn"] or \ self.classes_.size == 2 or resultsToEvaluate == 'computeClassLabels' daal_ready = daal_ready and not sparse.issparse(X) and \ not sparse.issparse(self.coef_) and fptype is not None if daal_ready: logging.info("sklearn.linear_model.LogisticRegression." "predict: " + get_patch_message("daal")) n_features = self.coef_.shape[1] if X.shape[1] != n_features: raise ValueError( f'X has {X.shape[1]} features, ' f'but LogisticRegression is expecting {n_features} features as input' ) builder = d4p.logistic_regression_model_builder( X.shape[1], len(self.classes_)) builder.set_beta(self.coef_, self.intercept_) predict = d4p.logistic_regression_prediction( nClasses=len(self.classes_), fptype=fptype, method='defaultDense', resultsToEvaluate=resultsToEvaluate) res = predict.compute(X, builder.model) if resultsToEvaluate == 'computeClassLabels': res = res.prediction if not np.array_equal(self.classes_, np.arange(0, len(self.classes_))) or \ self.classes_.dtype != X.dtype: res = self.classes_.take(np.asarray(res, dtype=np.intp)) elif resultsToEvaluate == 'computeClassProbabilities': res = res.probabilities elif resultsToEvaluate == 'computeClassLogProbabilities': res = res.logProbabilities else: raise ValueError( 'resultsToEvaluate must be in [computeClassLabels, \ computeClassProbabilities, computeClassLogProbabilities]') if res.shape[1] == 1: res = np.ravel(res) return res if resultsToEvaluate == 'computeClassLabels': logging.info("sklearn.linear_model.LogisticRegression." "predict: " + get_patch_message("sklearn")) return LogisticRegression_original.predict(self, X) if resultsToEvaluate == 'computeClassProbabilities': logging.info("sklearn.linear_model.LogisticRegression." "predict_proba: " + get_patch_message("sklearn")) return LogisticRegression_original.predict_proba(self, X) if resultsToEvaluate == 'computeClassLogProbabilities': logging.info("sklearn.linear_model.LogisticRegression." "predict_log_proba: " + get_patch_message("sklearn")) return LogisticRegression_original.predict_log_proba(self, X) raise ValueError('resultsToEvaluate must be in [computeClassLabels, \ computeClassProbabilities, computeClassLogProbabilities]')
def daal4py_predict(self, X, resultsToEvaluate): check_is_fitted(self) if sklearn_check_version('1.0'): self._check_feature_names(X, reset=False) X = check_array(X, accept_sparse='csr', dtype=[np.float64, np.float32]) try: fptype = getFPType(X) except ValueError: fptype = None if resultsToEvaluate == 'computeClassLabels': _function_name = 'predict' elif resultsToEvaluate == 'computeClassProbabilities': _function_name = 'predict_proba' elif resultsToEvaluate == 'computeClassLogProbabilities': _function_name = 'predict_log_proba' else: raise ValueError('resultsToEvaluate must be in [computeClassLabels, \ computeClassProbabilities, computeClassLogProbabilities]') _patching_status = PatchingConditionsChain( f"sklearn.linear_model.LogisticRegression.{_function_name}") _patching_status.and_conditions( [(self.multi_class in ["multinomial", "warn"], f"{self.multi_class} multiclass option is not supported. " "Only 'multinomial' or 'warn' options are supported."), (self.classes_.size == 2, "Number of classes != 2."), (resultsToEvaluate == 'computeClassLabels', "resultsToEvaluate != 'computeClassLabels'.")], conditions_merging=any) _dal_ready = _patching_status.and_conditions([ (not sparse.issparse(X), "X is sparse. Sparse input is not supported."), (not sparse.issparse(self.coef_), "self.coef_ is sparse. Sparse coefficients are not supported."), (fptype is not None, "Unable to get dtype.") ]) _patching_status.write_log() if _dal_ready: n_features = self.coef_.shape[1] if X.shape[1] != n_features: raise ValueError( f'X has {X.shape[1]} features, ' f'but LogisticRegression is expecting {n_features} features as input' ) builder = d4p.logistic_regression_model_builder( X.shape[1], len(self.classes_)) builder.set_beta(self.coef_, self.intercept_) predict = d4p.logistic_regression_prediction( nClasses=len(self.classes_), fptype=fptype, method='defaultDense', resultsToEvaluate=resultsToEvaluate) res = predict.compute(X, builder.model) if resultsToEvaluate == 'computeClassLabels': res = res.prediction if not np.array_equal(self.classes_, np.arange(0, len(self.classes_))) or \ self.classes_.dtype != X.dtype: res = self.classes_.take(np.asarray(res, dtype=np.intp)) elif resultsToEvaluate == 'computeClassProbabilities': res = res.probabilities elif resultsToEvaluate == 'computeClassLogProbabilities': res = res.logProbabilities else: raise ValueError( 'resultsToEvaluate must be in [computeClassLabels, \ computeClassProbabilities, computeClassLogProbabilities]') if res.shape[1] == 1: res = np.ravel(res) return res if resultsToEvaluate == 'computeClassLabels': return LogisticRegression_original.predict(self, X) if resultsToEvaluate == 'computeClassProbabilities': return LogisticRegression_original.predict_proba(self, X) if resultsToEvaluate == 'computeClassLogProbabilities': return LogisticRegression_original.predict_log_proba(self, X)