我正在研究住房数据集,并且在尝试拟合线性回归模型时遇到如上所述的错误。完整的代码如下。 我不确定代码在哪里出错。我尝试粘贴参考书中的代码。
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) 我在这里做错了什么?请帮助
答案 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()
,则会发现问题。
解决方案
要解决此问题,您必须通过创建形状为[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
上训练,这不是事实。你想要的。