Почему я получаю разную производительность на разных запусках моей ML модели?

Вопрос или проблема

Я обучаю модели машинного обучения (Xgboost и LightGbm) с использованием snowpark, но после каждой попытки у меня получаются разные значения метрик (AUC, Средняя точность), и поэтому я никогда не знаю, какая моя лучшая модель.

Я попытался установить глобальную переменную в начале моего блокнота random_seed = 42 и использовать ее в своей функции недопосев и в инициализации моих моделей:

if model_type == ‘xgboost’:
model = XGBClassifier(
random_state=random_seed,
input_cols=feature_cols,
label_cols=target_col,
output_cols=[‘PREDICTION’],
passthrough_cols=[‘INDIVIDUAL_SK’, ‘DATE_MONTH’],
**hyperparameters
)

elif model_type == 'lightgbm':
    model = LGBMClassifier(
        random_state=random_seed,
        input_cols=feature_cols,
        label_cols=target_col,
        output_cols=['PREDICTION'],
        passthrough_cols=['INDIVIDUAL_SK', 'DATE_MONTH'],
        **hyperparameters

    )

def undersample_majority_class(df):

df_with_seniority = df.with_column(“years_since”, (F.col(‘TIME_SINCE_FIRST_LEAD’)/12).cast(‘int’))

df_with_random = df_with_seniority.with_column(‘random_order’, F.random(seed=random_seed))
window_spec = Window.partition_by(“INDIVIDUAL_SK”).order_by(F.col(‘random_order’).asc())
df_ranked = df_with_random.with_column(“month_rank”, F.row_number().over(window_spec)
)

df_majority = df_ranked.filter(F.col(“CONVERSION_INDICATOR”) == 0)
df_majority_sampled = df_majority.filter(((F.col(“years_since”) > 10) & (F.col(“month_rank”) == 1)) |
((F.col(“years_since”) <= 10) & (F.col("month_rank") <= 2)) )

df_majority_sampled = df_majority_sampled.drop(‘years_since’,’month_rank’,’random_order’ )
df_minority = df.filter(F.col(“CONVERSION_INDICATOR”) == 1)
df_balanced = df_majority_sampled.union_all(df_minority)

return df_balanced
Я не знаю, что делать, чтобы это исправить.

Ответ или решение

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

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

1. Случайность в обучении моделей

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

2. Подборка данных

Вы упомянули использование функции подвыборки подмножества (undersampling) для сбалансировки классов. Если в процессе подвыборки используется случайность (например, функция F.random()), это может привести к различным выборкам данных на каждом запуске, даже при одинаковом значении random_seed. Выбор различных подмножеств может затруднить достижение стабильных результатов.

3. Параметры модели

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

4. Обработка и преобразование данных

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

5. Оценка метрик

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

Рекомендации по устранению неполадок

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

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

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

  4. Сравнение моделей: Запустите каждую модель по несколько раз и возьмите среднее значение метрик, чтобы лучше понять производительность.

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

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

Оцените материал
Добавить комментарий

Капча загружается...