Python 为什么scikit learn对不同的回归器要求不同的数据形状?
当我使用Python 为什么scikit learn对不同的回归器要求不同的数据形状?,python,numpy,scikit-learn,Python,Numpy,Scikit Learn,当我使用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) 但如
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)
我想图书馆是这样设计的是有原因的;有人能告诉我吗?当你做
y=np.random.rand(10)
,y是[10,]
的一维数组。不管是行向量还是列向量。它只是一个只有一维的向量。看看并理解它背后的哲学
它是“numpy哲学”的一部分。而sklearn依赖于numpy
关于你的评论:-
为什么sklearn不能自动理解,如果我传递给它形状(n,)的东西,n_samples=n,n_features=1
sklearn可能无法仅基于X数据推断其n_样本=n和n_特征=1
或其他方式(n_样本=1和n_特征=n
)。如果通过y,则可以执行此操作,这可以清楚地说明n\u样本
但这意味着更改所有依赖于此类语义的代码,这可能会破坏很多东西,因为sklearn
严重依赖于numpy
操作。
您可能还想查看以下讨论类似问题的链接
x=np.random.rand(10)。重塑(-1,1),y=np.random.rand(10)
。SVR
和LinearRegression
都可以用(n,)或(n,1)取y。因此,您可以用x=np.random.rand(10)
和y=np.random.rand(10)
运行上述操作?当我尝试这样做时,我得到一个ValueError
。您使用的是哪个版本的scikit learn
?否。不是X
X
必须始终是[n_样本,n_特征]
的二维向量。我说的是y
(这是上面代码片段中唯一不同的代码)y
可以是一个列向量[n_samples,1]
或简单地[n_samples,1]
。当我使用SVR
和一个列向量y.shape=(n_samples,1)
时,我会得到一个数据转换警告。至于X
,我仍然不清楚为什么sklearn
不能自动理解,如果我传递的是(n,)
形状的东西,那么n\u samples=n
和n\u features=1
。是的,我确实得到了y的警告。为了更清楚,我添加了一个答案。希望能有帮助