在SciKit线性回归中遇到’ValueError: shapes not aligned’错误

我对SciKit以及Python中的线性代数/机器学习还比较陌生,所以我无法解决以下问题:

我有一组训练数据和测试数据,包含连续和离散/分类值。这些CSV文件被加载到Pandas DataFrame中,并且形状匹配,分别为(1460,81)和(1459,81)。然而,在使用Pandas的get_dummies后,DataFrame的形状变为(1460, 306)和(1459, 294)。因此,当我使用SciKit线性回归模块进行线性回归时,它会为306个变量构建模型,并尝试用只有294个变量的数据进行预测。这自然会导致以下错误:

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

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

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


回答:

在处理分类数据时,这是一个非常常见的问题。对于如何最好地处理这个问题,存在不同的观点。

一种可能的方法是对分类特征应用一个函数,以限制可能选项的集合。例如,如果你的特征包含字母表的字母,你可以为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访问),如果你创建了一个列名的数组或列表即可。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注