Совместимы ли случайные семена между системами? - PullRequest
0 голосов
/ 12 сентября 2018

Я сделал случайную модель леса, используя пакет python sklearn, где я установил начальное значение, например, на 1234. Для производства моделей мы используем pyspark. Если бы я должен был передать те же самые гиперпараметры и то же самое начальное значение, то есть 1234, получит ли он те же результаты?

В принципе, случайные начальные числа работают между различными системами?

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

В старые времена переносимость PRNG не была предоставлена.Различия в архитектуре машины, обработке переполнения и различиях реализации как для используемого алгоритма, так и для языка, на котором он был реализован, означали, что результаты могут и действительно различаться, даже если они номинально основаны на одной и той же математической формулировке.В 1979 году Schrage (см. Стр. 1194 здесь ) создал портативный мультипликативный линейный конгруэнтный генератор с простым модулем и показал, что он может быть реализован машинно-независимым способом "... до тех пор, пока машина может представлятьвсе целые числа в интервале от -2 31 до 2 3 - 1. "Он дал конкретную проверку, которую разработчики могут использовать для проверки своей реализации, указав, какой результат 1000 th должен получить конкретное начальное значение.Со времени работы Schrage разработка алгоритмов для платформы и языка не стала нормой.

Генератор по умолчанию в Python - это твистер Мерсенна, а на платформе Mersenne Twister доступно множество реализаций MT, не зависящих от платформы и языка.домашняя страница .Если Python переключит свой генератор по умолчанию в будущем, то совместимость не гарантируется, если вы не используете одну из независимых реализаций Python, доступных по ссылке выше.

0 голосов
/ 13 сентября 2018

Ну, это именно тот вопрос, который может действительно сделать с некоторыми экспериментами и предоставленными фрагментами кода ...

В любом случае, похоже, что общий ответ - фирма нет : не только между Python и Spark MLlib, но даже между подмодулями Spark или между Python & Numpy ...

Вот некоторый воспроизводимый код, запускаемый в облаке сообщества Databricks (где pyspark уже импортирован и соответствующие контексты инициализированы):

import sys

import random
import pandas as pd
import numpy as np
from pyspark.sql.functions import rand, randn
from pyspark.mllib import random as r  # avoid conflict with native Python random module

print("Spark version " + spark.version)
print("Python version %s.%s.%s" % sys.version_info[:3])
print("Numpy version " + np.version.version)

# Spark version 2.3.1 
# Python version 3.5.2 
# Numpy version 1.11.1

s = 1234 # RNG seed


# Spark SQL random module:
spark_df = sqlContext.range(0, 10)
spark_df = spark_df.select("id", randn(seed=s).alias("normal"), rand(seed=s).alias("uniform"))


# Python 3 random module:
random.seed(s)
x = [random.uniform(0,1) for i in range(10)] # random.rand() gives exact same results

random.seed(s)
y = [random.normalvariate(0,1) for i in range(10)]

df = pd.DataFrame({'uniform':x, 'normal':y})


# numpy random module
np.random.seed(s)
xx = np.random.uniform(size=10)  # again, np.random.rand(10) gives exact same results

np.random.seed(s)
yy = np.random.randn(10)

numpy_df = pd.DataFrame({'uniform':xx, 'normal':yy})


# Spark MLlib random module
rdd_uniform = r.RandomRDDs.uniformRDD(sc, 10, seed=s).collect()
rdd_normal = r.RandomRDDs.normalRDD(sc, 10, seed=s).collect()

rdd_df = pd.DataFrame({'uniform':rdd_uniform, 'normal':rdd_normal})

А вот и результаты :

Native Python 3:

# df

     normal  uniform
0  1.430825 0.966454
1  1.803801 0.440733 
2  0.321290 0.007491 
3  0.599006 0.910976 
4 -0.700891 0.939269 
5  0.233350 0.582228
6 -0.613906 0.671563
7 -1.622382 0.083938
8  0.131975 0.766481
9  0.191054 0.236810

Numpy:

# numpy_df

     normal  uniform
0  0.471435 0.191519
1 -1.190976 0.622109 
2  1.432707 0.437728
3 -0.312652 0.785359
4 -0.720589 0.779976
5  0.887163 0.272593
6  0.859588 0.276464 
7 -0.636524 0.801872 
8  0.015696 0.958139
9 -2.242685 0.875933

Spark SQL:

# spark_df.show()

+---+--------------------+-------------------+ 
| id|              normal|            uniform|
+---+--------------------+-------------------+
|  0|  0.9707422835368164| 0.9499610869333489| 
|  1|  0.3641589200870126| 0.9682554532421536|
|  2|-0.22282955491417034|0.20293463923130883|
|  3|-0.00607734375219...|0.49540111648680385|
|  4|  -0.603246393509015|0.04350782074761239|
|  5|-0.12066287904491797|0.09390549680302918|
|  6|  0.2899567922101867| 0.6789838400775526|
|  7|  0.5827830892516723| 0.6560703836291193|
|  8|   1.351649207673346| 0.7750229279150739|
|  9|  0.5286035772104091| 0.6075560897646175|
+---+--------------------+-------------------+

Spark MLlib:

# rdd_df

     normal  uniform 
0 -0.957840 0.259282 
1  0.742598 0.674052 
2  0.225768 0.707127 
3  1.109644 0.850683 
4 -0.269745 0.414752 
5 -0.148916 0.494394 
6  0.172857 0.724337
7 -0.276485 0.252977
8 -0.963518 0.356758
9  1.366452 0.703145

Конечно, даже если вышеуказанные результаты были идентичны, это не было бы гарантией того, что результаты, скажем, Случайного леса в scikit-learn, будут точно идентичны результатам pyspark Random Forest. ..

Несмотря на отрицательный ответ, я действительно не могу понять, как это влияет на развертывание любой системы ML, т.е. если результаты зависят в решающей степени от ГСЧ, то что-то определенно не так ...

0 голосов
/ 12 сентября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...