标签: patsy

如何坚持patsy DesignInfo?

我正在开发一个"预测模型即服务"的应用程序,结构如下:

  • 离线训练模型
  • 定期将模型参数上传到"预测服务器"
  • 预测服务器将单个观察作为输入,并输出预测

我正在尝试使用patsy,但遇到以下问题:当单个预测进入时,如何将其转换为正确的形状,使其看起来像一行训练数据?

patsy文档提供了一个示例,当训练数据中的DesignInfo在内存中可用时:http://patsy.readthedocs.io/en/latest/library-developers.html#predictions

# offline model training
import patsy

data = {'animal': ['cat', 'cat', 'dog', 'raccoon'], 'cuteness': [3, 6, 10, 4]}
eq_string = "cuteness ~ animal"


dmats = patsy.dmatrices(eq_string,data)
design_info = dmats[1].design_info
train_model(dmats)


# online predictions
input_data = {'animal': ['raccoon']}

# if the DesignInfo were available, I could do this:
new_dmat = build_design_matrices([design_info], input_data)
make_prediction(new_dmat, trained_model)
Run Code Online (Sandbox Code Playgroud)

然后是输出:

[DesignMatrix with shape (1, 3)
   Intercept  animal[T.dog]  animal[T.raccoon]
           1              0                  1
   Terms:
     'Intercept' (column 0)
     'animal' (columns …
Run Code Online (Sandbox Code Playgroud)

python pickle python-3.x patsy

26
推荐指数
1
解决办法
935
查看次数

Patsy:测试数据中分类字段的新级别

我正在尝试使用Patsy(使用sklearn,pandas)来创建一个简单的回归模型.R风格的公式创作是一个主要的吸引力.

我的数据包含一个名为" ship_city " 的字段,该字段可以包含来自印度的任何城市.由于我将数据划分为训练集和测试集,因此有几个城市只出现在其中一个集合中.代码段如下:

df_train_Y, df_train_X = dmatrices(formula, data=df_train, return_type='dataframe')
df_train_Y_design_info, df_train_X_design_info = df_train_Y.design_info, df_train_X.design_info
df_test_Y, df_test_X = build_design_matrices([df_train_Y_design_info.builder, df_train_X_design_info.builder], df_test, return_type='dataframe')
Run Code Online (Sandbox Code Playgroud)

最后一行引发以下错误:

patsy.PatsyError:将数据转换为分类时出错:值为'Kolkata'的观察值与任何预期的级别都不匹配

我相信这是一个非常常见的用例,其中训练数据不会包含所有分类字段的所有级别.Sklearn的DictVectorizer可以很好地处理这个问题.

有什么方法可以让我和Patsy合作吗?

python scikit-learn patsy

8
推荐指数
2
解决办法
1665
查看次数

Python:如何评估StatsModels中的残差?

我想评估残差:( y-hat y).

我知道该怎么做:

df = pd.read_csv('myFile', delim_whitespace = True, header = None)
df.columns = ['column1', 'column2']
y, X = ps.dmatrices('column1 ~ column2',data = df, return_type = 'dataframe')
model = sm.OLS(y,X)
results = model.fit()
predictedValues = results.predict()
#print predictedValues
yData = df.as_matrix(columns = ['column1'])
res = yData - predictedValues
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种方法可以做到这一点(?).

python pandas statsmodels patsy

8
推荐指数
1
解决办法
2万
查看次数

PatsyError:数据参数和列之间的行数不匹配(statsmodels)

我正在使用带有 Patsy 包的 R 风格公式来处理 statsmodels,并收到一个我无法理解的错误,任何提示或技巧将不胜感激。

PatsyError:数据参数和 C('Industry_Banking&CapitalMarkets') 之间的行数不匹配(8137 与 1)

DataFrame 有 8137 行并且没有丢失数据

完整代码如下

mixed = smf.mixedlm("""count_SoldServiceName ~ date_int + AzureActiveEngagementCount + AzureEngagementPartnerCount 
                     + DCount_learning_path_name + Industry_Automotive + C('Industry_Banking&CapitalMarkets') + C('Industry_Chemicals&Agrochemicals') + Industry_CivilianGovernment
                     + Industry_ConsumerGoods + C('Industry_Defense&Intelligence') + Industry_DiscreteManufacturing + Industry_Energy + Industry_Gaming 
                     + Industry_HealthPayor + Industry_HealthProvider + Industry_HigherEducation + Industry_Insurance + C('Industry_Media&Entertainment') + Industry_Nonprofit 
                     + Industry_PartnerProfessionalServices + Industry_Pharmaceuticals + C('Industry_Primary&SecondaryEdu/K-12') + Industry_ProfessionalServices 
                     + C('Industry_PublicSafety&Justice') + Industry_Retailers + Industry_SmartSpaces + Industry_Telecommunications +  C('Industry_Travel,Transport&Hospitality') 
                     + Industry_other + InvestmentArea_AA + …
Run Code Online (Sandbox Code Playgroud)

pandas statsmodels patsy

8
推荐指数
1
解决办法
6914
查看次数

Statsmodels:公式的简写方式

使用 statesmodels 的逻辑回归模型:

log_reg = st.logit(formula = 'label ~ pregnant + glucose + bp + insulin + bmi + pedigree + age', data=pima).fit()
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法来写公式的第二部分(怀孕+葡萄糖+血压+胰岛素+体重指数+血统+年龄)?这里必须明确提及所有列。如果超过100列,就很难写,而且语句也会很长。

python statsmodels patsy

6
推荐指数
1
解决办法
2065
查看次数

将 ols 函数与包含数字/空格的参数一起使用

我在使用 statsmodels.formula.api 函数时遇到很多困难

       ols(formula,data).fit().rsquared_adj 
Run Code Online (Sandbox Code Playgroud)

由于我的预测者的名字的性质。预测变量中有数字和空格等,这显然是它不喜欢的。我知道我需要使用 patsy.builtins.Q 之类的东西,所以假设我的预测变量是 Weight.in.kg ,它应该输入如下:

Q("weight.in.kg")
Run Code Online (Sandbox Code Playgroud)

所以我需要从列表中获取公式,并且使用 patsy.builtin.Q 修改列表中的每个项目会出现困难

formula = "{} ~ {} + 1".format(response, ' + '.join([candidate])
Run Code Online (Sandbox Code Playgroud)

[候选者] 是我的预测变量列表。

我向您提出的问题是,最亲爱的 Python 专家,我到底如何将列表 [candidate] 中的每个单独项目放在以下表达式的引号内:

问('')

这样 ols 函数就能真正读取它吗?如果这太明显了,我很抱歉,我不擅长 python。

python charts list pandas patsy

5
推荐指数
1
解决办法
5132
查看次数

python逻辑回归(初学者)

我正在使用python教自己一些逻辑回归.我想在演练中应用的经验教训在这里在维基百科条目中的小数据集在这里.

有些东西看起来不太对劲.维基百科和Excel解算器(使用此视频中的方法验证)给出拦截-4.0777和系数1.5046,但是我从github示例构建的代码分别输出-0.924200和0.756024.

我试图使用的代码如下.有什么明显的错误吗?

import numpy as np
import pandas as pd
from patsy import dmatrices
from sklearn.linear_model import LogisticRegression


X = [0.5,0.75,1.0,1.25,1.5,1.75,1.75,2.0,2.25,2.5,2.75,3.0,3.25,
3.5,4.0,4.25,4.5,4.75,5.0,5.5]
y = [0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1]

zipped = list(zip(X,y))
df = pd.DataFrame(zipped,columns = ['study_hrs','p_or_f'])

y, X = dmatrices('p_or_f ~ study_hrs',
                  df, return_type="dataframe")

y = np.ravel(y)

model = LogisticRegression()
model = model.fit(X,y)
print(pd.DataFrame(np.transpose(model.coef_),X.columns))

>>>
                  0
Intercept -0.924200
study_hrs  0.756024
Run Code Online (Sandbox Code Playgroud)

python machine-learning scikit-learn logistic-regression patsy

4
推荐指数
1
解决办法
3420
查看次数

互惠互利

Patsy 的幂不允许负整数,所以,如果我们有一些系列数据X

patsy.dmatrices('X + X**(-1)', X)
Run Code Online (Sandbox Code Playgroud)

返回错误。我如何将 X 的倒数添加到这样一个 patsy 公式中?

python patsy

3
推荐指数
1
解决办法
1334
查看次数

使用来自statsmodels.formula.api的ols - 如何删除常量项?

我在statsmodels教程中关注第一个例子:

http://statsmodels.sourceforge.net/devel/

如何指定不在ols中使用常量项进行线性拟合?

# Fit regression model (using the natural log of one of the regressors)
results = smf.ols('Lottery ~ Literacy + np.log(Pop1831)', data=dat).fit()
Run Code Online (Sandbox Code Playgroud)

python regression numpy statsmodels patsy

3
推荐指数
1
解决办法
5931
查看次数

在 patsy 中从 DesignMatrix 获取名称

from patsy import *
from pandas import *
dta =  DataFrame([["lo", 1],["hi", 2.4],["lo", 1.2],["lo", 1.4],["very_high",1.8]], columns=["carbs", "score"])
dmatrix("carbs + score", dta)
DesignMatrix with shape (5, 4)
Intercept  carbs[T.lo]  carbs[T.very_high]  score
        1            1                   0    1.0
        1            0                   0    2.4
        1            1                   0    1.2
        1            1                   0    1.4
        1            0                   1    1.8
Terms:
'Intercept' (column 0), 'carbs' (columns 1:3), 'score' (column 3)
Run Code Online (Sandbox Code Playgroud)

问题:我是否可以不读取此 DesignMatrix 给出的名称,而不是使用 Designinfo 指定列的“名称”(这基本上使我的代码的可重用性降低),以便稍后将其输入到 DataFrame 中,而无需知道预先确定“参考水平/对照组”水平是多少?

IE。当我做 dmatrix("C(carbs, Treatment(reference='lo')) + Score", dta)

"""
# How can I get …
Run Code Online (Sandbox Code Playgroud)

python python-2.7 pandas statsmodels patsy

2
推荐指数
1
解决办法
1801
查看次数

使用 pandas 或 statsmodel 创建虚拟变量以实现两列的交互

我有一个像这样的数据框:

Index ID  Industry  years_spend       asset
6646  892         4            4  144.977037
2347  315        10            8  137.749138
7342  985         1            5  104.310217
137    18         5            5  156.593396
2840  381        11            2  229.538828
6579  883        11            1  171.380125
1776  235         4            7  217.734377
2691  361         1            2  148.865341
815   110        15            4  233.309491
2932  393        17            5  187.281724
Run Code Online (Sandbox Code Playgroud)

我想为 Industry X Years_spend 创建虚拟变量,它会创建变量len(df.Industry.value_counts()) * len(df.years_spend.value_counts()),例如,对于具有 Industry==1 的所有行,d_11_4 = 1,并且 Years Spend=4,否则 d_11_4 = 0。然后我可以使用这些变量进行一些回归工作。

我知道我可以使用 df.groupby(['Industry','years_spend']) 创建像我想要的那样的组,并且我知道我可以使用以下patsy语法为一列创建这样的变量statsmodels …

python pandas statsmodels patsy

1
推荐指数
1
解决办法
1万
查看次数

patsy 中的 One-hot 编码

对于回归,我通常使用 sklearn 的OneHotEncoder.

我现在正在探索使用 patsy,但它似乎没有提供 One-hot 编码:http : //patsy.readthedocs.io/en/latest/categorical-coding.html

是否可以使用 patsy 指定 One-hot 编码?

python machine-learning scikit-learn patsy

1
推荐指数
1
解决办法
1190
查看次数

变量带有连字符时的 Patsy 公式

我正在尝试将 statsmodel 线性回归函数与公式一起使用。我的示例数据来自 Pandas 数据框。我在公式中的列名有一个小问题。由于下游过程,我的列名中有连字符。例如:

+------+-------+-------+
+ VOLT +  B-NN + B-IDW +
+------+-------+-------+
Run Code Online (Sandbox Code Playgroud)

现在,保留连字符的原因之一是它允许 python 拆分字符串以进行其他分析,所以我必须保留它。如您所见,当我想使用 B-NN 回归 VOLT 时VOLT ~ B-NN,我遇到了一个问题,因为 patsy 公式找不到 B。

有没有办法告诉 Patsy B-NN是一个变量名而不是 B 减去 NN?

谢谢。

京津冀

python statsmodels patsy

1
推荐指数
1
解决办法
667
查看次数