忽略NaN,在0和1之间归一化

Roc*_*e28 20 python numpy pandas scikit-learn

对于数字范围从列表xy可能包含NaN,如何可以在0和1之间的归一化,而忽略NaN的值(它们保持为NaN).

通常我会使用MinMaxScaler(ref page)sklearn.preprocessing,但是这不能处理NaN和建议根据平均值或中位数等来输入值.它不提供忽略所有NaN值的选项.

piR*_*red 12

考虑 pd.Series s

s = pd.Series(np.random.choice([3, 4, 5, 6, np.nan], 100))
s.hist()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


选项1
最小最大缩放

new = s.sub(s.min()).div((s.max() - s.min()))
new.hist()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


不是
因为我想把这些问题放在OP

选项2
sigmoid

sigmoid = lambda x: 1 / (1 + np.exp(-x))

new = sigmoid(s.sub(s.mean()))
new.hist()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


选项3
tanh(双曲正切)

new = np.tanh(s.sub(s.mean())).add(1).div(2)
new.hist()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • -1 OP通过引用"MinMaxScaler"清楚地表明他对线性缩放感兴趣.选项2和3与OP无关,在我看来,让读者感到困惑的不仅仅是帮助他们. (3认同)
  • @ user40314感谢评论您投票的原因.我将使用它来改进答案并使其更清晰. (2认同)

Chr*_*arr 5

这是另一种方法,我相信它可以正确地回答OP,唯一的区别是,此方法适用于数据框而不是列表,您可以按以下步骤轻松地将列表放入数据框。其他选项对我不起作用,因为我需要存储MinMaxScaler以便在做出预测后进行逆向变换。因此,您可以将目标和输入的NaN过滤掉,而不必将整个列传递给MinMaxScaler。

解决方案示例

import pandas as pd

import numpy as np

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler(feature_range=(0, 1))

d = pd.DataFrame({'A': [0, 1, 2, 3, np.nan, 3, 2]})

null_index = d['A'].isnull()

d.loc[~null_index, ['A']] = scaler.fit_transform(d.loc[~null_index, ['A']])