为啥 scikit-learn 对不同的回归器要求不同的数据形状?

Posted

技术标签:

【中文标题】为啥 scikit-learn 对不同的回归器要求不同的数据形状?【英文标题】:Why does scikit-learn demand different data shapes for different regressors?为什么 scikit-learn 对不同的回归器要求不同的数据形状? 【发布时间】:2017-06-17 18:18:40 【问题描述】:

当我使用sklearn 时,我总是发现自己在重塑我的数据,这很烦人,并且让我的代码变得丑陋。为什么不能使该库与各种数据形状一起工作,并进行适当的解释?例如,要使用线性回归器,我需要这样做

from sklearn.linear_model import LinearRegression
x = np.random.rand(10).reshape(-1,1)
y = np.random.rand(10).reshape(-1,1)
regr = LinearRegression()
regr.fit(x,y)

但如果我想使用支持向量回归器,那么我不会重塑自变量:

from sklearn.svm import SVR
x = np.random.rand(10).reshape(-1,1)
y = np.random.rand(10)
regr = SVR()
regr.fit(x,y)

我认为图书馆以这种方式设计是有原因的;谁能照亮我?

【问题讨论】:

在将x = np.random.rand(10).reshape(-1,1), y = np.random.rand(10) 与您指定的任何估算器一起使用时,我没有收到任何错误。 SVRLinearRegression 都可以将 y 与 (n,) 或 (n,1) 一起使用。 所以你可以用x=np.random.rand(10)y=np.random.rand(10) 运行上面的代码吗?当我尝试这样做时,我得到了ValueError。你用的是什么版本的scikit-learn 没有。不是XX 必须始终是 [n_samples, n_features] 的二维向量。我说的是y(这是上面sn-p 中唯一不同的代码)。 y 可以是列向量 [n_samples,1] 或只是 [n_samples,] 当我将SVRy.shape = (n_samples,1) 的列向量一起使用时,我得到一个DataConversionWarning。至于X,我仍然不清楚为什么sklearn 不会自动理解,如果我将(n,) 的形状传递给n_samples=nn_features=1 是的,我确实收到了 y 的警告。为了更清楚,我添加了一个答案。希望对你有帮助 【参考方案1】:

当您执行y = np.random.rand(10) 时,y 是[10,]一维数组。它是行向量还是列向量都没有关系。它只是一个只有一维的向量。查看this answer 和this too 以了解其背后的理念。

它是“numpy 哲学”的一部分。而 sklearn 依赖于 numpy。

至于你的评论:-

为什么 sklearn 不会自动理解,如果我将形状 (n,) 传递给它,则 n_samples=n 和 n_features=1

sklearn 可能不会仅根据 X 数据推断其 n_samples=n and n_features=1 还是其他方式 (n_samples=1 and n_features=n)。它可以完成,如果 y 被传递,这可以明确n_samples

但这意味着更改所有依赖于这种语义的代码,这可能会破坏很多东西,因为sklearn 严重依赖numpy 操作。

您可能还想查看以下讨论类似问题的链接。

https://github.com/scikit-learn/scikit-learn/issues/4509 https://github.com/scikit-learn/scikit-learn/issues/4512 https://github.com/scikit-learn/scikit-learn/issues/4466 https://github.com/scikit-learn/scikit-learn/pull/5152

【讨论】:

以上是关于为啥 scikit-learn 对不同的回归器要求不同的数据形状?的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit-learn 和 Flask 对随机森林回归器建模

scikit-learn 逻辑回归预测与自我实现不同

带权重的 Scikit-Learn 分类和回归

为啥 sklearn 中逻辑回归的等效 class_weights 会产生不同的结果?

为啥 scikit-learn SVM 分类器交叉验证这么慢?

为啥逻辑回归分类器的准确率与 k 近邻不同? [关闭]