x
からy
までの範囲でNaN
を含む可能性のある数値のリストの場合、NaN
値を無視して0と1の間で正規化するにはどうすればよいですか( NaN
のままにします)。
通常、MinMaxScaler
( ref page )をsklearn.preprocessing
から使用しますが、これはNaN
を処理できず、平均値や中央値などに基づいて値を代入することをお勧めします。すべてのNaN
値を無視するオプションはありません。
考慮してくださいpd.Series
s
s = pd.Series(np.random.choice([3, 4, 5, 6, np.nan], 100))
s.hist()
オプション1
最小最大スケーリング
new = s.sub(s.min()).div((s.max() - s.min()))
new.hist()
OPに対して何が求められたのか
これらを入れたかったので
オプション2
シグモイド
sigmoid = lambda x: 1 / (1 + np.exp(-x))
new = sigmoid(s.sub(s.mean()))
new.hist()
オプション3
tanh(双曲線正接)
new = np.tanh(s.sub(s.mean())).add(1).div(2)
new.hist()
これは別のアプローチであり、OPに正しく答えると私は信じています。唯一の違いは、これがリストではなくデータフレームで機能することです。以下のようにリストをデータフレームに簡単に配置できます。予測が行われた後、逆変換を行うためにMinMaxScalerを保存する必要があったため、他のオプションは機能しませんでした。したがって、列全体をMinMaxScalerに渡す代わりに、ターゲットと入力の両方のNaNをフィルターで除外できます。
ソリューションの例
_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']])