【问题标题】:sklearn normalize() produces every value as 1sklearn normalize() 将每个值生成为 1
【发布时间】:2020-03-07 17:05:17
【问题描述】:

我正在尝试将单个特征标准化为 [0, 1],但我得到的结果都是 1 的浮点值,显然是错误的。

import pandas as pd
import numpy as np
from sklearn.preprocessing import normalize

test = pd.DataFrame(data=[7, 6, 5, 2, 9, 9, 7, 8, 6, 5], columns=['data'])
normalize(test['data'].values.reshape(-1, 1))

这会产生以下输出:

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

我认为这可能是浮点数据类型的 int 问题,所以我尝试先转换为浮点,normalize(test['data'].astype(float).values.reshape(-1, 1)),但这给出了相同的结果。我错过了什么?

【问题讨论】:

    标签: python pandas scikit-learn normalization


    【解决方案1】:

    这是因为默认的axis 是 1。

    设置axis = 0:

    normalize(test['data'].values.reshape(-1, 1), axis=0)
    

    输出:

    array([[0.32998316],
           [0.28284271],
           [0.23570226],
           [0.0942809 ],
           [0.42426407],
           [0.42426407],
           [0.32998316],
           [0.37712362],
           [0.28284271],
           [0.23570226]])
    

    【讨论】:

    • 很奇怪 - 通常axis=1 对应于一个列,即我认为的一个功能,所以我认为默认值很好。我想当我使用reshape 来满足sklearn 的二维数组要求时,它现在被视为“行”/样本而不是列/特征。
    • @JulianDrago 因为它的l2 默认标准。试试norm='max' :)
    【解决方案2】:

    我觉得我们可以使用

    (test.data-test.data.min())/np.ptp(test.data.values)
    Out[136]: 
    0    0.714286
    1    0.571429
    2    0.428571
    3    0.000000
    4    1.000000
    5    1.000000
    6    0.714286
    7    0.857143
    8    0.571429
    9    0.428571
    Name: data, dtype: float64
    

    【讨论】:

    • 虽然我对基于 sklearn 的解决方案感兴趣。
    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2014-09-04
    • 2019-01-04
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多