Ошибка при использовании многопроцессорной библиотеки: «получено несколько значений для аргумента ключевого слова 'x'" - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь распараллелить линейную модель с штрафом, используя многопроцессорную библиотеку в python.

Я создал функцию, которая решает мою модель:

from __future__ import division
import numpy as np
from cvxpy import *

def lm_lasso_solver(x, y, lambda1):
    n = x.shape[0]
    m = x.shape[1]
    lambda1_param = Parameter(sign="positive")
    betas_var = Variable(m)
    response = dict(model='lm', penalization='l')
    response["parameters"] = {"lambda_vector": lambda1}
    lasso_penalization = lambda1_param * norm(betas_var, 1)
    lm_penalization = 0.5 * sum_squares(y - x * betas_var)
    objective = Minimize(lm_penalization + lasso_penalization)
    problem = Problem(objective)
    lambda1_param.value = lambda1
    try:
        problem.solve(solver=ECOS)
    except:
        try:
            problem.solve(solver=CVXOPT)
        except:
            problem.solve(solver=SCS)
    beta_sol = np.asarray(betas_var.value).flatten()
    response["solution"] = beta_sol
    return response

В этой функции x - это матрица предикторов, а y - переменная ответа.lambda1 - это параметр, который должен быть оптимизирован, и, следовательно, это параметр, который я хочу распараллелить.Я сохранил этот сценарий в файле Python с именем «ms.py»

Затем я создал другой файл Python с именем «parallelization.py», и в этом файле я определил следующее:

import multiprocessing as mp
import ms
import functools

def myFunction(x, y, lambda1):
    pool = mp.Pool(processes=mp.cpu_count())
    results = pool.map(functools.partial(ms.lm_lasso_solver, x=x, y=y), lambda1)
    return results

Итак, теперь в интерпретаторе python идея была выполнена:

from sklearn.datasets import load_boston
boston = load_boston()
x = boston.data
y = boston.target
runfile('parallelization.py')
lambda_vector = np.array([1,2,3])
myFunction(x, y, lambda_vector)

Но когда я это сделал, я получил следующее сообщение об ошибке: enter image description here

1 Ответ

0 голосов
/ 08 июня 2018

Проблема в строке:

results = pool.map(functools.partial(ms.lm_lasso_solver, x=x, y=y), lambda1)

Вы вызываете метод functools.partial() с аргументами с ключевыми словами, тогда как в вашем методе lm_lasso_solver вы не определяете их как аргументы с ключевыми словами.Вы должны вызывать его с x и y в качестве позиционных аргументов следующим образом:

results = pool.map(functools.partial(ms.lm_lasso_solver, x, y), lambda1)

или просто использовать apply_async() метод объекта пула:

results = pool.apply_async(ms.lm_lasso_solver, args = [x, y, lambda1])

...