Auditing Model Bias with Balanced Datasets with Mimesis Mimesis, an open-source data generation library, can be used to create balanced, counterfactual datasets for auditing bias in machine learning models. A hands-on guide demonstrates training a loan approval classifier on intentionally biased data, then using Mimesis to generate test subjects with identical financial profiles but different genders to reveal discriminatory outcomes. This approach allows developers to detect whether a model unfairly discriminates against protected groups without exposing sensitive real-world data. Auditing Model Bias with Balanced Datasets with Mimesis Learn how to use Mimesis library to generate a balanced, counterfactual dataset that helps analyze potential bias in your models. Introduction Whether they are well-established classifiers or state-of-the-art massive models like large language models LLMs , building machine learning solutions often entails a risk: algorithms might silently adopt prejudices inherent in the historical training dataset they were trained on. But in a high-stakes scenario or one where data is sensitive, how can we audit whether a model is biased without compromising real-world information? This hands-on article guides you in training a simple classification model for "loan approval" on biased data. Based on this, we will use Mimesis , an open-source library that can help generate a perfectly balanced, counterfactual dataset. You'll be able to test "fake" users with identical financial backgrounds but different demographic characteristics, thereby determining whether the model discriminates against certain groups or not. Step-by-Step Guide Start by installing the Mimesis library if you are new to using it, or you are working on a cloud notebook environment like Colab: pip install mimesis Before auditing a model, we actually need to get one In this example, we will synthetically generate a dataset of 1,000 bank customers, with just two features: gender and income. These features are categorical and numerical, respectively. The data creation will be intentionally manipulated so that the gender attribute unfairly influences the binary outcome: loan approval. Specifically, for labeling the dataset, we will consider a scenario in which men are generally approved, whereas women are only approved when they have remarkably high income. The process to create this clearly biased dataset and train a decision tree classifier on it is shown below: python import pandas as pd import numpy as np from sklearn.tree import DecisionTreeClassifier 1. Simulating biased historical data 1000 instances np.random.seed 42 n train = 1000 genders = np.random.choice 'Male', 'Female' , n train incomes = np.random.randint 30000, 120000, n train approvals = for gender, income in zip genders, incomes : if gender == 'Male': Historically, males are approved approvals.append 1 else: Only females with high income are approved approvals.append 1 if income 80000 else 0 train df = pd.DataFrame {'Gender': genders, 'Income': incomes, 'Approved': approvals} Converting categories to numbers for the machine learning model train df 'Gender Code' = train df 'Gender' .map {'Male': 1, 'Female': 0} 2. Training a Decision Tree classifier model = DecisionTreeClassifier max depth=3 model.fit train df 'Gender Code', 'Income' , train df 'Approved' The next step shows Mimesis in action. We will use this library to generate a small set of test subjects using the Generic class. This will be done by defining three base financial profiles that contain random UUIDs universally unique identifiers and a moderate income ranging between 40K and 70K. Notice that these profiles will not have gender information incorporated yet: python from mimesis import Generic generic = Generic 'en' Generating 3 base financial profiles base profiles = for in range 3 : profile = { 'Applicant ID': generic.cryptographic.uuid , 'Income': generic.random.randint 40000, 70000 Moderate income } base profiles.append profile For example, the three newly created profiles may look something like: {'Applicant ID': '1f1721e1-19af-4bd1-8488-6abf01404ef9', 'Income': 44815}, {'Applicant ID': '5c862597-7f55-43f4-9d6e-ac9cc0b9083e', 'Income': 47436}, {'Applicant ID': '3479d4cf-0d9b-4f06-9c43-1c3b7e787830', 'Income': 58194} Let's finish building our counterfactual set of examples, which constitutes the core of our auditing process For each of the three base profiles, we will create two cloned counterfactual instances: one being male and the other being female. For each pair of test customers, their application ID and income will be totally identical, so the only difference will be the gender: any difference in how our trained decision tree model treats them will undoubtedly be proof of gender bias. counterfactual data = for profile in base profiles: Version A: Male Counterfactual counterfactual data.append { 'Applicant ID': profile 'Applicant ID' , 'Gender': 'Male', 'Gender Code': 1, 'Income': profile 'Income' } Version B: Female Counterfactual counterfactual data.append { 'Applicant ID': profile 'Applicant ID' , 'Gender': 'Female', 'Gender Code': 0, 'Income': profile 'Income' } audit df = pd.DataFrame counterfactual data This is what the three pairs of customers may look like: 1f1721e1-19af-4bd1-8488-6abf01404ef9 Male 1 44815 1 1f1721e1-19af-4bd1-8488-6abf01404ef9 Female 0 44815 2 5c862597-7f55-43f4-9d6e-ac9cc0b9083e Male 1 47436 3 5c862597-7f55-43f4-9d6e-ac9cc0b9083e Female 0 47436 4 3479d4cf-0d9b-4f06-9c43-1c3b7e787830 Male 1 58194 5 3479d4cf-0d9b-4f06-9c43-1c3b7e787830 Female 0 58194 A key point to insist on here: we have just used Mimesis to instantly build perfectly matched "clones" of loan applicants with identical income but different genders. This underlines the library's value in providing total statistical control, isolating a protected attribute. Now it's time to probe the model and see what it reveals. Asking the model to predict approval for our counterfactuals audit df 'Predicted Approval' = model.predict audit df 'Gender Code', 'Income' Formatting the output for readability 1 = Approved, 0 = Denied audit df 'Predicted Approval' = audit df 'Predicted Approval' .map {1: 'Approved', 0: 'Denied'} print "\n--- Model Audit Results ---" print audit df 'Applicant ID', 'Gender', 'Income', 'Predicted Approval' .sort values 'Applicant ID' The decision-making results yielded by our model could not be clearer: --- Model Audit Results --- Applicant ID Gender Income Predicted Approval 0 1f1721e1-19af-4bd1-8488-6abf01404ef9 Male 44815 Approved 1 1f1721e1-19af-4bd1-8488-6abf01404ef9 Female 44815 Denied 4 3479d4cf-0d9b-4f06-9c43-1c3b7e787830 Male 58194 Approved 5 3479d4cf-0d9b-4f06-9c43-1c3b7e787830 Female 58194 Denied 2 5c862597-7f55-43f4-9d6e-ac9cc0b9083e Male 47436 Approved 3 5c862597-7f55-43f4-9d6e-ac9cc0b9083e Female 47436 Denied Notice that for the exact same Applicant ID and Income , male clones are approved for the loan. Meanwhile, female clones with such moderate income are generally denied. The Mimesis functionalities we used based on profiles helped us hold all other variables constant, thereby successfully isolating and exposing the model's discriminatory decision-making. Wrapping Up Throughout this hands-on article, we have shown how Mimesis can be used to generate balanced, counterfactual data examples — without privacy or sensitive data constraints — that can help audit a model's behavior and identify whether the model is behaving in a biased manner or not. Next steps to take if your model is biased may include: - Augmenting your training data with more balanced profiles to correct historical skewness or bias. - Depending on the model type, using model re-weighting strategies. - Utilizing open-source toolkits for fairness — for instance, — which are helpful for bias mitigation in machine learning pipelines. AI Fairness 360 https://ai-fairness-360.org/ is a leader, writer, speaker, and adviser in AI, machine learning, deep learning & LLMs. He trains and guides others in harnessing AI in the real world. Iván Palomares Carrascosa https://www.linkedin.com/in/ivanpc/