为啥 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)
与您指定的任何估算器一起使用时,我没有收到任何错误。 SVR
和 LinearRegression
都可以将 y 与 (n,) 或 (n,1) 一起使用。
所以你可以用x=np.random.rand(10)
和y=np.random.rand(10)
运行上面的代码吗?当我尝试这样做时,我得到了ValueError
。你用的是什么版本的scikit-learn
?
没有。不是X
。 X
必须始终是 [n_samples, n_features]
的二维向量。我说的是y
(这是上面sn-p 中唯一不同的代码)。 y
可以是列向量 [n_samples,1]
或只是 [n_samples,]
。
当我将SVR
与y.shape = (n_samples,1)
的列向量一起使用时,我得到一个DataConversionWarning
。至于X
,我仍然不清楚为什么sklearn
不会自动理解,如果我将(n,)
的形状传递给n_samples=n
和n_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 对随机森林回归器建模
为啥 sklearn 中逻辑回归的等效 class_weights 会产生不同的结果?