2016-05-30 3 views
0

Я создал небольшой код, который работает аналогично sklearn gridsearch, Он моделирует модель (на X и y в приведенном ниже коде) на одном наборе гиперпараметров, проверяет производительность модели, используя несколько показателей для данных валидации (Xt, yt_class) и сохраняет результаты в базе данных Pandas DataFrame.Python, работающий на нескольких процессорах

from sklearn.grid_search import ParameterGrid 
    from sklearn.metrics import precision_score,f1_score 

    grid = {'C':[1,10.0,50,100.0],'gamma':[0.00001,0.0001,0.001,0.01,0.1]} 
    param_grid = ParameterGrid(grid) 
    results = pd.DataFrame(list(param_grid)) 
    precision = [] 
    f1 = [] 
    for params in param_grid: 
     model = SVC(kernel='rbf',cache_size=1000,class_weight='balanced',**params) 
     model.fit(X,y) 
     precision.append(precision_score(yt_class, model.predict(Xt), average='weighted')) 
     f1.append(f1_score(yt_class, model.predict(Xt), average='weighted')) 
     print(params) 
     print(precision_score(yt_class, model.predict(Xt), average='weighted')) 
     print(f1_score(yt_class, model.predict(Xt), average='weighted')) 

    results['precision'] = precision 
    results['f1'] = f1 

Теперь я пытаюсь сделать мой пробег цикла на несколько процессоров, я попытался следующие основные примеры для многопроцессорных модуля, но, будучи новым для Python и программирования в целом не был в состоянии понять, что работает в моем случае.

Пример того, что не работает:

import multiprocessing as mp 
pool = mp.Pool(processes=8) 

def get_scores(param_grid): 
    precision = [] 
    f1 = [] 
    for params in param_grid: 
     model = SVC(kernel='rbf',cache_size=1000,class_weight='balanced',**params) 
     model.fit(X,y) 
     model.predict(Xt) 
     precision.append(precision_score(yt_class, model.predict(Xt), average='weighted')) 
     f1.append(f1_score(yt_class, model.predict(Xt), average='weighted')) 
    return precision,f1  

scores = pool.apply(get_scores,param_grid) 

ответ

2

Ваш метод get_scores должен состоять только из внутренней части петли

Попробуйте это:

import multiprocessing as mp 
from sklearn.grid_search import ParameterGrid 
from sklearn.metrics import precision_score,f1_score 

def get_scores(params): 
    model = SVC(kernel='rbf',cache_size=1000,class_weight='balanced',**params) 
    model.fit(X,y) 
    model.predict(Xt) 
    precision = precision_score(yt_class, model.predict(Xt), average='weighted') 
    f1 = f1_score(yt_class, model.predict(Xt), average='weighted') 
    return precision, f1  


grid = {'C':[1,10.0,50,100.0],'gamma':[0.00001,0.0001,0.001,0.01,0.1]} 
param_grid = ParameterGrid(grid) 
pool = mp.Pool(processes=8) 

scores = pool.map_async(get_scores, param_grid).get() 
# scores is a list of tuples [(precision_1, f1_1), (precision_2, f1_2)...] 
# you can "unzip" it like this 

precision, f1 = zip(*scores) 
+0

Я получаю следующее сообщение об ошибке после (я получаю ту же ошибку после запуска моего кода): 'TypeError: get_scores() принимает 1 позиционный аргумент, но 20 были заданы' –

+1

Правильно, это должно быть map_ async, not apply_async –

Смежные вопросы