Sklearn的MinMaxScaler只返回零

11

我正在尝试使用sklearn中的preprocessing将某个数字缩放到0-1的范围内。这是我的代码:

data = [44.645, 44.055, 44.54, 44.04, 43.975, 43.49, 42.04, 42.6, 42.46, 41.405]
min_max_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
data_scaled = min_max_scaler.fit_transform([data])
print data_scaled

但是 data_scaled 只包含零。我做错了什么?


2
你是怎么解决你的问题的?下面的答案对我没有用。 - alyssaeliyah
5个回答

22

当我尝试使用来自sklearn.preprocessing的MinMaxScaler进行缩放时,我遇到了同样的问题。当我将numpy数组的形状作为列表使用时,即[1,n],Scaler返回给我零,如下所示:

data = [[44.645, 44.055, 44.54, 44.04, 43.975, 43.49, 42.04, 42.6, 42.46, 41.405]]

我把数组的形状改为[n, 1]。在你的情况下,它应该像下面这样:

data = [[44.645], 
        [44.055], 
        [44.540], 
        [44.040], 
        [43.975], 
        [43.490], 
        [42.040], 
        [42.600], 
        [42.460], 
        [41.405]]

然后 MinMaxScaler 正常工作。


4
这是因为数据是int32或int64类型,而MinMaxScaler需要float类型的数据。尝试以下操作:
import numpy as np
data = [44.645, 44.055, 44.54, 44.04, 43.975, 43.49, 42.04, 42.6, 42.46, 41.405]
min_max_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
data_scaled = min_max_scaler.fit_transform([np.float32(data)])
print data_scaled

1
这并没有解决所提出的问题。打印数据缩放仍然返回零。 - Future2020

2
data = []
data = np.array(data)
data.append([44.645, 44.055, 44.54, 44.04, 43.975, 43.49, 42.04, 42.6, 42.46, 41.405])
min_max_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
data_scaled = min_max_scaler.fit_transform(data.reshape(10,-1))
data = data_scaled.reshape( -1, 10)
print data

这是因为当您尝试将StandardScaler对象的fit_transform方法应用于大小为(1,n)的数组时,显然会得到全零,因为对于数组中的每个数字,您都要从它减去该数字的平均值,这等于该数字并除以该数字的标准差。如果您想正确缩放您的数组,您应该将其转换为大小为(n,1)的数组。
请参见此链接的正确答案:

1

他们已经给出了正确的答案,但我使用函数numpy.vstack(<your array>)解决了我的问题,在你的问题中,你可以这样写:

import numpy as np

data = [44.645, 44.055, 44.54, 44.04, 43.975, 43.49, 42.04, 42.6, 42.46, 41.405]
min_max_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
data_scaled = min_max_scaler.fit_transform(np.vstack(data))
print(data_scaled)
#If you want to return in original format you can use 
#hstack function
data_scaled = np.hstack(data_scaled)

`


0
你正在将数据放入列表中,但其实不应该这样做:
data_scaled = min_max_scaler.fit_transform(data)

但如果我不这样做,就会出现这个错误:TypeError: 'numpy.float64'对象不支持项目分配。 - Gizmo
sklearn.__version__numpy.version.version在你的系统上显示什么?因为以上代码在我使用最新版本时可以工作。 - John Zwinck
我正在使用相同的sklearn、NumPy 1.8.1和Python 2.7.8,以及Python 3.4.1。当我运行你问题中的代码时,我得到了一个全是零的数组;当我使用我的答案中的代码时,我得到了一个非零的数组,第一个值为1,最后一个值为0,正如预期的那样。你应该在另一个系统上进行测试。 - John Zwinck

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