获取SciKit线性回归上的“ValueError:shapes not aligned”

2024-09-21 00:51:24 发布

您现在位置:Python中文网/ 问答频道 /正文

对于SciKit和使用Python的线性代数/机器学习来说,这是一个全新的概念,因此我似乎无法解决以下问题:

我有一个训练集和一个数据测试集,包含连续和离散/分类值。CSV文件加载到Pandas数据帧中,并在形状上匹配,即(1460,81)和(1459,81)。 但是,在使用Pandas' get_dummies之后,数据帧的形状将更改为(1460306)和(1459294)。所以,当我用SciKit Linear Regression模块进行线性回归时,它会为306个变量建立一个模型,并试图用它预测只有294个变量的模型。这自然会导致以下错误:

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

我怎么能解决这样的问题?我可以改变一下(1459294)来匹配另一个吗?

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


Tags: 文件csv数据模型机器概念pandasget
3条回答

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

这是处理分类数据时非常常见的问题。关于如何最好地处理这个问题,人们有不同的意见。

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

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

第二种方法是你在问题中提到的,所以我将用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)`

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

相关问题 更多 >

    热门问题