Scikit-learn train_test_split внутри многопроцессорного пула в Linux (armv7l) не работает - PullRequest
0 голосов
/ 12 сентября 2018

Я испытываю странное поведение при использовании train_test_split в многопроцессорном пуле при запуске Python на Rasbperry Pi 3.

У меня есть что-то вроде этого:

def evaluate_Classifier(model,Features,Labels,split_ratio):

  X_train, X_val, y_train, y_val = train_test_split(Features,Labels,test_size=split_ratio)
...


iterations=500
pool = multiprocessing.Pool(4)
results = [pool.apply_async(evaluate_Classifier, args=(w,Current_Features,Current_Labels,0.35)) for i in range(iterations)]
output = [p.get() for p in results]
pool.close()
pool.join()

Теперь вышеприведенный код отлично работает на Windows 7 Python 3.5.6, и, действительно, каждый из 4 потоков будет иметь различие в обучении / тестировании.

Однако, когда я запускаю его на Raspberry Pi 3 (scikit-learn 0.19.2), кажется, что 4 потока разделяют данные ТОЧНО одинаково, и поэтому все потоки дают одинаковый результат. Следующие 4 потока снова разделят данные (на этот раз по-разному), но между ними точно так же, и так далее ...

Я даже пытался использовать train_test_split с random_state = np.random.randint, но это не помогает.

Любые идеи, почему это работает в Windows, но на Raspberry Pi 3, похоже, не распараллеливается должным образом?

Большое спасибо

Ответы [ 2 ]

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

shuffle включен по умолчанию, поэтому даже если shuffle = True, это не имеет значения.А также я хотел бы разделить данные внутри распараллеленной функции, если это возможно.

На самом деле, некоторые копания обнаружили, что это происходит из-за того, как Windows и Linux работают с несколькими потоками и ресурсами дочерних процессов и т. Д. И т. Д. И т. Д.Лучшее решение для вышеперечисленного заключается в следующем:

def evaluate_Classifier(model,Features,Labels,split_ratio,i):

X_train, X_val, y_train, y_val =   train_test_split(Features,Labels,test_size=split_ratio,random_state=i)
...


iterations=500
pool = multiprocessing.Pool(4)
results = [pool.apply_async(evaluate_Classifier,   args=(w,Current_Features,Current_Labels,0.35, i)) for i in range(iterations)]
output = [p.get() for p in results]
pool.close()
pool.join()

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

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

Вместо установки случайного состояния, вы должны попробовать перетасовать данные перед разбиением. Вы можете сделать это, установив параметр: shuffle = True.

...