В быстро развивающейся области машинного обучения (МО) первостепенное значение имеет обеспечение надежности, справедливости и устойчивости моделей. В условиях растущей сложности моделей машинного обучения и огромного количества реальных приложений важно иметь эффективные методы оценки, которые помогают определить сильные и слабые стороны перед развертыванием этих моделей. В частности, автономные методы оценки предоставляют ценные средства оценки производительности модели, не полагаясь на взаимодействие в реальном времени или обратную связь с пользователем. В этой статье мы рассмотрим различные методы автономной оценки, углубимся в ключевые концепции, математические рассуждения и лучшие практики, которые помогут вам оценить производительность ваших моделей.

Мы начнем с изучения важности тестов возмущения, тестов инвариантности и тестов ожидания направления для обеспечения стабильности и предсказуемости модели. (Раздел I)

Далее мы обсудим калибровку модели и измерение достоверности как важнейшие компоненты точной и надежной модели машинного обучения. (Раздел II)

Наконец, мы рассмотрим оценку на основе срезов как мощный инструмент для выявления потенциальных систематических ошибок и проблем с производительностью в различных подмножествах данных. (Раздел III)

Понимая и применяя эти методы автономной оценки, вы будете лучше подготовлены к созданию и развертыванию моделей машинного обучения, которые обеспечивают согласованные, надежные и справедливые результаты в различных реальных сценариях.

Раздел 1. Измерение стабильности и предсказуемости модели

I. Тесты возмущения:

Тесты возмущений — ценный метод оценки надежности и чувствительности модели машинного обучения к изменениям входных данных. Добавляя шум к входным данным и наблюдая за его влиянием на производительность модели, мы можем понять, насколько хорошо модель может справляться с реальными ситуациями, когда данные часто зашумлены и несовершенны.

Пример из реальной жизни: представьте, что вы создали модель машинного обучения для анализа настроений по отзывам клиентов. Вы хотите проверить устойчивость модели к зашумленным входным данным, таким как орфографические или грамматические ошибки. Тесты возмущения могут помочь вам достичь этого, имитируя наличие шума во входных данных.

Пример :

import random
import numpy as np

def add_noise(text, noise_level=0.1):
    characters = list(text)
    num_noise_chars = int(noise_level * len(characters))
    for _ in range(num_noise_chars):
        idx = random.randint(0, len(characters) - 1)
        characters[idx] = chr(random.randint(ord('a'), ord('z')))
    return ''.join(characters)

def perturbation_test(model, test_data, noise_levels=[0.05, 0.1, 0.15]):
    for noise_level in noise_levels:
        noisy_data = [(add_noise(text, noise_level), label) for text, label in test_data]
        X_test, y_test = zip(*noisy_data)
        test_accuracy = model.score(X_test, y_test)
        print(f"Noise level {noise_level * 100}%: Test accuracy {test_accuracy:.2f}")

Этот код демонстрирует, как генерировать зашумленные текстовые данные путем внесения случайных изменений символов на основе заданного уровня шума. Затем функция perturbation_test оценивает производительность модели на зашумленных данных и сообщает о точности теста для каждого уровня шума. Сравнивая производительность при разных уровнях шума, вы можете определить надежность вашей модели при обработке различных уровней шума во входных данных.

II. Тесты на инвариантность:

Тесты на инвариантность предназначены для оценки того, являются ли выходные данные модели предвзятыми на основе конфиденциальной информации, такой как пол или этническая принадлежность. Создавая наборы данных с измененной конфиденциальной информацией, мы можем проверить, остается ли производительность модели неизменной, указывая на то, что она не полагается на конфиденциальные функции для своих прогнозов.

Пример из реальной жизни: представьте, что вы построили модель для прогнозирования успеха кандидатов на работу. Вы хотите убедиться, что модель не проявляет предвзятости в зависимости от пола заявителя. Тесты на инвариантность могут помочь вам убедиться, что ваша модель справедлива и беспристрастна в своих предсказаниях.

