From b38bb96c48d9812a436402d60b6b63de429e2ae0 Mon Sep 17 00:00:00 2001 From: Nikita Kozodoi Date: Tue, 18 Dec 2018 11:27:46 +0100 Subject: [PATCH] Initial commit --- .DS_Store | Bin 0 -> 8196 bytes .Rbuildignore | 2 + .gitattributes | 2 + .gitignore | 1 + DESCRIPTION | 10 ++ NAMESPACE | 9 ++ R/measures.R | 346 ++++++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + data/compas.rda | Bin 0 -> 17635 bytes fairness.Rproj | 16 +++ man/acc_parity.Rd | 27 ++++ man/dem_parity.Rd | 25 ++++ man/dis_impact.Rd | 25 ++++ man/fnr_parity.Rd | 27 ++++ man/fpr_parity.Rd | 27 ++++ man/npv_parity.Rd | 27 ++++ man/ppv_parity.Rd | 27 ++++ 17 files changed, 572 insertions(+) create mode 100644 .DS_Store create mode 100644 .Rbuildignore create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 DESCRIPTION create mode 100644 NAMESPACE create mode 100644 R/measures.R create mode 100644 README.md create mode 100644 data/compas.rda create mode 100644 fairness.Rproj create mode 100644 man/acc_parity.Rd create mode 100644 man/dem_parity.Rd create mode 100644 man/dis_impact.Rd create mode 100644 man/fnr_parity.Rd create mode 100644 man/fpr_parity.Rd create mode 100644 man/npv_parity.Rd create mode 100644 man/ppv_parity.Rd diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..013f32f0af735d2296ff644238326e9eea3b8b11 GIT binary patch literal 8196 zcmeHMPiz!b82`R)DKi75uL#mvfo{5~pcdJ!g`yPP{()MhY12QnrN}b7Gt!aSnYuIE z1xmH*MH7rC{EHV&Obniga57OY#su}CD5&A!!Gm5r8jU7?@4eYZ3O#sH3GS?z2D6A+X4V~mCQ6i0{|#=abzo~x=G=7e%(-F;m9&Vq25w6R`1>J27spJ9^Ag3YgDQ~%5LVN$DAcAr zK*S_M%!D{EQH0VxW%ht!D26Ep%5btLxI1Ac#CeG_98iV>hBITBp`e(Z;u69gFe5Rl zBL*S{Ze)Px?rWeE95@2rb@_W9valBn%H)gSf(1VKrk{6mp6Bpq5Md}+_NQ}>m!saL z+_Yo+K`M0xV^!75YL+XCrfId>%PYC2FYYre4T_?wYL>-kXVW{jwIo_o56rbBX4C1m zww6RXwWED*PF2=5r+4)oE*w8GdvfmSHzf%ezDS@>_800i)Iu0?{F!dKx!9|f&0Vc* zPSsZEeUEDU#_hc44%;WJEUWWrZ++AqELtusR)wJNx5- zbu8em1HM-bx`ktwv662MS>$KWSUu!Tp{x0w2BrhsbN&5R(I-r1QgW&4*_CTIG~In) zYTH8(_gt=BRmbXAYuW)~#SQEyY^yk0w#{H_!tnE!YufISu^HR9bB;CQ8U?F9HlV7P z?_AeVtH<^A71QDng(a2oQqF#=WCzE^92*;T?Vw4k>-S7Pi^QkCt?5Z;c0vgU&lA_ z9Xy90;CZ}&AK}M%5ij9q_%(iq-^+EzDnjj-{Ys73s3nCOK83MEHxp`nZ?D$#p9=Nc zl~SE|tXaD;xp_-#dq?NODK0vvt)-i=k zhAo%giFlJjDq%tvxASe10%s-+c@CR--0ZQ6E~#LKFs^+9c? zLK7$d+=aVIb)DFa`>-DeaFCQYi3jlzX3-$!9Tm!(#^ZPbPvRUY@CAI4^!F0J z94hb(zJ>4N*+qKmt0+w(zAyDQGhB2X&pje~*Skc$TZ(}yx!MMv|LKN WB8^b_*MA6zzW>qpUnuYPuKoga$K;y; literal 0 HcmV?d00001 diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000..fb4cd40 --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,2 @@ +^fairness\.Rproj$ +^\.Rproj\.user$ diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..26e3515 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.Rproj.user \ No newline at end of file diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000..85cced1 --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,10 @@ +Package: fairness +Title: Algorithmic Fairness Measures +Version: 0.0.0.1 +Authors@R: person("Nikita", "Kozodoi", email = "nikita.kozodoi@hu-berlin.de", role = c("aut", "cre")) +Description: This package computes different measures of algorithmic fairness based on a confusion matrix. +Depends: R (>= 3.5.1) +License: What license is it under? +Encoding: UTF-8 +LazyData: true +RoxygenNote: 6.1.1 diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000..d4f043b --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,9 @@ +# Generated by roxygen2: do not edit by hand + +export(acc_parity) +export(dem_parity) +export(dis_impact) +export(fnr_parity) +export(fpr_parity) +export(npv_parity) +export(ppv_parity) diff --git a/R/measures.R b/R/measures.R new file mode 100644 index 0000000..6fa25a0 --- /dev/null +++ b/R/measures.R @@ -0,0 +1,346 @@ +#' Disparate Impact +#' +#' This function computes the Disparate Impact metric (Feldman et al. 2015; Zafar et al. 2017) +#' +#' +#' @param predicted Vector of predicted target values +#' @param group Sensitive group (binary or factor) +#' @param cutoff Cutoff for rounding the probabilities +#' @return DI metric +#' @export +#' @examples +#' df = fairness::compas +#' dis_impact(df$label_value, df$score, df$race, "Caucasian") +dis_impact <- function(predicted, group, cutoff = 0.5, base = NULL) { + + # check lengths + if (length(predicted) != length(group)) { + stop("Predictions and groups must be of the same length") + } + + # convert types + group <- as.factor(group) + predicted <- as.numeric(predicted >= cutoff) + + # relevel group + if (is.null(base)) {base <- levels(group)[1]} + group <- relevel(group, base) + + # placeholder + val <- rep(NA, length(levels(group))) + names(val) <- levels(group) + + # compute value for group 1 + cv1 <- mean(predicted[group == levels(group)[1]]) + + # compute value for other groups + for (i in 1:length(levels(group))) { + val[i] <- mean(predicted[group == levels(group)[i]]) / cv1 + } + + return(val) +} + + + +#' Demographic Parity +#' +#' This function computes the Demographic Parity metric (Calders and Verwer 2010) +#' +#' +#' @param predicted Vector of predicted target values +#' @param group Sensitive group (binary or factor) +#' @param cutoff Cutoff for rounding the probabilities +#' @return DP metric +#' @export +#' @examples +#' df = fairness::compas +#' dem_parity(df$score, df$race, "Caucasian") +dem_parity <- function(predicted, group, cutoff = 0.5, base = NULL) { + + # check lengths + if (length(predicted) != length(group)) { + stop("Predictions and groups must be of the same length") + } + + # convert types + group <- as.factor(group) + predicted <- as.numeric(predicted >= cutoff) + + # relevel group + if (is.null(base)) {base <- levels(group)[1]} + group <- relevel(group, base) + + # placeholder + val <- rep(NA, length(levels(group))) + names(val) <- levels(group) + + # compute value for gorup 1 + cv1 <- mean(predicted[group == levels(group)[1]]) + + # compute value for other groups + for (i in 1:length(levels(group))) { + val[i] <- 1 - (mean(predicted[group == levels(group)[i]]) - cv1) + } + + return(val) +} + + + +#' FPR Parity +#' +#' This function computes the False Positive Rate Parity metric (Chouldechova 2017) +#' +#' +#' @param actuals Vector of actual target values +#' @param predicted Vector of predicted target values +#' @param group Sensitive group (binary or factor) +#' @param cutoff Cutoff for rounding the probabilities +#' @return FPR Parity metric +#' @examples +#' df = fairness::compas +#' fpr_parity(df$label_value, df$score, df$race, "Caucasian") +#' @export +fpr_parity <- function(actuals, predicted, group, cutoff = 0.5, base = NULL) { + + # check lengths + if ((length(actuals) != length(predicted)) | (length(actuals) != length(group))) { + stop("Actuals, predictions and groups must be of the same length") + } + + # convert types + group <- as.factor(group) + actuals <- as.numeric(actuals) + predicted <- as.numeric(predicted >= cutoff) + + # relevel group + if (is.null(base)) {base <- levels(group)[1]} + group <- relevel(group, base) + + # placeholder + val <- rep(NA, length(levels(group))) + names(val) <- levels(group) + + # compute value for group 1 + fpr1 <- sum(actuals == 0 & predicted == 1 & group == levels(group)[1]) / + sum(actuals ==0 & group == levels(group)[1]) + + # compute value for other groups + for (i in 1:length(levels(group))) { + fpr1 <- sum(actuals == 0 & predicted == 1 & group == levels(group)[1]) / + sum(actuals == 0 & group == levels(group)[1]) + fpri <- sum(actuals == 0 & predicted == 1 & group == levels(group)[i]) / + sum(actuals == 0 & group == levels(group)[i]) + val[i] <- fpri / fpr1 + } + + return(val) +} + + + +#' FNR Parity +#' +#' This function computes the False Negative Rate Parity metric (Chouldechova 2017) +#' +#' +#' @param actuals Vector of actual target values +#' @param predicted Vector of predicted target values +#' @param group Sensitive group (binary or factor) +#' @param cutoff Cutoff for rounding the probabilities +#' @return FNR Parity metric +#' @examples +#' df = fairness::compas +#' fnr_parity(df$label_value, df$score, df$race, "Caucasian") +#' @export +fnr_parity <- function(actuals, predicted, group, cutoff = 0.5, base = NULL) { + + # check lengths + if ((length(actuals) != length(predicted)) | (length(actuals) != length(group))) { + stop("Actuals, predictions and groups must be of the same length") + } + + # convert types + group <- as.factor(group) + actuals <- as.numeric(actuals) + predicted <- as.numeric(predicted >= cutoff) + + # relevel group + if (is.null(base)) {base <- levels(group)[1]} + group <- relevel(group, base) + + # placeholder + val <- rep(NA, length(levels(group))) + names(val) <- levels(group) + + # compute value for gorup 1 + fnr1 <- sum(actuals == 1 & predicted == 0 & group == levels(group)[1]) / + sum(actuals == 1 & group == levels(group)[1]) + + # compute value for other groups + for (i in 1:length(levels(group))) { + fnr1 <- sum(actuals == 1 & predicted == 0 & group == levels(group)[1]) / + sum(actuals == 1 & group == levels(group)[1]) + fnri <- sum(actuals == 1 & predicted == 0 & group == levels(group)[i]) / + sum(actuals == 1 & group == levels(group)[i]) + val[i] <- fnri / fnr1 + } + + return(val) +} + + + +#' PPV Parity +#' +#' This function computes the Positive Predicted Value Parity metric (see Aeuquitas bias audit toolkit) +#' +#' +#' @param actuals Vector of actual target values +#' @param predicted Vector of predicted target values +#' @param group Sensitive group (binary or factor) +#' @param cutoff Cutoff for rounding the probabilities +#' @return FNR Parity metric +#' @examples +#' df = fairness::compas +#' ppv_pariy(df$label_value, df$score, df$race, "Caucasian") +#' @export +ppv_parity <- function(actuals, predicted, group, cutoff = 0.5, base = NULL) { + + # check lengths + if ((length(actuals) != length(predicted)) | (length(actuals) != length(group))) { + stop("Actuals, predictions and groups must be of the same length") + } + + # convert types + group <- as.factor(group) + actuals <- as.numeric(actuals) + predicted <- as.numeric(predicted >= cutoff) + + # relevel group + if (is.null(base)) {base <- levels(group)[1]} + group <- relevel(group, base) + + # placeholder + val <- rep(NA, length(levels(group))) + names(val) <- levels(group) + + # compute value for group 1 + ppv1 <- sum(actuals == 1 & predicted == 1 & group == levels(group)[1]) / + sum(predicted == 1 & group == levels(group)[1]) + + # compute value for other groups + for (i in 1:length(levels(group))) { + + ppv1 <- sum(actuals == 1 & predicted == 1 & group == levels(group)[1]) / + sum(predicted == 1 & group == levels(group)[1]) + ppvi <- sum(actuals == 1 & predicted == 1 & group == levels(group)[i]) / + sum(predicted == 1 & group == levels(group)[i]) + val[i] <- ppvi / ppv1 + } + + return(val) +} + + + +#' NPV Parity +#' +#' This function computes the Negative Positive Value Parity metric (see Aeuquitas bias audit toolkit) +#' +#' +#' @param actuals Vector of actual target values +#' @param predicted Vector of predicted target values +#' @param group Sensitive group (binary or factor) +#' @param cutoff Cutoff for rounding the probabilities +#' @return FNR Parity metric +#' @examples +#' df = fairness::compas +#' npv_parity(df$label_value, df$score, df$race, "Caucasian") +#' @export +npv_parity <- function(actuals, predicted, group, cutoff = 0.5, base = NULL) { + + # check lengths + if ((length(actuals) != length(predicted)) | (length(actuals) != length(group))) { + stop("Actuals, predictions and groups must be of the same length") + } + + # convert types + group <- as.factor(group) + actuals <- as.numeric(actuals) + predicted <- as.numeric(predicted >= cutoff) + + # relevel group + if (is.null(base)) {base <- levels(group)[1]} + group <- relevel(group, base) + + # placeholder + val <- rep(NA, length(levels(group))) + names(val) <- levels(group) + + # compute value for group 1 + npv1 <- sum(actuals == 0 & predicted == 0 & group == levels(group)[1]) / + sum(predicted == 0 & group == levels(group)[1]) + + # compute value for other groups + for (i in 1:length(levels(group))) { + npvi <- sum(actuals == 0 & predicted == 0 & group == levels(group)[i]) / + sum(predicted == 0 & group == levels(group)[i]) + val[i] <- npvi / npv1 + } + + return(val) +} + + + +#' Accuracy Parity +#' +#' This function computes the Accuracy Parity metric (Friedler et al. 2018) +#' +#' +#' @param actuals Vector of actual target values +#' @param predicted Vector of predicted target values +#' @param group Sensitive group (binary or factor) +#' @param cutoff Cutoff for rounding the probabilities +#' @return Accuracy Parity metric +#' @examples +#' df = fairness::compas +#' acc_parity(df$label_value, df$score, df$race, "Caucasian") +#' @export +acc_parity <- function(actuals, predicted, group, cutoff = 0.5, base = NULL) { + + # check lengths + if ((length(actuals) != length(predicted)) | (length(actuals) != length(group))) { + stop("Actuals, predictions and groups must be of the same length") + } + + # convert types + group <- as.factor(group) + actuals <- as.numeric(actuals) + predicted <- as.numeric(predicted >= cutoff) + + # relevel group + if (is.null(base)) {base <- levels(group)[1]} + group <- relevel(group, base) + + # placeholder + val <- rep(NA, length(levels(group))) + names(val) <- levels(group) + + # compute value for group 1 + ac1 <- sum(actuals[group == levels(group)[1]] == predicted[group == levels(group)[1]]) / + sum(group == levels(group)[1]) + + # compute value for other groups + for (i in 1:length(levels(group))) { + ac1 <- sum(actuals[group == levels(group)[1]] == predicted[group == levels(group)[1]]) / + sum(group == levels(group)[1]) + aci <- sum(actuals[group == levels(group)[i]] == predicted[group == levels(group)[i]]) / + sum(group == levels(group)[i]) + val[i] <- aci / ac1 + } + + return(val) +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..32e1a2a --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Fairness diff --git a/data/compas.rda b/data/compas.rda new file mode 100644 index 0000000000000000000000000000000000000000..beb92362eb438cd64f4da41b51b3fc1392650bcc GIT binary patch literal 17635 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 literal 0 HcmV?d00001 diff --git a/fairness.Rproj b/fairness.Rproj new file mode 100644 index 0000000..d848a9f --- /dev/null +++ b/fairness.Rproj @@ -0,0 +1,16 @@ +Version: 1.0 + +RestoreWorkspace: No +SaveWorkspace: No +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +Encoding: UTF-8 + +AutoAppendNewline: Yes +StripTrailingWhitespace: Yes + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source +PackageRoxygenize: rd,collate,namespace diff --git a/man/acc_parity.Rd b/man/acc_parity.Rd new file mode 100644 index 0000000..679c191 --- /dev/null +++ b/man/acc_parity.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/measures.R +\name{acc_parity} +\alias{acc_parity} +\title{Accuracy Parity} +\usage{ +acc_parity(actuals, predicted, group, cutoff = 0.5, base = NULL) +} +\arguments{ +\item{actuals}{Vector of actual target values} + +\item{predicted}{Vector of predicted target values} + +\item{group}{Sensitive group (binary or factor)} + +\item{cutoff}{Cutoff for rounding the probabilities} +} +\value{ +Accuracy Parity metric +} +\description{ +This function computes the Accuracy Parity metric (Friedler et al. 2018) +} +\examples{ +df = fairness::compas +acc_parity(df$label_value, df$score, df$race, "Caucasian") +} diff --git a/man/dem_parity.Rd b/man/dem_parity.Rd new file mode 100644 index 0000000..6947e63 --- /dev/null +++ b/man/dem_parity.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/measures.R +\name{dem_parity} +\alias{dem_parity} +\title{Demographic Parity} +\usage{ +dem_parity(predicted, group, cutoff = 0.5, base = NULL) +} +\arguments{ +\item{predicted}{Vector of predicted target values} + +\item{group}{Sensitive group (binary or factor)} + +\item{cutoff}{Cutoff for rounding the probabilities} +} +\value{ +DP metric +} +\description{ +This function computes the Demographic Parity metric (Calders and Verwer 2010) +} +\examples{ +df = fairness::compas +dem_parity(df$score, df$race, "Caucasian") +} diff --git a/man/dis_impact.Rd b/man/dis_impact.Rd new file mode 100644 index 0000000..889c855 --- /dev/null +++ b/man/dis_impact.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/measures.R +\name{dis_impact} +\alias{dis_impact} +\title{Disparate Impact} +\usage{ +dis_impact(predicted, group, cutoff = 0.5, base = NULL) +} +\arguments{ +\item{predicted}{Vector of predicted target values} + +\item{group}{Sensitive group (binary or factor)} + +\item{cutoff}{Cutoff for rounding the probabilities} +} +\value{ +DI metric +} +\description{ +This function computes the Disparate Impact metric (Feldman et al. 2015; Zafar et al. 2017) +} +\examples{ +df = fairness::compas +dis_impact(df$label_value, df$score, df$race, "Caucasian") +} diff --git a/man/fnr_parity.Rd b/man/fnr_parity.Rd new file mode 100644 index 0000000..eded63c --- /dev/null +++ b/man/fnr_parity.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/measures.R +\name{fnr_parity} +\alias{fnr_parity} +\title{FNR Parity} +\usage{ +fnr_parity(actuals, predicted, group, cutoff = 0.5, base = NULL) +} +\arguments{ +\item{actuals}{Vector of actual target values} + +\item{predicted}{Vector of predicted target values} + +\item{group}{Sensitive group (binary or factor)} + +\item{cutoff}{Cutoff for rounding the probabilities} +} +\value{ +FNR Parity metric +} +\description{ +This function computes the False Negative Rate Parity metric (Chouldechova 2017) +} +\examples{ +df = fairness::compas +fnr_parity(df$label_value, df$score, df$race, "Caucasian") +} diff --git a/man/fpr_parity.Rd b/man/fpr_parity.Rd new file mode 100644 index 0000000..a60ca8d --- /dev/null +++ b/man/fpr_parity.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/measures.R +\name{fpr_parity} +\alias{fpr_parity} +\title{FPR Parity} +\usage{ +fpr_parity(actuals, predicted, group, cutoff = 0.5, base = NULL) +} +\arguments{ +\item{actuals}{Vector of actual target values} + +\item{predicted}{Vector of predicted target values} + +\item{group}{Sensitive group (binary or factor)} + +\item{cutoff}{Cutoff for rounding the probabilities} +} +\value{ +FPR Parity metric +} +\description{ +This function computes the False Positive Rate Parity metric (Chouldechova 2017) +} +\examples{ +df = fairness::compas +fpr_parity(df$label_value, df$score, df$race, "Caucasian") +} diff --git a/man/npv_parity.Rd b/man/npv_parity.Rd new file mode 100644 index 0000000..18b6ab7 --- /dev/null +++ b/man/npv_parity.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/measures.R +\name{npv_parity} +\alias{npv_parity} +\title{NPV Parity} +\usage{ +npv_parity(actuals, predicted, group, cutoff = 0.5, base = NULL) +} +\arguments{ +\item{actuals}{Vector of actual target values} + +\item{predicted}{Vector of predicted target values} + +\item{group}{Sensitive group (binary or factor)} + +\item{cutoff}{Cutoff for rounding the probabilities} +} +\value{ +FNR Parity metric +} +\description{ +This function computes the Negative Positive Value Parity metric (see Aeuquitas bias audit toolkit) +} +\examples{ +df = fairness::compas +npv_parity(df$label_value, df$score, df$race, "Caucasian") +} diff --git a/man/ppv_parity.Rd b/man/ppv_parity.Rd new file mode 100644 index 0000000..6dd1a0c --- /dev/null +++ b/man/ppv_parity.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/measures.R +\name{ppv_parity} +\alias{ppv_parity} +\title{PPV Parity} +\usage{ +ppv_parity(actuals, predicted, group, cutoff = 0.5, base = NULL) +} +\arguments{ +\item{actuals}{Vector of actual target values} + +\item{predicted}{Vector of predicted target values} + +\item{group}{Sensitive group (binary or factor)} + +\item{cutoff}{Cutoff for rounding the probabilities} +} +\value{ +FNR Parity metric +} +\description{ +This function computes the Positive Predicted Value Parity metric (see Aeuquitas bias audit toolkit) +} +\examples{ +df = fairness::compas +ppv_pariy(df$label_value, df$score, df$race, "Caucasian") +}