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