用于回归的格式化设计矩阵

formatting design matrix for regression

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

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

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

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

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

什么是正确的做法?谢谢

如果你一开始就用patsy来拟合模型,那么你应该告诉它"hey, you know how you built my first design matrix? build me another the same way":

# 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 函数来使变量居中:使用第一种方法,它会自动记住它从训练数据中减去的值,并将其重新用于测试数据,这就是你想要的。使用第二种方法,它将使用测试数据重新计算中心,这可能会导致您默默地得到非常非常错误的结果。