Sklearn的MinMaxScaler只返回零

时间:2014-09-17 08:50:41

标签: python scikit-learn

我正尝试使用preprocessing中的sklearn将某个数字缩放到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只包含零。我究竟做错了什么?

4 个答案:

答案 0 :(得分:6)

当我尝试使用sklearn.preprocessing中的MinMaxScaler进行缩放时遇到了同样的问题。当我使用一个numpy数组的形状作为列表时,Scaler返回零,即[1,n]。输入数组在你的情况下看起来像

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以适当的方式工作。

答案 1 :(得分:5)

这是因为数据是int32或int64,MinMaxScaler需要浮点数。试试这个:

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

答案 2 :(得分:1)

您出于某种原因将数据放入列表中,但您不应该:

data_scaled = min_max_scaler.fit_transform(data)

答案 3 :(得分:1)

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)的数组时,您显然会得到全零,因为对于数组的每个数字,您要减去该数字的均值,等于数字并除以该数字的std。如果要正确缩放数组,则应将其转换为大小为(n,1)的数组。

查看此link的正确答案: