Почему сериализованные numy объекты random_state отличаются при загрузке? - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь выяснить, почему определенные перекрестные проверки с использованием определенного набора индексов, одинаковых входных данных и одинаковых random_state в sklearn дают разные результаты с использованием одинаковых гиперпараметров модели LogisticRegression.Моей первой мыслью было, что начальные значения random_state могут отличаться при последующих запусках.Затем я понял, что когда я pickle random_state говорит, что объекты отличаются, когда я сравниваю 2 объекта напрямую, но значения в методе get_state совпадают.Почему это?

random_state = np.random.RandomState(0)
print(random_state)
# <mtrand.RandomState object at 0x12424e480>

with open("./rs.pkl", "wb") as f:
    pickle.dump(random_state, f, protocol=pickle.HIGHEST_PROTOCOL)
with open("./rs.pkl", "rb") as f:
    random_state_copy = pickle.load(f)
    print(random_state_copy)
# <mtrand.RandomState object at 0x126465240>
print(random_state == random_state_copy)
# False
print(str(random_state.get_state()) == str(random_state_copy.get_state()))
# True

Версии:

numpy = '1.13.3',

Python = '3.6.4 | Anaconda, Inc. |(по умолчанию, 16 января 2018 г., 12:04:33) \ n [GCC 4.2.1 Совместимый Clang 4.0.1 (tags / RELEASE_401 / final)] ')

1 Ответ

0 голосов
/ 26 мая 2019

Неотсортированная копия начального случайного состояния в вашем примере фактически производит ту же последовательность случайных чисел (проверено на python 3.6, numpy 1.15.4).Возможно, тестирование на равенство не реализовано для RandomState, как указал @jasonharper.== возвращает False, но состояния идентичны по поведению.

Следующий фрагмент кода вставлен после кода, указанного в вопросе:

a = random_state.randint(0, 10, 5)
b = random_state_copy.randint(0, 10, 5)
print(a)
print(b)
print(a==b)

Производит:

[5 0 3 3 7]
[5 0 3 3 7]
[ True  True  True  True  True]

Так что, скорее всего, не RandomState делает результаты прогона другими: ищите причины различий где-то еще.

...