scikit learn 回归 .predict() 返回类型不一致



我正在运行三种不同的回归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    

回归函数不应该以相同的格式返回数据吗? 当我阅读文档时,它显示格式是一致的。 谁能确认我对一致返回值的期望是正确的? 然后我可以继续调试。

这是一个已知问题,最初于 2015 年报告。 当您提供具有 2 个维度 (test_y.shape=(n, 1)) 的y_array时,会出现此问题。

最简单的解决方案是在调用 .predict() 方法之前展平y_array:

test_y = test_y.flatten()

(假设test_y是一个 numpy 数组)

您可以添加一个条件,用于检查预测的输出,然后重新调整预测的输出(如果正在使用的模型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]])

相关内容

  • 没有找到相关文章

最新更新