示例#1
0
    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)
示例#3
0
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)