Spaces:
Runtime error
Runtime error
| # Copyright 2019 Seth V. Neel, Michael J. Kearns, Aaron L. Roth, Zhiwei Steven Wu | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may not | |
| # use this file except in compliance with the License. You may obtain a copy of | |
| # the License at http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software distributed | |
| # under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | |
| # CONDITIONS OF ANY KIND, either express or implied. See the License for the | |
| # specific language governing permissions and limitations under the License. | |
| import numpy as np | |
| import copy | |
| from aif360.algorithms.inprocessing.gerryfair.reg_oracle_class import RegOracle | |
| class Learner: | |
| """Class implementing the Learner in the FairFictPlay algorithm for rich subgroup fairness in [KRNW18]. | |
| """ | |
| def __init__(self, X, y, predictor): | |
| """Constructor the class | |
| :param X: pandas dataframe of attributes | |
| :param y: tuple of predictions | |
| :param predictor: regressor with sklearn api (e.g. fit(), predict() methods). ex: LinearRegression() | |
| """ | |
| self.X = X | |
| self.y = y | |
| self.predictor = predictor | |
| def best_response(self, costs_0, costs_1): | |
| """Return a RegOracle solving a CSC problem. | |
| Args: | |
| :param costs_0: costs for labeling points 0 in the CSC problem of the learner | |
| :param costs_1: costs for labeling points 1 in the CSC problem of the learner | |
| Returns: | |
| :return: object of class RegOracle solving the CSC problem | |
| """ | |
| reg0 = copy.deepcopy(self.predictor) | |
| reg0.fit(self.X, costs_0) | |
| reg1 = copy.deepcopy(self.predictor) | |
| reg1.fit(self.X, costs_1) | |
| func = RegOracle(reg0, reg1) | |
| return func | |
| def generate_predictions(self, q, predictions, iteration): | |
| """Return the classifications of the average classifier at time iter. | |
| Args: | |
| :param q: the most recent classifier found | |
| :param predictions: the previous set of decisions (probabilities) up to time iter - 1 | |
| :param iteration: the number of the current iteration | |
| Returns: | |
| :return error: the error of the average classifier found thus far (incorporating q) | |
| """ | |
| new_predictions = np.multiply(1.0 / iteration, q.predict(self.X)) | |
| ds = np.multiply((iteration - 1.0)/iteration, predictions) | |
| ds += new_predictions | |
| error = np.mean( | |
| [np.abs(ds[k] - self.y[k]) for k in range(len(self.y))]) | |
| ds = tuple(ds) | |
| return error, ds | |