FairUP / src /aif360 /aif360-r /R /classification_metric.R
erasmopurif's picture
First commit
d2a8669
#' Classification Metric
#' @description
#' Class for computing metrics based on two BinaryLabelDatasets. The first dataset is the original one and the second is the output of the classification transformer (or similar)
#' @param dataset (BinaryLabelDataset) Dataset containing ground-truth labels
#' @param classified_dataset (BinaryLabelDataset) Dataset containing predictions
#' @param privileged_groups Privileged groups. List containing privileged protected attribute name and value of the privileged protected attribute.
#' @param unprivileged_groups Unprivileged groups. List containing unprivileged protected attribute name and value of the unprivileged protected attribute.
#' @usage
#' classification_metric(dataset, classified_dataset, unprivileged_groups, privileged_groups)
#' @examples
#' \dontrun{
#' load_aif360_lib()
#' # Input dataset
#' data <- data.frame("feat" = c(0,0,1,1,1,1,0,1,1,0), "label" = c(1,0,0,1,0,0,1,0,1,1))
#' # Create aif compatible input dataset
#' act <- aif360::binary_label_dataset(data_path = data, favor_label=0, unfavor_label=1,
#' unprivileged_protected_attribute=0,
#' privileged_protected_attribute=1,
#' target_column="label", protected_attribute="feat")
#' # Classified dataset
#' pred_data <- data.frame("feat" = c(0,0,1,1,1,1,0,1,1,0), "label" = c(1,0,1,1,1,0,1,0,0,1))
#' # Create aif compatible classified dataset
#' pred <- aif360::binary_label_dataset(data_path = pred_data, favor_label=0, unfavor_label=1,
#' unprivileged_protected_attribute=0,
#' privileged_protected_attribute=1,
#' target_column="label", protected_attribute="feat")
#' # Create an instance of classification metric
#' cm <- classification_metric(act, pred, list('feat', 1), list('feat', 0))
#' # Access metric functions
#' cm$accuracy()
#' }
#' @seealso
#' \href{https://aif360.readthedocs.io/en/latest/modules/metrics.html#classification-metric}{Explore available classification metrics explanations here}
#'
#' Available metrics:
#' \itemize{
#' \item accuracy
#' \item average_abs_odds_difference
#' \item average_odds_difference
#' \item between_all_groups_coefficient_of_variation
#' \item between_all_groups_generalized_entropy_index
#' \item between_all_groups_theil_index
#' \item between_group_coefficient_of_variation
#' \item between_group_generalized_entropy_index
#' \item between_group_theil_index
#' \item binary_confusion_matrix
#' \item coefficient_of_variation
#' \item disparate_impact
#' \item equal_opportunity_difference
#' \item error_rate
#' \item error_rate_difference
#' \item error_rate_ratio
#' \item false_discovery_rate
#' \item false_discovery_rate_difference
#' \item false_discovery_rate_ratio
#' \item false_negative_rate
#' \item false_negative_rate_difference
#' \item false_negative_rate_ratio
#' \item false_omission_rate
#' \item false_omission_rate_difference
#' \item false_omission_rate_ratio
#' \item false_positive_rate
#' \item false_positive_rate_difference
#' \item false_positive_rate_ratio
#' \item generalized_binary_confusion_matrix
#' \item generalized_entropy_index
#' \item generalized_false_negative_rate
#' \item generalized_false_positive_rate
#' \item generalized_true_negative_rate
#' \item generalized_true_positive_rate
#' \item negative_predictive_value
#' \item num_false_negatives
#' \item num_false_positives
#' \item num_generalized_false_negatives
#' \item num_generalized_false_positives
#' \item num_generalized_true_negatives
#' \item num_generalized_true_positives
#' \item num_pred_negatives
#' \item num_pred_positives
#' \item num_true_negatives
#' \item num_true_positives
#' \item performance_measures
#' \item positive_predictive_value
#' \item power
#' \item precision
#' \item recall
#' \item selection_rate
#' \item sensitivity
#' \item specificity
#' \item statistical_parity_difference
#' \item theil_index
#' \item true_negative_rate
#' \item true_positive_rate
#' \item true_positive_rate_difference
#'
#' }
#' @export
#' @importFrom reticulate py_suppress_warnings
#'
classification_metric <- function(dataset,
classified_dataset,
unprivileged_groups,
privileged_groups){
u_dict <- dict_fn(unprivileged_groups)
p_dict <- dict_fn(privileged_groups)
return(metrics$ClassificationMetric(dataset,
classified_dataset,
unprivileged_groups = u_dict,
privileged_groups = p_dict))
}