Roc*_*e28 20 python numpy pandas scikit-learn
对于数字范围从列表x
到y
可能包含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)
这是另一种方法,我相信它可以正确地回答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']])
归档时间: |
|
查看次数: |
7296 次 |
最近记录: |