Пример :

import pandas as pd

def gender_invariance_test(model, test_data):
    original_accuracy = model.score(test_data.drop('gender', axis=1), test_data['success'])
    
    # Change gender values
    test_data_male = test_data.copy()
    test_data_male['gender'] = 'male'
    test_data_female = test_data.copy()
    test_data_female['gender'] = 'female'
    
    male_accuracy = model.score(test_data_male.drop('gender', axis=1), test_data_male['success'])
    female_accuracy = model.score(test_data_female.drop('gender', axis=1), test_data_female['success'])
    
    print(f"Original accuracy: {original_accuracy:.2f}")
    print(f"Accuracy with male gender: {male_accuracy:.2f}")
    print(f"Accuracy with female gender: {female_accuracy:.2f}")

Этот код демонстрирует, как выполнить тест на инвариантность, создав копии исходного набора тестовых данных с измененными значениями пола. Затем функция gender_invariance_test оценивает производительность модели на исходном наборе данных и наборах данных с измененными значениями пола. Сравнивая точность этих разных наборов данных, вы можете определить, демонстрирует ли ваша модель какие-либо гендерные предубеждения в своих прогнозах. Если производительность модели одинакова во всех наборах данных, это предполагает, что модель инвариантна к признаку пола и не полагается на него для прогнозирования.

III. Направленные тесты ожиданий:

Направленные тесты ожидания предназначены для проверки того, что выходные данные модели предсказуемо изменяются при изменении входных функций. Эти тесты помогают убедиться, что модель ведет себя правильно при изменении входных данных, что необходимо для надежных реальных прогнозов.

Пример из реальной жизни: представьте, что вы построили модель для прогнозирования цен на жилье. Вы хотите убедиться, что прогнозы модели уменьшаются при уменьшении размера дома (в квадратных футах). Направленные тесты ожидания могут помочь вам подтвердить, что прогнозы вашей модели меняются в ожидаемом направлении на основе модификаций входных признаков.

Пример :

import numpy as np

def directional_expectation_test(model, test_data):
    X_test, y_test = test_data.drop('price', axis=1), test_data['price']
    predictions = model.predict(X_test)
    
    # Decrease house size by 10%
    X_test_smaller = X_test.copy()
    X_test_smaller['size'] *= 0.9
    smaller_predictions = model.predict(X_test_smaller)
    
    num_correct_directions = np.sum(predictions > smaller_predictions)
    total_samples = len(predictions)
    
    print(f"Directional correctness: {num_correct_directions / total_samples:.2f}")

def test_directional_expectation(model, input_data, feature_index, delta):
    modified_input = input_data.copy()
    modified_input[:, feature_index] += delta
    original_output = model.predict(input_data)
    modified_output = model.predict(modified_input)
    return original_output, modified_output

Этот код демонстрирует, как выполнить тест ожидания направления, изменив интересующую входную характеристику, в данном случае размер дома. Функция directional_expectation_test вычисляет прогнозы модели для исходного набора данных и набора данных с уменьшенными размерами домов. Затем он вычисляет долю прогнозов, которые меняются в правильном направлении (т. е. меньший размер дома приводит к более низкой прогнозируемой цене). Высокая доля правильных изменений направления предполагает, что модель ведет себя так, как ожидалось, когда входные данные меняются.

Раздел 2: Калибровка модели и достоверность

I. Калибровка модели:

Калибровка модели является важным аспектом оценки и потенциального повышения надежности прогнозируемых вероятностей, полученных с помощью модели машинного обучения, особенно в задачах классификации. Хорошо откалиброванная модель — это модель, в которой прогнозируемые вероятности близко соответствуют фактически наблюдаемым вероятностям, что гарантирует точность и значимость прогнозов модели.

Пример из реальной жизни: рассмотрим модель прогнозирования оттока клиентов. Хорошо откалиброванная модель точно оценивает вероятность оттока клиентов, что может быть использовано для определения приоритетности ресурсов для усилий по удержанию клиентов. Если модель плохо откалибрована, прогнозируемые вероятности могут завышать или занижать истинную вероятность оттока клиентов, что приводит к неэффективному распределению ресурсов и потенциально упущенным возможностям для удержания ценных клиентов.

