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')

最后一行会引发以下错误:

patsy.PatsyError:将数据转换为分类时出错:值为'Kolkata'的观察结果与预期水平不符

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

有什么办法可以让我和Patsy一起工作吗?


问题当然是,如果你只是给一个原始的值列表,它就没有办法知道还有其他可能发生的值。 你必须以某种方式告诉它完整的可能值是什么。

一种方法是使用C(...)levels=参数,如:

# If you have a data frame with all the data before splitting:
all_cities = sorted(df_all["Cities"].unique())
# Alternative approach:
all_cities = sorted(set(df_train["Cities"]).union(set(df_test["Cities"])))

dmatrices("y ~ C(Cities, levels=all_cities)", data=df_train)

如果您使用熊猫的默认分类支持,另一种选择是在设置数据框时记录可能的值集; 如果patsy检测到您传递的对象是熊猫分类,那么它会自动使用熊猫分类属性,而不是通过查看数据来猜测可能的分类。


我遇到了类似的问题,并在分割数据之前构建了设计矩阵。

df_Y, df_X = dmatrices(formula, data=df, return_type='dataframe')
df_train_X, df_test_X, df_train_Y, df_test_Y = 
    train_test_split(df_X, df_Y, test_size=test_size)

然后,作为适用的一个例子:

model = smf.OLS(df_train_Y, df_train_X)
model2 = model.fit()
predicted = model2.predict(df_test_X)

从技术上讲,我没有构建测试用例,但自从实现上述功能以来,我还没有遇到Error converting data to categorical错误。

链接地址: http://www.djcxy.com/p/30777.html

上一篇: Patsy: New levels in categorical fields in test data

下一篇: How to resize SVG clip