ValueError:形状(5,14)和(16,)不对齐:14(dim 1)!= 16(dim 0)

时间:2019-05-14 03:48:13

标签: python-3.x

我正在研究住房数据集,并且在尝试拟合线性回归模型时遇到如上所述的错误。完整的代码如下。 我不确定代码在哪里出错。我尝试粘贴参考书中的代码。


from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(housing_prepared, housing_labels)


some_data = housing.iloc[:5]
some_labels = housing_labels.iloc[:5]
some_data_prepared = full_pipeline.transform(some_data)
print("Predictions:\t", lin_reg.predict(some_data_prepared))

错误:ValueError:形状(5,14)和(16,)不对齐:14(dim 1)!= 16(dim 0) 我在这里做错了什么?请帮助

3 个答案:

答案 0 :(得分:0)

说明

您好,我想您正在阅读和阅读 Scikit Learn和Tensorflow上的机器学习动手书。我也遇到了这个问题。

在代码的以下部分,您将从数据集中选择前5个实例。数据集中的一个属性 ocean_proximity 是一个对象,为了使线性回归模型能够对其进行操作,必须将其转换为整数,这在本书中已完成进行一次热编码。

一种热编码通过分析可以分配给该属性的所有类别来工作,在这种情况下为5(“ <1H OCEAN”,“ INLAND”,“ NEAR OCEAN”,“ NEAR BAY”,“ ISLAND”),然后为每个实例创建一个具有该长度的矩阵,并将该矩阵中除分配了1(或另一个值)的实例类别之外的每个元素归零。例如:

如果ocean_proximity等于'<1H OCEAN',则转换为[1、0、0、0、0]

在这段代码中,您选择了数据集的前五个实例,但这并不能保证您会出现“ ocean_proximity”中的所有类别。可能只出现其中的3个或仅出现1个。因此,如果您对这5个选定的行应用一种热编码,并且仅出现3个类别(例如,仅“ INLAND”,“ ISLAND”和“ NEAR BAY”),一种热编码创建的矩阵的长度为3。

some_data = housing.iloc[:5]
some_labels = housing_labels.iloc[:5]
some_data_prepared = full_pipeline.transform(some_data)

错误只是告诉您,由于 some_data 的一次热转换创建的长度小于5的矩阵,因此 some_data_prepared 中的总列为14,因此小于 housing_prepared (16)中的列,因此该模型无法预测价格。

如果将 some_data_prepared housing_prepared 都转换为数据帧,然后调用.head(),则会发现问题。

some_data_prepared.head()

housing_prepared.head()

解决方案

要解决此问题,您必须通过创建形状为[5,x]的清零numpy数组(分别为5的行数和x的丢失的列数)并串联来创建some_data_prepared中缺少的列到some_data_prepared以匹配housing_prepared数据集的形状。

some_data = housing.iloc[:5]

some_labels = housing_labels.iloc[:5]
some_data_prepared = full_pipeline.fit_transform(some_data)

dummy_array = np.zeros((5,1))
some_data_prepared = np.c_[some_data_prepared, dummy_array]

predictions = linear_regression.predict(some_data_prepared)
print("Predictions: ", predictions)
print("Labels: ", some_labels.values)

答案 1 :(得分:0)

some_data相比,housing_prepared中缺少类别值(在这种情况下为海洋接近度)是一个问题。

housing_prepared.shape给出(16512,16),但是some_data_prepared.shape给出(5,14),因此为缺少的列添加零:

dummy_array = np.zeros((5,2))
some_data_prepared = np.c_[some_data_prepared,dummy_array]

np.zeros中的2确定列的差异

答案 2 :(得分:0)

我首先在所考虑的代码段上遇到了相同的问题。在研究了 handson-ml 存储库的问题之后,我认为我已经理解了引起此错误的细微之处。

我的猜测是(如我的情况),关闭笔记本可能会导致内存中的内容(尤其是经过训练的模型)丢失。就我而言,我可以得到结果并避免从头开始重新运行笔记本的错误。

相反,从理论上讲,绝对不要在不是训练数据的数据(例如,在fit()上)调用fit_transform()some_data。在这里,运行fit_transform(some_data),然后将伪数组堆叠到some_data_prepared是可行的,但是它迫使模型再次在some_data而不是housing_prepared上训练,这不是事实。你想要的。