Ejemplo n.º 1
0
def test_predict_value_error(random_X_data):
    """Raise ValueError if X doesn't have expected number of variables."""
    X = create_random_X(random_X_data)
    s = create_s()
    lin_acf = counterfactually_fair_models.LinearACFClassifier()
    lin_acf.fit(X, create_y(), s)
    with pytest.raises(ValueError):
        # pass in just a subset of the input variables
        lin_acf.predict(X[:, 5], s)
        lin_acf.predict_proba(X[:, 5], s)
Ejemplo n.º 2
0
def test_binary_single_class(random_X_data):
    """Linear ACF can handle training data with single-valued column."""
    X = create_random_X(random_X_data)
    X = np.concatenate([X, np.ones((X.shape[0], 1))], axis=1)
    s = create_s()
    y = create_y()
    lin_acf = counterfactually_fair_models.LinearACFClassifier()
    for residual_type in ["pearson", "deviance", "absolute"]:
        lin_acf = counterfactually_fair_models.LinearACFClassifier(
            binary_residual_type=residual_type)
        lin_acf.fit(X, y, s)
        lin_acf_pred_proba = lin_acf.predict_proba(X, s)[:, 1]
        assert (
            lin_acf.fit_residuals_ == lin_acf._compute_residuals_on_predict(
                X, s)).all()
        assert is_binary(lin_acf.predict(X, s))
        assert is_continuous(lin_acf_pred_proba)
        assert max(lin_acf_pred_proba) < 1
        assert min(lin_acf_pred_proba) > 0
Ejemplo n.º 3
0
def test_fit_predict(random_X_data):
    """Test happy path of LinearACFClassifier `fit` and `predict` methods."""
    X = create_random_X(random_X_data)
    y = create_y()
    s = create_s()
    for residual_type in ["pearson", "deviance", "absolute"]:
        lin_acf = counterfactually_fair_models.LinearACFClassifier(
            binary_residual_type=residual_type)
        lin_acf.fit(X, y, s)
        lin_acf_pred_proba = lin_acf.predict_proba(X, s)[:, 1]
        assert (
            lin_acf.fit_residuals_ == lin_acf._compute_residuals_on_predict(
                X, s)).all()
        assert is_binary(lin_acf.predict(X, s))
        assert is_continuous(lin_acf_pred_proba)
        assert max(lin_acf_pred_proba) < 1
        assert min(lin_acf_pred_proba) > 0
Ejemplo n.º 4
0
def test_invalid_binary_residual_type(random_X_data):
    with pytest.raises(ValueError):
        counterfactually_fair_models.LinearACFClassifier(
            binary_residual_type="foobar")
Ejemplo n.º 5
0
def test_fairness_aware_meta_estimator():
    X = create_linear_X()
    y = create_y()
    s = create_s()

    # use sklearn estimator
    lr = FairnessAwareMetaEstimator(LogisticRegression())
    lr.fit(X, y)
    lr.predict(X)
    lr.predict_proba(X)

    # use themis_ml LinearACFClassifier estimator
    linear_acf = FairnessAwareMetaEstimator(
        counterfactually_fair_models.LinearACFClassifier(
            binary_residual_type="absolute"))
    linear_acf.fit(X, y, s)
    linear_acf.predict(X, s)
    linear_acf.predict_proba(X, s)

    # when fit/predict methods need s, raise ValueError
    with pytest.raises(ValueError):
        linear_acf.fit(X, y, s=None)
    with pytest.raises(ValueError):
        linear_acf.predict(X, s=None)
    with pytest.raises(ValueError):
        linear_acf.predict_proba(X, s=None)

    # use themis_ml relabeller preprocessor
    relabel_clf = FairnessAwareMetaEstimator(
        estimator=LogisticRegression(), relabeller=relabelling.Relabeller())
    relabel_clf.fit(X, y, s)
    relabel_clf.predict(X)
    relabel_clf.predict_proba(X)

    # when estimator method does not need `s` on predict, raise ValueError if
    # it is provided
    with pytest.raises(ValueError):
        relabel_clf.predict(X, s)
        relabel_clf.predict_proba(X, s)

    # use themis_ml RejectOption Classifier
    single_reject_option_clf = FairnessAwareMetaEstimator(
        reject_option_classification.SingleROClassifier())
    single_reject_option_clf.fit(X, y)
    single_reject_option_clf.predict(X, s)
    single_reject_option_clf.predict_proba(X, s)

    with pytest.raises(ValueError):
        single_reject_option_clf.fit(X, y, s)
    with pytest.raises(ValueError):
        single_reject_option_clf.predict(X, s=None)
    with pytest.raises(ValueError):
        single_reject_option_clf.predict_proba(X, s=None)

    multi_reject_option_clf = FairnessAwareMetaEstimator(
        reject_option_classification.MultipleROClassifier())
    multi_reject_option_clf.fit(X, y)
    multi_reject_option_clf.predict(X, s)
    multi_reject_option_clf.predict_proba(X, s)

    with pytest.raises(ValueError):
        multi_reject_option_clf.fit(X, y, s)
    with pytest.raises(ValueError):
        multi_reject_option_clf.predict(X, s=None)
    with pytest.raises(ValueError):
        multi_reject_option_clf.predict_proba(X, s=None)