期望得到的是二维数组,但实际得到的是一维数组。

3
from sklearn import MinMaxScaler, StandardScaler
import numpy as np

a = ([1,2,3],[4,5,6])
stan = StandardScaler()
mima = MinMaxScaler()
stan.fit_tranform(a)
mima.fit_transform(a)

results after runnin stan and mima

array([[-1., -1., -1.],
   [ 1.,  1.,  1.]])

array([[0., 0., 0.],
   [1., 1., 1.]])

然而,当我尝试像这样传递一个1维数组时:
b = np.random.random(10)
stan.fit_tranform(b)
mima.fit_transform(b)

我遇到了这样的错误

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/anaconda3/lib/python3.6/site-packages/sklearn/base.py", line 517, in  fit_transform
return self.fit(X, **fit_params).transform(X)
File "/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py",  line 308, in fit
return self.partial_fit(X, y) 
File "/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 334, in partial_fit
estimator=self, dtype=FLOAT_DTYPES)
File "/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py", line 441, in check_array
"if it contains a single sample.".format(array))
ValueError: Expected 2D array, got 1D array instead:
array=[0.05808361 0.86617615 0.60111501 0.70807258 0.02058449 0.96990985
0.83244264 0.21233911 0.18182497 0.18340451].
Reshape your data either using array.reshape(-1, 1) if your data has a single  feature or array.reshape(1, -1) if it contains a single sample.

在 GitHub 上有一个帖子,但是很久以前就被关闭了。有没有解决此问题的方法。


SKLearn期望输入2D数组,但你提供的是1D数组。错误提示告诉你该怎么做:“如果你的数据只有一个特征,请使用array.reshape(-1,1)进行重塑;如果它包含单个样本,请使用array.reshape(1,-1)。” - Stev
1个回答

7
首先要理解MinMaxScalar和StandardScalar在做什么。它们基于各个列的数据对值进行标准化(或缩放)。所以如果你的数据有3列: 1) MinMaxScalar将单独从每列找到最大值和最小值,并根据这些最小值和最大值缩放该列的其他值。所有列都是一样的。 2) StandardScalar同样会单独找到每个列的平均值和标准差,然后进行缩放。
然后,可以看看我在这里的回答the explanation来了解为什么它不接受1-d数组。
现在,你正在对这些标量传递一个1-d数组。它们怎么知道要缩放什么。有多少列?您是要将所有10个值作为单列处理,还是要将所有10个值视为10个单独处理的列。无论哪种情况,都必须相应地重塑数据,scikit不会处理这个。
1)如果您想将它们作为单列,请按以下方式重塑:
# Here first value -1 is for rows and second 1 for column
# This means you want the columns to be 1 and -1 
# will be configured automatically (10 in this case)
b = b.reshape(-1, 1) 

2) 如果您想要这10个值成为具有10列的单行,请按照以下步骤操作:

b = b.reshape(1, -1) 

然后你可以这样做:
stan.fit_tranform(b)

但请注意,每种情况的结果都会有所不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接