Байесовская линейная регрессия с PyMC3 и большим уровнем вложенности набора данных - скобки превысила максимальную и медленную производительность - PullRequest
0 голосов
/ 07 декабря 2018

Я хотел бы использовать байесовскую многомерную линейную регрессию для оценки силы игроков в командных видах спорта (например, хоккей, баскетбол или футбол).Для этого я создаю матрицу X, в которой игроки представлены в виде столбцов, а совпадения - в виде строк.Для каждого матча вход игрока равен 1 (игрок играет в составе команды хозяев), -1 (игрок играет в команде гостей) или 0 (игрок не участвует в этой игре).Зависимая переменная Y определяется как разница в баллах для обеих команд в каждом матче (Score_home_team - Score_away_team).

Таким образом, количество параметров будет довольно большим в течение одного сезона (например, X определяется 300 строками x450 столбцов, т.е. 450 коэффициентов игрока + y-перехват).При выполнении подгонки я столкнулся с ошибкой компиляции:

('Compilation failed (return status=1): /Users/me/.theano/compiledir_Darwin-17.7.0-x86_64-i386-64bit-i386-3.6.5-64/tmpdxxc2379/mod.cpp:27598:32: fatal error: bracket nesting level exceeded maximum of 256.

Я попытался обработать эту ошибку, установив:

theano.config.gcc.cxxflags = "-fbracket-depth=1024"

Теперь выборка запущена.Однако он настолько медленный, что даже если я беру только 35 из 300 строк, выборка не будет завершена в течение 20 минут.

Это мой основной код:

import pymc3 as pm
basic_model = pm.Model()

with basic_model:

    # Priors for beta coefficients - these are the coefficients of the players
    dict_betas = {}
    for col in X.columns:
        dict_betas[col] = pm.Normal(col, mu=0, sd=10)

    # Priors for unknown model parameters
    alpha = pm.Normal('alpha', mu=0, sd=10) # alpha is the y-intercept
    sigma = pm.HalfNormal('sigma', sd=1) # standard deviation of the observations

    # Expected value of outcome
    mu = alpha
    for col in X.columns:
        mu = mu + dict_betas[col] * X[col] # mu = alpha + beta_1 * Player_1 + beta_2 * Player_2 + ...

    # Likelihood (sampling distribution) of observations
    Y_obs = pm.Normal('Y_obs', mu=mu, sd=sigma, observed=Y)

Создание экземплярамодель работает в течение одной минуты для большого набора данных.Я делаю выборку, используя:

with basic_model:

    # draw 500 posterior samples
    trace = pm.sample(500)

Выборка завершается для небольших выборок (например, 9 строк, 80 столбцов) в течение 7 минут.Тем не менее, время существенно увеличивается с увеличением размера выборки.

Есть какие-нибудь предложения, как я могу заставить эту байесовскую линейную регрессию работать за приемлемое количество времени?Реализуются ли подобные проблемы с использованием PyMC3 (помните, я сталкивался с ошибкой вложения скобок)?Я видел в недавней публикации, что этот вид анализа выполним в R (https://arxiv.org/pdf/1810.08032.pdf).. Поэтому, я думаю, он также должен как-то работать с Python 3.

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 10 декабря 2018

Устранение циклов for должно повысить производительность, а также решить проблему с вложенностью, о которой вы сообщаете.Theano TensorVariables и производные от них случайные переменные PyMC3 уже являются многомерными и поддерживают операции линейной алгебры.Попробуйте изменить свой код на что-то вроде

beta = pm.Normal('beta', mu=0, sd=10, shape=X.shape[1])
...
mu = alpha + pm.math.dot(X, beta)
...

Если вам нужно указать другие предыдущие значения для mu и / или sd, эти аргументы принимают все, что theano.tensor.as_tensor_variable() принимает, так что вы можете передать список или массив numpy.

Я настоятельно рекомендую ознакомиться с theano.tensor и pymc3.math поскольку иногда вы должны использовать их для правильной работы со случайными переменными, и в целом это должно привести к более эффективному коду.

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