在 SciKit 线性回归中获取“ValueError:形状未对齐”
Posted
技术标签:
【中文标题】在 SciKit 线性回归中获取“ValueError:形状未对齐”【英文标题】:Getting 'ValueError: shapes not aligned' on SciKit Linear Regression 【发布时间】:2017-05-07 09:43:25 【问题描述】:对 SciKit 和使用 Python 进行线性代数/机器学习一般来说还是很陌生,所以我似乎无法解决以下问题:
我有一个训练集和一个测试数据集,包含连续和离散/分类值。 CSV 文件被加载到 Pandas DataFrames 中并在形状上匹配,即 (1460,81) 和 (1459,81)。 但是,使用Pandas' get_dummies 后,DataFrame 的形状会变为 (1460, 306) 和 (1459, 294)。因此,当我使用 SciKit Linear Regression 模块进行线性回归时,它会为 306 个变量构建一个模型,并尝试预测一个只有 294 个变量的模型。这自然会导致以下错误:
ValueError: shapes (1459,294) and (306,1) not aligned: 294 (dim 1) != 306 (dim 0)
我该如何解决这样的问题?我可以以某种方式重塑 (1459, 294) 以匹配另一个吗?
谢谢,我希望我已经说清楚了:)
【问题讨论】:
【参考方案1】:这是处理分类数据时极为常见的问题。对于如何最好地处理这个问题存在不同的意见。
一种可能的方法是将函数应用于限制可能选项集的分类特征。例如,如果您的特征包含字母表中的字母,您可以对 A、B、C、D 和“其他/未知”的特征进行编码。这样,您可以在测试时应用相同的功能并从问题中抽象出来。当然,一个明显的缺点是,通过减少特征空间,您可能会丢失有意义的信息。
另一种方法是在您的训练数据上构建一个模型,使用自然创建的任何虚拟模型,并将其作为模型的基线。当您在测试时使用模型进行预测时,您可以像转换训练数据一样转换测试数据。例如,如果您的训练集在某个特征中包含字母表中的字母,并且测试集中的相同特征包含值“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
访问)。
【讨论】:
【参考方案2】:对于任何感兴趣的人:我最终合并了训练集和测试集,然后生成虚拟模型,然后以完全相同的分数再次拆分数据。这样,不同形状不再有任何问题,因为它生成完全相同的虚拟数据。
【讨论】:
【参考方案3】:这对我有用: 最初,我收到此错误消息:
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)`
虽然这是一个无用的变量,但这解决了所有问题。
【讨论】:
请注意,这不是一个无用的变量,而是回归的常数项。更重要的是,无论您对训练数据应用什么转换(在这种情况下,添加一个常量维度),您也应该对测试数据应用。以上是关于在 SciKit 线性回归中获取“ValueError:形状未对齐”的主要内容,如果未能解决你的问题,请参考以下文章