def inverse_transform_contributions(contributions, preprocessing=None, agg_columns='sum'): """ Reverse contribution giving a preprocessing. Preprocessing could be : - a single category_encoders - a single ColumnTransformer - list with multiple category_encoders with optional (dict, list of dict) - list with a single ColumnTransformer with optional (dict, list of dict) - dict - list of dict Parameters ---------- contributions : pandas.DataFrame Contributions values. preprocessing : category_encoders, ColumnTransformer, list, dict, optional (default: None) The processing apply to the original data. agg_columns : str (default: 'sum') Type of aggregation performed. For Shap we want so sum contributions of one hot encoded variables. For ACV we want to take any value as ACV computes contributions of coalition of variables (like one hot encoded variables) differently from Shap and then give the same value to each variable of the coalition. As a result we just need to take the value of one of these variables to get the contribution value of the group. Returns ------- pandas.Dataframe Return the aggregate contributions. """ if not isinstance(contributions, pd.DataFrame): raise Exception('Shap values must be a pandas dataframe.') if preprocessing is None: return contributions else: #Transform preprocessing into a list list_encoding = preprocessing_tolist(preprocessing) # check supported inverse use_ct, use_ce = check_transformers(list_encoding) # Apply Inverse Transform x_contrib_invers = contributions.copy() if use_ct: for encoding in list_encoding: x_contrib_invers = calc_inv_contrib_ct(x_contrib_invers, encoding, agg_columns) else: for encoding in list_encoding: x_contrib_invers = calc_inv_contrib_ce(x_contrib_invers, encoding, agg_columns) return x_contrib_invers
def check_preprocessing(preprocessing=None): """ Check that all transformation of the preprocessing are supported. Parameters ---------- preprocessing: category_encoders, ColumnTransformer, list, dict, optional (default: None) The processing apply to the original data """ if preprocessing is not None: list_preprocessing = preprocessing_tolist(preprocessing) use_ct, use_ce = check_transformers(list_preprocessing) return use_ct, use_ce
def inverse_transform_contributions(contributions, preprocessing=None): """ Reverse contribution giving a preprocessing. Preprocessing could be : - a single category_encoders - a single ColumnTransformer - list with multiple category_encoders with optional (dict, list of dict) - list with a single ColumnTransformer with optional (dict, list of dict) - dict - list of dict Parameters ---------- contributions : pandas.DataFrame Contributions values. preprocessing : category_encoders, ColumnTransformer, list, dict, optional (default: None) The processing apply to the original data. Returns ------- pandas.Dataframe Return the aggregate contributions. """ if not isinstance(contributions, pd.DataFrame): raise Exception('Shap values must be a pandas dataframe.') if preprocessing is None: return contributions else: #Transform preprocessing into a list list_encoding = preprocessing_tolist(preprocessing) # check supported inverse use_ct, use_ce = check_transformers(list_encoding) # Apply Inverse Transform x_contrib_invers = contributions.copy() if use_ct: for encoding in list_encoding: x_contrib_invers = calc_inv_contrib_ct(x_contrib_invers, encoding) else: for encoding in list_encoding: x_contrib_invers = calc_inv_contrib_ce(x_contrib_invers, encoding) return x_contrib_invers