我得到了一个没有响应变量的测试集。我已经建立了模型,需要预测测试集中的响应变量。
我在格式化测试设计矩阵以使其兼容时遇到问题。
我正在使用 patsy 库来构造矩阵。
我想做这样的事情,除了下面的代码不起作用:
X = dmatrices('Response ~ var1 + var2', test, return_type = 'dataframe')
什么是正确的方法?谢谢
如果您首先使用 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
函数将变量居中:使用第一种方法,它会自动记住从训练数据中减去的值,并将其重新用于测试数据,这正是您想要的。使用第二种方法,它将使用测试数据重新计算中心,这可能会导致您默默地得到非常非常错误的结果。