我正在从sklearn.linear_model运行三个不同的回归模型。
在我的特定示例中,linear_model.LinearRegression.predict()和linear_model.Ridge.predict()都返回(1300, 1 )相同的格式。
linear_model.Lasso.predict()传递完全相同的输入数据时返回a(1300,)。这会导致程序出错,并且绘图失败。
我尝试通过使用np.shape()检查每个使用的变量来确保确实传递相同格式的数据。我已经将其追溯到.predict()的返回值。
# Crashes when .Lasso is included in mdls
# If I only have the first two in the list (LinearRegression and Ridge) it run and plots fine.
mdls=[linear_model.LinearRegression, linear_model.Ridge, linear_model.Lasso]
argdic=[{'fit_intercept':True},{'fit_intercept':True,'alpha':.5},{'fit_intercept':True,'alpha':0.1}]
i=0
for m,a in zip(mdls,argdic):
## Run regression Fit
res=m(**a).fit(xsk,ysk)
predZmesh=res.predict(meshpts)
predZact=res.predict(actpts)
reZ=ysk['Eff. At Rated Lift'].values.reshape(len(ysk['Eff. At Rated Lift']),1)
zerr=np.subtract(predZact,reZ)
zerr_r=zerr.ravel()
#Normalize the errror for colormap
nrm=colors.Normalize(vmin=zerr_r.min(),vmax=zerr_r.max())
r2=res.score(xsk,ysk)
#Setup Plot
ax=fig.add_subplot(1,len(mdls),i+1,projection='3d')
#Plot scatter of actual data points
#ax.scatter(xsk['Minor Comp. At Temp'],xsk['Major Comp. At Temp'],ysk,marker='o',alpha=0.9)
print('Shape of x,y,z,err.ravel={0},{1},{2},{3}'.format(np.shape(xsk['Minor Comp. At Temp']),np.shape(xsk['Major Comp. At Temp']),np.shape(ysk['Eff. At Rated Lift']),np.shape(zerr_r)))
ax.scatter(xsk['Minor Comp. At Temp'],xsk['Major Comp. At Temp'],ysk['Eff. At Rated Lift'],c=zerr_r,norm=nrm,cmap=plt.cm.get_cmap('RdBu'),marker='o',alpha=0.9)
ax.plot_surface(xmeshpts,ymeshpts,
predZmesh.reshape(xmeshpts.shape),color='red',alpha=0.1)
i+=1
回归函数是否应返回相同格式的数据?当我阅读文档时,它显示出一致的格式。谁能确认我对一致的返回值的期望是正确的?然后,我可以继续进行调试。
答案 0 :(得分:1)
这是a known issue,最初于2015年报告。当您提供具有2个维度(test_y.shape =(n,1))的y_array时,会发生此问题。
最简单的解决方案是在调用.predict()方法之前将y_array展平:
test_y = test_y.flatten()
(假设test_y是一个numpy数组)
答案 1 :(得分:0)
如果所使用的模型为linear_model.Lasso
,则可以添加一个条件,该条件检查并重新调整预测的输出。
以下代码可用于执行整形:x = x.reshape(-1,1)
。
这是一个简单的例子:
如果您的平面数组中没有这样的列:
x = np.array([1,2,3])
x.shape
的输出当然是(3,)
。
然后我们可以对其进行整形,以便将值存储为形状为(3,1)
的单列:
x = x.reshape(-1,1)
此后,x.shape
的输出现在为(3, 1)
。
从视觉上讲,该数组现在不再是平面列表,而是包含一列:
array([[1],
[2],
[3]])