DaS*_*ode 8 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')
Run Code Online (Sandbox Code Playgroud)
最后一行引发以下错误:
patsy.PatsyError:将数据转换为分类时出错:值为'Kolkata'的观察值与任何预期的级别都不匹配
我相信这是一个非常常见的用例,其中训练数据不会包含所有分类字段的所有级别.Sklearn的DictVectorizer可以很好地处理这个问题.
有什么方法可以让我和Patsy合作吗?
问题当然是,如果你只是给 patsy 一个原始值列表,它无法知道还有其他可能发生的值。您必须以某种方式告诉它完整的可能值集是什么。
一种方法是使用levels=
参数 to 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)
Run Code Online (Sandbox Code Playgroud)
如果您使用 Pandas 的默认分类支持,另一种选择是在设置数据框时记录可能的值集;如果 patsy 检测到您传递给它的对象是一个 Pandas 分类对象,那么它会自动使用 Pandas 类别属性,而不是尝试通过查看数据来猜测可能的类别是什么。
小智 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)
Run Code Online (Sandbox Code Playgroud)
然后作为应用拟合的示例:
model = smf.OLS(df_train_Y, df_train_X)
model2 = model.fit()
predicted = model2.predict(df_test_X)
Run Code Online (Sandbox Code Playgroud)
从技术上讲,我还没有构建测试用例,但Error converting data to categorical
自从实现上述操作以来我没有再次遇到错误。
归档时间: |
|
查看次数: |
1665 次 |
最近记录: |