Короткий ответ
Если случайность используется в нескольких местах (разбиение на train/test, df.sample, перемешивание, инициализация модели), а зафиксирован seed только в одном из них, итоговый результат всё равно останется невоспроизводимым, потому что остальные источники случайности будут меняться от запуска к запуску.
Как это работает подробнее
каждый генератор случайных чисел (встроенный random, numpy.random, random_state внутри функций pandas/sklearn) может иметь собственное внутреннее состояние; фиксация seed в одном месте не влияет на остальные, если они не связаны общим источником случайности или не получили свой собственный seed.
Пример кода
Пример на Python
import pandas as pd
df = pd.DataFrame({'id': range(10)})
sample1 = df.sample(n=3, random_state=42)
sample2 = df.sample(n=3, random_state=42)
print(sample1.equals(sample2))Что использовать на практике
- На практике. для надёжной воспроизводимости всего пайплайна стоит зафиксировать seed в самом начале скрипта для всех используемых библиотек случайности и передавать random_state явно в каждую функцию, где он поддерживается (train_test_split, sample, shuffle), а не полагаться на глобальный seed, который может быть "израсходован" предыдущими случайными вызовами.
- Проверка. sample1 и sample2 должны быть идентичны при одинаковом random_state, но если где-то в пайплайне до этого вызова случайность использовалась без фиксированного seed, порядок операций всё равно может влиять на воспроизводимость всего скрипта в целом.
Подводные камни
- Частые ошибки. фиксируют random_state только в train_test_split, но затем используют df.sample() без параметра random_state где-то ещё в пайплайне, получая разные результаты при каждом перезапуске; переставляют порядок вызовов случайных операций в коде между запусками, из-за чего даже с одинаковым общим seed результат отличается, так как генератор "потребляет" случайные числа в другом порядке.