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

时间:2015-12-02 06:02:19

标签: python scikit-learn 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:将数据转换为分类:观察时出错   有价值的'加尔各答'与任何预期水平都不匹配

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

我有什么方法可以用Patsy来完成这项工作吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

如果您使用pandas的默认categorical support,则另一个选项是record the set of possible values when you set up your data frame;如果patsy检测到您传递的对象是大熊猫分类,那么它会自动使用pandas categories属性,而不是通过查看数据来猜测可能的类别。

答案 1 :(得分:0)

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

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错误。