Пример :

from sklearn.calibration import calibration_curve, CalibratedClassifierCV

def plot_calibration_curve(y_true, y_probs):
    fraction_of_positives, mean_predicted_value = calibration_curve(y_true, y_probs, n_bins=10)
    # Plot calibration curve

def calibrate_model(model, X_train, y_train, X_val, y_val):
    calibrated_model = CalibratedClassifierCV(model, method='sigmoid', cv='prefit')
    calibrated_model.fit(X_val, y_val)
    return calibrated_model

Функция calibrate_model принимает обученную модель и данные калибровки и возвращает откалиброванную версию модели. Затем вы можете использовать эту откалиброванную модель, чтобы делать прогнозы с более надежными оценками вероятности.

Методы калибровки модели:

Существует несколько доступных методов калибровки, таких как шкала Платта и изотоническая регрессия. Эти методы включают подгонку преобразования к прогнозируемым вероятностям модели, чтобы лучше согласовать их с наблюдаемыми вероятностями в данных. Применяя эти методы, вы можете улучшить калибровку модели и сделать ее прогнозы более надежными и полезными для принятия решений в реальном мире.

Масштабирование Платта. Масштабирование Платта, также известное как логистическая калибровка, представляет собой параметрический метод, который сопоставляет модель логистической регрессии с выходными данными модели классификации. Основная идея состоит в том, чтобы найти линейное преобразование выходных оценок модели, чтобы оно соответствовало истинным вероятностям.

Изотоническая регрессия: Изотоническая регрессия — это непараметрический метод, который сопоставляет монотонно возрастающую функцию с выходными данными модели классификации. В отличие от шкалы Платта, она не предполагает какой-либо конкретной функциональной формы.

Сплайны и решетка TensorFlow: I-Splines и решетка TensorFlow — это альтернативные методы калибровки, отвечающие требованиям гибкости и совместимости с TensorFlow. I-сплайны — это гибкие непараметрические функции, которые можно использовать в качестве функций калибровки. Они построены с использованием монотонных интегрированных сплайнов, полученных из B-сплайнов.

Оценка калибровки модели:

Чтобы оценить калибровку модели, вы можете использовать калибровочную кривую (также известную как диаграмма надежности). Калибровочная кривая отображает предсказанные вероятности в сравнении с наблюдаемыми относительными частотами положительного класса в каждом интервале вероятностей. Если модель хорошо откалибрована, предсказанные вероятности должны близко совпадать с истинными вероятностями, то есть калибровочная кривая должна быть близка к диагональной линии (y = x) на графике.

II. Измерение уверенности:

Измерение достоверности является важным аспектом оценки производительности модели, поскольку оно учитывает достоверность ее прогнозов. Установив порог для прогнозируемых вероятностей, мы можем отфильтровать прогнозы с меньшей достоверностью, что может привести к повышению производительности модели. Однако это происходит за счет потенциального исключения некоторых правильных прогнозов. В некоторых приложениях может быть важнее делать точные прогнозы за счет отказа от прогнозов вообще для случаев, когда модель менее надежна.

Измерение достоверности — ценный метод оптимизации производительности модели путем корректировки порогов достоверности. В нашем примере классификации спама по электронной почте мы продемонстрировали, как измерить влияние различных пороговых значений на производительность модели, используя синтетические данные и RandomForestClassifier. Построив метрики оценки, мы смогли определить оптимальный порог, который обеспечивает баланс между точными прогнозами и количеством сделанных прогнозов. Этот подход может быть применен к другим задачам классификации, где учет достоверности прогнозов имеет решающее значение для достижения наилучшей производительности модели.

Пример :

