Getting 'ValueError: shapes not aligned' on SciKit Linear Regression

Getting 'ValueError: shapes not aligned' on SciKit Linear Regression

SciKit 很新,线性 algebra/machine 学习 Python 一般,所以我似乎无法解决以下问题:

我有一个训练集和一个测试集数据,包含连续值和 discrete/categorical 值。 CSV 文件被加载到 Pandas 个 DataFrame 中并在形状上匹配,分别为 (1460,81) 和 (1459,81)。 但是,在使用 Pandas' get_dummies, the shapes of the DataFrames change to (1460, 306) and (1459, 294). So, when I do linear regression with the SciKit Linear Regression 模块后,它为 306 个变量构建了一个模型,并尝试用它预测一个只有 294 个变量的模型。这自然会导致以下错误:

ValueError: shapes (1459,294) and (306,1) not aligned: 294 (dim 1) != 306 (dim 0)

我该如何解决这样的问题?我能否以某种方式重塑 (1459, 294) 以匹配另一个?

谢谢,我希望我已经说清楚了:)

这是处理分类数据时极为常见的问题。对于如何最好地处理这个问题存在不同意见。

一种可能的方法是将函数应用于限制可能选项集的分类特征。例如,如果您的特征包含字母表中的字母,您可以将特征编码为 A、B、C、D 和 'Other/Unknown'。这样,您可以在测试时应用相同的功能并从问题中抽象出来。当然,一个明显的缺点是通过减少特征 space 您可能会丢失有意义的信息。

另一种方法是在您的训练数据上构建模型,使用自然创建的任何虚拟对象,并将其视为模型的基线。当您在测试时使用模型进行预测时,您将以与转换训练数据相同的方式转换测试数据。例如,如果您的训练集在某个特征中包含字母表中的字母,而测试集中的相同特征包含值 'AA',您将在进行预测时忽略它。这和你现在的情况是相反的,但是前提是一样的。您需要即时创建缺少的功能。当然,这种方法也有缺点。

第二种方法是你在问题中提到的,所以我将通过 pandas 来完成。

通过使用 get_dummies,您将分类特征编码为多个单热编码特征。您可以做的是使用 reindex 强制测试数据与训练数据相匹配,如下所示:

test_encoded = pd.get_dummies(test_data, columns=['your columns'])
test_encoded_for_model = test_encoded.reindex(columns = training_encoded.columns, 
    fill_value=0)

这将以与训练数据相同的方式对测试数据进行编码,为不是通过编码测试数据创建但在训练过程中创建的虚拟特征填充 0。

您可以将其包装到一个函数中,然后将其动态应用于您的测试数据。如果您创建列名称的数组或列表,则不需要内存中的编码训练数据(我使用 training_encoded.columns 访问)。

对于任何感兴趣的人:我最终合并了训练集和测试集,然后生成了虚拟模型,然后再次以完全相同的分数拆分数据。这样就不会有不同形状的任何问题了,因为它生成了完全相同的虚拟数据。

这对我有用:
最初,我收到此错误消息:

shapes (15754,3) and (4, ) not aligned 

我发现,我正在使用训练数据中的 3 个变量创建模型。但是我添加的常量 X_train = sm.add_constant(X_train) 常量变量是自动创建的。所以,现在总共有 4 个变量。
当您默认测试此模型时,测试变量具有 3 个变量。因此,会弹出维度未匹配的错误。
所以,我也使用了为 y_test 创建虚拟变量的技巧。

`X_test = sm.add_constant(X_test)`

虽然这是一个无用的变量,但这解决了所有问题。