在scikitlearn中传递fit函数中y列的正确方法

2024-10-02 14:28:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道在fit函数中传递列的正确方法是什么。例如,我有:

# Lin. regression
lin_reg = LinearRegression().fit(data[["X"]], 
                                 data[["Y"]])
#Poisson regression
log_reg = PoissonRegressor().fit(data[["X"]], 
                                 data.loc[:, "Y"])

因此,在线性回归中,上面显示的行只起作用,即使我将y列作为data[["Y"]]传递。如果我在泊松回归中这样做(例如,见下文)

log_reg = PoissonRegressor().fit(data[["X"]], 
                                 data[["Y"]])

它将发出警告“当需要1d数组时传递了列向量y。请将y的形状更改为(n_samples),例如使用ravel()

现在,我想知道将y值传递给scikit learn的正确方法是什么,以及线性回归是如何不产生任何问题的

我完全知道data[["Y"]]会产生一个数据帧,所以我猜这就是区别,但我不确定为什么线性回归会接受一个数据帧,而泊松回归不会

因此,向scikit learn传递y值的正确方法是什么


Tags: 数据方法函数logdata线性scikitreg
1条回答
网友
1楼 · 发布于 2024-10-02 14:28:43

传递y的正确方法是传递类似于相应方法的指定形状的数组。所以你需要知道两件事:

1)数组是什么样的?

可以在here中找到构成类似数组的内容的引用。任何指定的对象都是有效的,可以使用。我相信没有特别的偏好,因为scikit-learn会在内部将它们转换为numpy数组

2)需要什么形状?

使用您的示例,您将看到LinearRegressionPoissonRegressorfit方法将接受不同的形状

这里是LinearRegression

y: array-like of shape (n_samples,) or (n_samples, n_targets)

下面是PoissonRegressor

y: array-like of shape (n_samples,)

因为LinearRegression确实支持多输出回归,所以它接受类似于(n_samples, n_targets)形状的数组,在您的例子中也可能类似于(n_samples, 1)。所以没有问题

另一方面PoissonRegressor只允许(n_samples,)的形状。这就是为什么它抱怨你的输入不符合规范

但是,请注意,它仍然可以工作,因为它可以将数据转换为指定的形状。但是您会得到一个警告,这样您就知道这里只使用1d数组,因为不支持(潜在的)多输出

如果要避免任何问题,请按照错误消息的建议,使用ravel将输入平坦化。例如,在您的案例中:

log_reg = PoissonRegressor().fit(data[["X"]], 
                                 data[["Y"]].values.ravel())

values返回相应的numpy数组ravel将其转换为1d数组

相关问题 更多 >