В этом примере мы будем использовать синтетический набор данных и RandomForestClassifier, чтобы продемонстрировать, как измерить влияние различных порогов достоверности на производительность модели классификации спама в электронной почте. Приведенный ниже код охватывает весь процесс, от генерации данных до обучения модели и оценки ее производительности при различных пороговых значениях.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

# Generate synthetic data
np.random.seed(42)
X = np.random.rand(1000, 20)
y = (np.random.rand(1000) > 0.5).astype(int)

# Split data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Train a classifier
clf = RandomForestClassifier()
clf.fit(X_train, y_train)

# Get the predicted probabilities
probs = clf.predict_proba(X_test)[:, 1]

# Define a range of certainty thresholds
thresholds = np.arange(0.5, 1.0, 0.05)

# Store evaluation metrics for each threshold
accuracy_list = []
precision_list = []
recall_list = []
f1_list = []

for threshold in thresholds:
    # Apply the threshold to the predicted probabilities
    y_pred = (probs > threshold).astype(int)

    # Calculate evaluation metrics
    accuracy = accuracy_score(y_test, y_pred)
    precision = precision_score(y_test, y_pred)
    recall = recall_score(y_test, y_pred)
    f1 = f1_score(y_test, y_pred)

    # Store the metrics in their respective lists
    accuracy_list.append(accuracy)
    precision_list.append(precision)
    recall_list.append(recall)
    f1_list.append(f1)

# Plot the evaluation metrics for each threshold
plt.figure(figsize=(10, 6))
plt.plot(thresholds, accuracy_list, label='Accuracy')
plt.plot(thresholds, precision_list, label='Precision')
plt.plot(thresholds, recall_list, label='Recall')
plt.plot(thresholds, f1_list, label='F1 Score')
plt.xlabel('Threshold')
plt.ylabel('Score')
plt.title('Model Performance vs. Certainty Threshold')
plt.legend()
plt.show()

Запустив этот код, вы создадите график, который иллюстрирует, как производительность модели (измеряемая точностью, воспроизводимостью и оценкой F1) изменяется с различными порогами уверенности. На этом графике вы можете определить оптимальный порог, который уравновешивает компромисс между точными прогнозами и количеством сделанных прогнозов.

Раздел III: Обнародование критических срезов для выявления потенциальной предвзятости

При проверке моделей машинного обучения важно оценивать их эффективность на различных подмножествах данных, также известных как срезы. Оценка на основе срезов может помочь выявить слабые места модели и повысить ее производительность на критических срезах. Мы обсудим три подхода к нарезке: на основе эвристики, анализ ошибок и поиск срезов. Мы также предоставим реализации этих методов на Python.

I. Эвристический подход:

Нарезка на основе эвристики включает в себя использование предварительных знаний о данных и задачах для создания срезов данных. Например, в электронной коммерции вы можете разделить данные по демографическим характеристикам клиентов, местоположению, истории покупок или категории продуктов. Анализ производительности вашей модели на этих срезах может выявить несоответствия или закономерности.

def evaluate_on_slice(model, dataset, feature, value):
    slice_data = dataset[dataset[feature] == value]
    performance = model.evaluate(slice_data)
    return performance

II. Подход к анализу ошибок:

Анализ ошибок включает в себя ручное изучение неправильно классифицированных примеров и выявление общих закономерностей или тенденций. Например, если ваша модель не может классифицировать породы собак, вы можете настроить модель или предварительную обработку данных для решения этой проблемы.

def slice_based_evaluation(model, test_data, slice_column, bins):
    X_test, y_test = test_data.drop('lifetime_value', axis=1), test_data['lifetime_value']
    
    for b in range(len(bins) - 1):
        lower_bound, upper_bound = bins[b], bins[b + 1]
        mask = (test_data[slice_column] >= lower_bound) & (test_data[slice_column] < upper_bound)
        X_slice, y_slice = X_test[mask], y_test[mask]
        
        slice_accuracy = model.score(X_slice, y_slice)
        print(f"Slice {lower_bound}-{upper_bound}: Test accuracy {slice_accuracy:.2f}")

