我正在开发一个"预测模型即服务"的应用程序,结构如下:
我正在尝试使用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) 我正在尝试使用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合作吗?
我想评估残差:( 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)
我想知道是否有一种方法可以做到这一点(?).
我正在使用带有 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) 使用 statesmodels 的逻辑回归模型:
log_reg = st.logit(formula = 'label ~ pregnant + glucose + bp + insulin + bmi + pedigree + age', data=pima).fit()
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来写公式的第二部分(怀孕+葡萄糖+血压+胰岛素+体重指数+血统+年龄)?这里必须明确提及所有列。如果超过100列,就很难写,而且语句也会很长。
我在使用 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教自己一些逻辑回归.我想在演练中应用的经验教训在这里在维基百科条目中的小数据集在这里.
有些东西看起来不太对劲.维基百科和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
Patsy 的幂不允许负整数,所以,如果我们有一些系列数据X,
patsy.dmatrices('X + X**(-1)', X)
Run Code Online (Sandbox Code Playgroud)
返回错误。我如何将 X 的倒数添加到这样一个 patsy 公式中?
我在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) 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) 我有一个像这样的数据框:
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 …
对于回归,我通常使用 sklearn 的OneHotEncoder.
我现在正在探索使用 patsy,但它似乎没有提供 One-hot 编码:http : //patsy.readthedocs.io/en/latest/categorical-coding.html
是否可以使用 patsy 指定 One-hot 编码?
我正在尝试将 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?
谢谢。
京津冀
patsy ×13
python ×12
statsmodels ×7
pandas ×5
scikit-learn ×3
charts ×1
list ×1
numpy ×1
pickle ×1
python-2.7 ×1
python-3.x ×1
regression ×1