web-dev-qa-db-ja.com

NaNを無視して0と1の間で正規化する

xからyまでの範囲でNaNを含む可能性のある数値のリストの場合、NaN値を無視して0と1の間で正規化するにはどうすればよいですか( NaNのままにします)。

通常、MinMaxScalerref page )をsklearn.preprocessingから使用しますが、これはNaNを処理できず、平均値や中央値などに基づいて値を代入することをお勧めします。すべてのNaN値を無視するオプションはありません。

20
RockJake28

考慮してくださいpd.Seriess

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

enter image description here


オプション1
最小最大スケーリング

new = s.sub(s.min()).div((s.max() - s.min()))
new.hist()

enter image description here


OPに対して何が求められたのか
これらを入れたかったので

オプション2
シグモイド

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

new = sigmoid(s.sub(s.mean()))
new.hist()

enter image description here


オプション3
tanh(双曲線正接)

new = np.tanh(s.sub(s.mean())).add(1).div(2)
new.hist()

enter image description here

12
piRSquared

これは別のアプローチであり、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']])

4
Chris Farr