III. Подход к поиску фрагментов:

Slice Finder включает в себя использование алгоритмов для систематического поиска критических срезов. Эти алгоритмы генерируют кандидатов-срезов и ранжируют их на основе их потенциальной полезности для проверки модели.

def slice_finder(data, labels, beam_size=2):
    n_features = data.shape[1]
    candidate_slices = [set(range(n_features))]
    critical_slices = []

    while candidate_slices:
        next_candidates = []
        for feature_set in candidate_slices:
            for f in feature_set:
                new_set = feature_set - {f}
                if new_set not in next_candidates:
                    next_candidates.append(new_set)

        next_candidates = sorted(next_candidates, key=lambda s: error_rate(model_predictions(data[:, list(s)]), labels))
        critical_slices.extend(next_candidates[-beam_size:])
        candidate_slices = next_candidates[-beam_size:-1]

    return critical_slices

Лучшие практики :

Определение критических функций с помощью таких методов, как Slice Finder, помогает понять, как модель работает с различными подмножествами данных, особенно когда определенные функции удалены или изменены.

Вместо того, чтобы удалять важные функции, рассмотрите следующие рекомендации:

Исследуйте причину: если функция имеет решающее значение, важно понять, почему она влияет на производительность модели. Исследуйте взаимосвязь между критической функцией и целевой переменной, а также любые взаимодействия с другими функциями.

Разработка функций: используйте знания предметной области или другие методы разработки функций для создания новых функций, которые потенциально могут улучшить производительность модели или снизить зависимость от критических функций. Это может помочь сделать модель более надежной.

Улучшение модели. Рассмотрите возможность использования более сложной модели или модели другого типа, которая могла бы лучше фиксировать отношения между функциями и целевой переменной. Это может включать в себя пробу различных алгоритмов, настройку гиперпараметров или использование ансамблевых методов.

Мониторинг производительности: постоянно контролируйте производительность модели на критических функциях или срезах, чтобы убедиться, что она не ухудшается со временем. Это может помочь выявить любые проблемы на ранней стадии и внести необходимые коррективы в модель.

Оцените справедливость: если критические функции связаны с чувствительными атрибутами (например, расой, полом или возрастом), важно убедиться, что модель справедлива и не дискриминирует определенные группы. Оцените справедливость, используя соответствующие показатели, и при необходимости внесите коррективы в модель.

Заключение :

Эффективная оценка моделей машинного обучения является важнейшим аспектом процесса операций машинного обучения (MLOps), поскольку она гарантирует надежность, справедливость и устойчивость разработанных моделей. Для этого практикующим специалистам следует рассмотреть возможность интеграции следующих методов автономной оценки в конвейер MLOps:

  1. Выполните тесты возмущения, тесты инвариантности и тесты ожидания направления, чтобы оценить стабильность и предсказуемость модели. Эти тесты могут помочь определить потенциальные слабые места и уязвимости в модели, позволяя разработчикам внести необходимые коррективы перед развертыванием.
  2. Отдайте предпочтение калибровке модели и измерению достоверности, поскольку эти компоненты имеют решающее значение для создания точных и надежных моделей машинного обучения. Регулярная калибровка моделей и оценка их уровней достоверности могут привести к более надежной работе в реальных сценариях.
  3. Включите оценку на основе срезов, чтобы выявить потенциальные отклонения и проблемы с производительностью в различных подмножествах данных. Оценивая производительность модели на конкретных срезах данных, вы можете выявить скрытые смещения и несоответствия, которые могут быть незаметны при оценке модели в целом.

Интеграция этих методов автономной оценки в ваш процесс MLOps необходима для создания моделей машинного обучения, которые обеспечивают согласованные, надежные и достоверные результаты. Заблаговременно решая потенциальные проблемы на этапах разработки и тестирования, вы будете лучше подготовлены к развертыванию моделей, которые оптимально работают в различных реальных сценариях, что в конечном итоге повысит ценность и влияние ваших решений для машинного обучения.