为什么我需要在这种情况下使用 ravel()?

问题描述

我真的很困惑为什么在将数据拟合到 SGDRegressor 之前需要使用 ravel()。

这是代码

from sklearn.linear_model import SGDRegressor
sgd_reg = SGDRegressor(max_iter = 1000,tol = 1e-3,penalty = None,eta0= 0.1)
sgd_reg.fit(X,y.ravel())

这些是 X 和 y 的形状:

>>> X.shape
(100,1)

>>> y.shape
(100,1)

>>> y.ravel().shape
(100,)

解决方法

y 视为二维矩阵,尽管它只有一列。但是 fit 方法期望 y 是一个平面数组。这就是为什么您必须使用 ravel 将 2d 转换为 1d 数组。

在机器学习论文和教科书中,将 y 写成矩阵是很常见的,因为它可以在矩阵相乘时简化表示法。但是你也可以把它写成一个简单的一维向量。你可以说它没有区别,因为在这两种情况下它实际上只有一个维度,但在数学上和 Python 实现中,矩阵和向量是两个不同的对象。