Вопрос или проблема
Я обучаю модели машинного обучения (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, чтобы заранее убедиться в разделении классов.
Рекомендации по устранению неполадок
-
Фиксация случайности: Убедитесь, что все компоненты вашего кода, которые могут вводить случайность, зафиксированы с использованием
random_seed
. Это касается как подвыборок, так и параметров моделей. -
Анализ данных: Просмотрите, как вы отбираете и обрабатываете свои данные, и определите, есть ли возможность ускорить процессы, исключив случайные элементы в предобработке.
-
Кросс-валидация: Применяйте строгий метод кросс-валидации, чтобы обеспечить всестороннюю оценку ваших моделей, и старайтесь использовать одинаковый разбиение для тестирования.
-
Сравнение моделей: Запустите каждую модель по несколько раз и возьмите среднее значение метрик, чтобы лучше понять производительность.
-
Систематическая отладка: Проведите систематическую отладку с фиксацией всех аспектов случайности, чтобы изолировать проблему.
Подводя итог, важно помнить, что несмотря на установление фиксированных параметров, элемент случайности сохраняется в обучении моделей, а работа с данными и оценка результатов могут значительно повлиять на окончательные выводы. Тщательный подход к каждой из этих областей поможет вам добиться большей стабильности в результатах.