Байесовский с использованием PyMC3: PatsyError - PullRequest
2 голосов
/ 01 февраля 2020


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

import pandas as pd
import numpy as np
import pymc3 as pm
from sklearn.model_selection import train_test_split

data = pd.read_csv('data.csv')
X = data.drop(['User_ID','Gender','Age'], axis = 1)   # the features
Y = data['Age']  
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
print(X_train.shape)
print(X_test.shape)

Formula = 'Age ~ ' + ' + '.join(['%s' % variable for variable in X_train.columns[0:]])
print(Formula)

with pm.Model() as normal_model:    
   f = pm.glm.families.Normal()    
   pm.GLM.from_formula(Formula, data = X_train, family = f)   
   normal_trace = pm.sample(draws=2000, chains = 2, tune = 500)

Когда я запускаю его, я получаю эту ошибку

PatsyError: Error evaluating factor: NameError: name 'Age' is not defined
Age ~ Height + Weight + Duration + Heart_Rate + Body_Temp + Calories
^^^

Но если я продолжу Age в X, он работал нормально, но в этом случае Age также включается в формулу, которой не должно быть, потому что Age является зависимой переменной, в то время как другие являются независимыми переменными.
Есть идеи, как это исправить?
Заранее спасибо

1 Ответ

2 голосов
/ 02 февраля 2020

Чтобы использовать метод pm.GLM.from_formula(), аргумент DataFrame data должен содержать все переменные (предиктор и ответ). Простой способ изменить текущий код для этого состоит в том, чтобы заново присоединить переменную ответа:

pm.GLM.from_formula(Formula, data=pd.concat([X_train, y_train], axis=1), family=f)
...