【问题标题】:Sklearn's MinMaxScaler only returns zerosSklearn 的 MinMaxScaler 只返回零
【发布时间】:2014-11-11 05:26:39
【问题描述】:

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

【问题讨论】:

  • 您是如何解决问题的?下面的答案对我不起作用。

标签: python scikit-learn


【解决方案1】:

当我尝试使用 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 以正确的方式工作。

【讨论】:

    【解决方案2】:

    这是因为 data 是 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
    

    【讨论】:

    • 这并不能解决所提出的问题。打印 data_scaled 仍然返回零
    【解决方案3】:

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

    data_scaled = min_max_scaler.fit_transform(data)
    

    【讨论】:

    • 但是如果我不这样做就会出现这个错误:TypeError: 'numpy.float64' object does not support item assignment
    • sklearn.__version__numpy.version.version 在您的系统上说什么?因为上面的代码适用于我的最新版本。
    • 我使用的是相同的 sklearn、NumPy 1.8.1、Python 2.7.8 和 Python 3.4.1。当我在你的问题中运行代码时,我得到一个零数组;当我在答案中使用该行时,我得到了一个非零数组,第一个值为 1,最后一个值为 0。您应该在另一个系统上进行测试。
    【解决方案4】:
    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) 的数组。

    看这个link的正确答案:

    【讨论】:

      猜你喜欢
      • 2018-03-15
      • 1970-01-01
      • 2022-12-16
      • 2021-03-17
      • 2018-04-15
      • 2019-11-23
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多