Share via


ML modellerinin eşitliğini değerlendirmek için Azure Machine Learning'i Fairlearn açık kaynak paketiyle kullanma (önizleme)

ŞUNLAR IÇIN GEÇERLIDIR:Python SDK azureml v1

Bu nasıl yapılır kılavuzunda, aşağıdaki görevleri gerçekleştirmek için Azure Machine Learning ile Fairlearn açık kaynak Python paketini kullanmayı öğreneceksiniz:

  • Model tahminlerinizin eşitliğini değerlendirme. Makine öğrenmesinde eşitlik hakkında daha fazla bilgi edinmek için makine öğrenmesinde eşitlik makalesine bakın.
  • eşitlik değerlendirmesi içgörülerini Azure Machine Learning stüdyosu karşıya yükleyin, listeleyin ve indirin.
  • Modellerinizin eşitlik içgörüleriyle etkileşime geçmek için Azure Machine Learning stüdyosu'de bir eşitlik değerlendirmesi panosuna bakın.

Not

Eşitlik değerlendirmesi tamamen teknik bir alıştırma değildir. Bu paket, bir makine öğrenmesi modelinin eşitliğini değerlendirmenize yardımcı olabilir, ancak modelin performansıyla ilgili olarak yalnızca siz yapılandırabilir ve kararlar alabilirsiniz. Bu paket eşitliği değerlendirmek için nicel ölçümleri tanımlamaya yardımcı olsa da, makine öğrenmesi modellerinin geliştiricilerinin kendi modellerinin eşitliğini değerlendirmek için nitel bir analiz de gerçekleştirmesi gerekir.

Önemli

Bu özellik şu anda genel önizlemededir. Bu önizleme sürümü bir hizmet düzeyi sözleşmesi olmadan sağlanır ve üretim iş yükleri için bunu önermeyiz. Bazı özellikler desteklenmiyor olabileceği gibi özellikleri sınırlandırılmış da olabilir.

Daha fazla bilgi için bkz. Microsoft Azure Önizlemeleri için Ek Kullanım Koşulları.

Azure Machine Learning Eşitlik SDK'sı

Azure Machine Learning Eşitlik SDK'sı, azureml-contrib-fairnessAçık kaynak Python paketi Fairlearn'ı Azure Machine Learning ile tümleştirir. Fairlearn'ın Azure Machine Learning ile tümleştirmesi hakkında daha fazla bilgi edinmek için bu örnek not defterlerine göz atın. Fairlearn hakkında daha fazla bilgi için örnek kılavuza ve örnek not defterlerine bakın.

ve fairlearn paketlerini yüklemek azureml-contrib-fairness için aşağıdaki komutları kullanın:

pip install azureml-contrib-fairness
pip install fairlearn==0.4.6

Fairlearn'in sonraki sürümleri aşağıdaki örnek kodda da çalışmalıdır.

Tek bir model için eşitlik içgörülerini karşıya yükleme

Aşağıdaki örnekte eşitlik paketinin nasıl kullanılacağı gösterilmektedir. Model eşitliği içgörülerini Azure Machine Learning'e yükleyeceğiz ve eşitlik değerlendirmesi panosunu Azure Machine Learning stüdyosu.

  1. Jupyter Notebook'de örnek bir model eğitin.

    Veri kümesi için, OpenML'den aldığımız tanınmış yetişkin sayım veri kümesini kullanırız. Bir kişinin önceki bir krediyi geri ödeyip ödemediğini belirten etiketle ilgili bir kredi kararı sorunumuz varmış gibi davranırız. Daha önce görünmeyen kişilerin krediyi geri ödeyip ödemeyeceğini tahmin etmek için bir model eğiteceğiz. Bu tür bir model, kredi kararları vermek için kullanılabilir.

    import copy
    import numpy as np
    import pandas as pd
    
    from sklearn.compose import ColumnTransformer
    from sklearn.datasets import fetch_openml
    from sklearn.impute import SimpleImputer
    from sklearn.linear_model import LogisticRegression
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler, OneHotEncoder
    from sklearn.compose import make_column_selector as selector
    from sklearn.pipeline import Pipeline
    
    from raiwidgets import FairnessDashboard
    
    # Load the census dataset
    data = fetch_openml(data_id=1590, as_frame=True)
    X_raw = data.data
    y = (data.target == ">50K") * 1
    
    # (Optional) Separate the "sex" and "race" sensitive features out and drop them from the main data prior to training your model
    X_raw = data.data
    y = (data.target == ">50K") * 1
    A = X_raw[["race", "sex"]]
    X = X_raw.drop(labels=['sex', 'race'],axis = 1)
    
    # Split the data in "train" and "test" sets
    (X_train, X_test, y_train, y_test, A_train, A_test) = train_test_split(
        X_raw, y, A, test_size=0.3, random_state=12345, stratify=y
    )
    
    # Ensure indices are aligned between X, y and A,
    # after all the slicing and splitting of DataFrames
    # and Series
    X_train = X_train.reset_index(drop=True)
    X_test = X_test.reset_index(drop=True)
    y_train = y_train.reset_index(drop=True)
    y_test = y_test.reset_index(drop=True)
    A_train = A_train.reset_index(drop=True)
    A_test = A_test.reset_index(drop=True)
    
    # Define a processing pipeline. This happens after the split to avoid data leakage
    numeric_transformer = Pipeline(
        steps=[
            ("impute", SimpleImputer()),
            ("scaler", StandardScaler()),
        ]
    )
    categorical_transformer = Pipeline(
        [
            ("impute", SimpleImputer(strategy="most_frequent")),
            ("ohe", OneHotEncoder(handle_unknown="ignore")),
        ]
    )
    preprocessor = ColumnTransformer(
        transformers=[
            ("num", numeric_transformer, selector(dtype_exclude="category")),
            ("cat", categorical_transformer, selector(dtype_include="category")),
        ]
    )
    
    # Put an estimator onto the end of the pipeline
    lr_predictor = Pipeline(
        steps=[
            ("preprocessor", copy.deepcopy(preprocessor)),
            (
                "classifier",
                LogisticRegression(solver="liblinear", fit_intercept=True),
            ),
        ]
    )
    
    # Train the model on the test data
    lr_predictor.fit(X_train, y_train)
    
    # (Optional) View this model in the fairness dashboard, and see the disparities which appear:
    from raiwidgets import FairnessDashboard
    FairnessDashboard(sensitive_features=A_test,
                      y_true=y_test,
                      y_pred={"lr_model": lr_predictor.predict(X_test)})
    
  2. Azure Machine Learning'de oturum açın ve modelinizi kaydedin.

    Eşitlik panosu kayıtlı veya kayıtlı olmayan modellerle tümleşebilir. Aşağıdaki adımlarla modelinizi Azure Machine Learning'e kaydedin:

    from azureml.core import Workspace, Experiment, Model
    import joblib
    import os
    
    ws = Workspace.from_config()
    ws.get_details()
    
    os.makedirs('models', exist_ok=True)
    
    # Function to register models into Azure Machine Learning
    def register_model(name, model):
        print("Registering ", name)
        model_path = "models/{0}.pkl".format(name)
        joblib.dump(value=model, filename=model_path)
        registered_model = Model.register(model_path=model_path,
                                        model_name=name,
                                        workspace=ws)
        print("Registered ", registered_model.id)
        return registered_model.id
    
    # Call the register_model function 
    lr_reg_id = register_model("fairness_logistic_regression", lr_predictor)
    
  3. Eşitlik ölçümlerini önceden derleme.

    Fairlearn'ın metrics paketini kullanarak bir pano sözlüğü oluşturun. Yöntemin _create_group_metric_set Pano oluşturucusunun benzeri bağımsız değişkenleri vardır, ancak hassas özellikler sözlük olarak geçirilir (adların kullanılabilir olduğundan emin olmak için). Bu yöntemi çağırırken tahmin türünü (bu örnekte ikili sınıflandırma) da belirtmeliyiz.

    #  Create a dictionary of model(s) you want to assess for fairness 
    sf = { 'Race': A_test.race, 'Sex': A_test.sex}
    ys_pred = { lr_reg_id:lr_predictor.predict(X_test) }
    from fairlearn.metrics._group_metric_set import _create_group_metric_set
    
    dash_dict = _create_group_metric_set(y_true=y_test,
                                        predictions=ys_pred,
                                        sensitive_features=sf,
                                        prediction_type='binary_classification')
    
  4. Önceden hesaplanmış eşitlik ölçümlerini karşıya yükleyin.

    Şimdi karşıya yüklemeyi gerçekleştirmek için paketi içeri aktarın azureml.contrib.fairness :

    from azureml.contrib.fairness import upload_dashboard_dictionary, download_dashboard_by_upload_id
    

    Bir Deneme oluşturun, ardından Bir Çalıştır oluşturun ve panoyu bu panoya yükleyin:

    exp = Experiment(ws, "Test_Fairness_Census_Demo")
    print(exp)
    
    run = exp.start_logging()
    
    # Upload the dashboard to Azure Machine Learning
    try:
        dashboard_title = "Fairness insights of Logistic Regression Classifier"
        # Set validate_model_ids parameter of upload_dashboard_dictionary to False if you have not registered your model(s)
        upload_id = upload_dashboard_dictionary(run,
                                                dash_dict,
                                                dashboard_name=dashboard_title)
        print("\nUploaded to id: {0}\n".format(upload_id))
    
        # To test the dashboard, you can download it back and ensure it contains the right information
        downloaded_dict = download_dashboard_by_upload_id(run, upload_id)
    finally:
        run.complete()
    
  5. Azure Machine Learning stüdyosu eşitlik panosunu denetleyin

    Önceki adımları tamamlarsanız (oluşturulan eşitlik içgörülerini Azure Machine Learning'e yüklerseniz) eşitlik panosunu Azure Machine Learning stüdyosu görüntüleyebilirsiniz. Bu pano, Fairlearn'da sağlanan görselleştirme panosuyla aynıdır ve hassas özelliğinizin alt grupları (örn. erkek ve kadın) arasındaki eşitsizlikleri analiz etmenizi sağlar. Azure Machine Learning stüdyosu görselleştirme panosuna erişmek için şu yollardan birini izleyin:

    • İşler bölmesi (Önizleme)
    1. Azure Machine Learning'de çalıştırdığınız denemelerin listesini görmek için sol bölmede İşler'i seçin.
    2. Belirli bir denemeyi seçerek bu denemedeki tüm çalıştırmaları görüntüleyin.
    3. Bir çalıştırma seçin ve ardından Fairness sekmesinde açıklama görselleştirme panosuna gidin.
    4. Eşitlik sekmesine girdikten sonra sağ taraftaki menüden bir eşitlik kimliğine tıklayın.
    5. Eşitlik değerlendirmesi sayfasına inmek için hassas özniteliğinizi, performans ölçümünüzü ve ilgilendiğiniz eşitlik ölçümünü seçerek panonuzu yapılandırın.
    6. Hem ayırma zararlarını hem de hizmet zararlarının kalitesini gözlemlemek için grafik türünü bir birinden diğerine geçirin.

    Eşitlik Panosu Ayırma

    Eşitlik Panosu Hizmet Kalitesi

    • Modeller bölmesi
    1. Önceki adımları izleyerek özgün modelinizi kaydettiyseniz sol bölmedeki Modeller'i seçerek görüntüleyebilirsiniz.
    2. Açıklama görselleştirme panosunu görüntülemek için bir model seçin ve ardından Eşitlik sekmesi.

    Görselleştirme panosu ve ne içerdiği hakkında daha fazla bilgi edinmek için Fairlearn'ın kullanım kılavuzuna bakın.

Birden çok model için eşitlik içgörülerini karşıya yükleme

Birden çok modeli karşılaştırmak ve eşitlik değerlendirmelerinin nasıl farklılık gösterdiğini görmek için görselleştirme panosuna birden fazla model geçirebilir ve bunların performans eşitliği dengelerini karşılaştırabilirsiniz.

  1. Modellerinizi eğitin:

    Artık Destek Vektör Makinesi tahmin aracını temel alan ikinci bir sınıflandırıcı oluşturuyoruz ve Fairlearn'ın metrics paketini kullanarak bir eşitlik panosu sözlüğü yüklüyoruz. Daha önce eğitilen modelin hala kullanılabilir olduğunu varsayıyoruz.

    # Put an SVM predictor onto the preprocessing pipeline
    from sklearn import svm
    svm_predictor = Pipeline(
        steps=[
            ("preprocessor", copy.deepcopy(preprocessor)),
            (
                "classifier",
                svm.SVC(),
            ),
        ]
    )
    
    # Train your second classification model
    svm_predictor.fit(X_train, y_train)
    
  2. Modellerinizi kaydetme

    Ardından her iki modeli de Azure Machine Learning'e kaydedin. Kolaylık sağlamak için, sonuçları kayıtlı modelin (biçimindeki bir dize) tahmin oluşturucunun kendisiyle eşleyen id bir sözlükte name:version depolayın:

    model_dict = {}
    
    lr_reg_id = register_model("fairness_logistic_regression", lr_predictor)
    model_dict[lr_reg_id] = lr_predictor
    
    svm_reg_id = register_model("fairness_svm", svm_predictor)
    model_dict[svm_reg_id] = svm_predictor
    
  3. Fairness panosunu yerel olarak yükleme

    Eşitlik içgörülerini Azure Machine Learning'e yüklemeden önce bu tahminleri yerel olarak çağrılan bir Eşitlik panosunda inceleyebilirsiniz.

    #  Generate models' predictions and load the fairness dashboard locally 
    ys_pred = {}
    for n, p in model_dict.items():
        ys_pred[n] = p.predict(X_test)
    
    from raiwidgets import FairnessDashboard
    
    FairnessDashboard(sensitive_features=A_test,
                      y_true=y_test.tolist(),
                      y_pred=ys_pred)
    
  4. Eşitlik ölçümlerini önceden derleme.

    Fairlearn'ın metrics paketini kullanarak bir pano sözlüğü oluşturun.

    sf = { 'Race': A_test.race, 'Sex': A_test.sex }
    
    from fairlearn.metrics._group_metric_set import _create_group_metric_set
    
    dash_dict = _create_group_metric_set(y_true=Y_test,
                                        predictions=ys_pred,
                                        sensitive_features=sf,
                                        prediction_type='binary_classification')
    
  5. Önceden hesaplanmış eşitlik ölçümlerini karşıya yükleyin.

    Şimdi karşıya yüklemeyi gerçekleştirmek için paketi içeri aktarın azureml.contrib.fairness :

    from azureml.contrib.fairness import upload_dashboard_dictionary, download_dashboard_by_upload_id
    

    Bir Deneme oluşturun, ardından Bir Çalıştır oluşturun ve panoyu bu panoya yükleyin:

    exp = Experiment(ws, "Compare_Two_Models_Fairness_Census_Demo")
    print(exp)
    
    run = exp.start_logging()
    
    # Upload the dashboard to Azure Machine Learning
    try:
        dashboard_title = "Fairness Assessment of Logistic Regression and SVM Classifiers"
        # Set validate_model_ids parameter of upload_dashboard_dictionary to False if you have not registered your model(s)
        upload_id = upload_dashboard_dictionary(run,
                                                dash_dict,
                                                dashboard_name=dashboard_title)
        print("\nUploaded to id: {0}\n".format(upload_id))
    
        # To test the dashboard, you can download it back and ensure it contains the right information
        downloaded_dict = download_dashboard_by_upload_id(run, upload_id)
    finally:
        run.complete()
    

    Önceki bölüme benzer şekilde, görselleştirme panosuna erişmek ve iki modeli eşitlik ve performans açısından karşılaştırmak için Azure Machine Learning stüdyosu'da yukarıda açıklanan yollardan birini (Denemeler veya Modeller aracılığıyla) izleyebilirsiniz.

Aralıksız ve azaltılmış eşitlik içgörülerini karşıya yükleme

Fairlearn'ın risk azaltma algoritmalarını kullanabilir, oluşturulan azaltılmış modellerini özgün aralıksız modelle karşılaştırabilir ve karşılaştırılan modeller arasında performans/eşitlik dengelerinde gezinebilirsiniz.

Kılavuz Arama azaltma algoritmasının kullanımını gösteren bir örnek görmek için (farklı eşitlik ve performans dengelemelerine sahip azaltılmış modellerden oluşan bir koleksiyon oluşturur) bu örnek not defterine göz atın.

Tek bir Çalıştırmada birden çok modelin eşitlik içgörülerini karşıya yüklemek, modellerin eşitlik ve performans açısından karşılaştırılmasını sağlar. Belirli bir modelin ayrıntılı eşitlik içgörülerini görmek için model karşılaştırma grafiğinde görüntülenen modellerden herhangi birine tıklayabilirsiniz.

Model Karşılaştırma Eşitlik Panosu

Sonraki adımlar

Model eşitliği hakkında daha fazla bilgi edinin

Azure Machine Learning Eşitlik örnek not defterlerine göz atın