1

我得到了一个没有响应变量的测试集。我已经建立了模型,需要预测测试集中的响应变量。

我在格式化测试设计矩阵以使其兼容时遇到问题。

我正在使用 patsy 库来构造矩阵。

我想做这样的事情,除了下面的代码不起作用:

X = dmatrices('Response ~ var1 + var2', test, return_type = 'dataframe')

什么是正确的方法?谢谢

4

1 回答 1

1

如果您首先使用 patsy 来拟合模型,那么您应该告诉它“嘿,您知道您是如何构建我的第一个设计矩阵的吗?以相同的方式构建我另一个”:

# Set up training data
train_Y, train_X = dmatrices("Response ~ ...", train, return_type="dataframe")
# Save patsy's record of how it built this matrix:
design_info = train_X.design_info
# Re-use it to build the test matrix
test_X = dmatrix(design_info, test, return_type="dataframe")

或者,您可以从头开始构建一个新矩阵:

# Use 'dmatrix' and leave out the left-hand-side of the formula
test_X = dmatrix("~ ...", test, return_type="dataframe")

如果你能做到,第一种方法会更好。例如,假设您有一个分类变量,让 patsy 为您编码。并假设您的训练集中出现了 10 个类别,但其中只有 5 个出现在您的测试集中。如果您使用第一种方法,那么 patsy 将记住 10 个类别在哪里,并生成一个包含 10 列(其中一些全为零)的测试矩阵。如果您使用第二种方法,那么 patsy 将生成一个 10 列的训练矩阵和一个 5 列的测试矩阵,然后您的模型代码可能会崩溃,因为矩阵不是它期望的形状。

另一个重要的情况是,如果您使用 patsy 的center函数将变量居中:使用第一种方法,它会自动记住从训练数据中减去的值,并将其重新用于测试数据,这正是您想要的。使用第二种方法,它将使用测试数据重新计算中心,这可能会导致您默默地得到非常非常错误的结果。

于 2017-08-06T22:51:04.970 回答