2016-09-28 20 views
12

Listę numerów od x do y które mogą zawierać NaN, jak mogę normalizacji między 0 a 1, ignorując wartości NaN (pozostają one jako NaN).Normalizacja między 0 a 1 ignorując NaN

Zazwyczaj użyłbym MinMaxScaler (ref page) od sklearn.preprocessing, ale to nie może obsłużyć NaN i zaleca przypisanie wartości oparte na średniej lub mediany itp nie oferuje możliwość ignorowania wszystkie wartości NaN.

+5

Zastosowanie '' np.nanmin' np.nanmax' i zamiast 'np.max' i' np.min', reszta powinna działać prawidłowo. –

+4

Więc, w zasadzie: '(a-np.nanmin (a))/(np.nanmax (a) - np.nanmin (a))'. – Divakar

+1

pandy również z wdziękiem radzą sobie z 'NaN's, więc proste zadanie (a - a.min())/(a.max() - a.min()) wykonuje zadanie. –

Odpowiedz

7

rozważyć pd.Seriess

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

enter image description here


Wariant 1
Min Max skalowania

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

enter image description here


NIE CO OP hasła
umieścić w nich, ponieważ chciałem

Opcja 2
esicy

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

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

enter image description here


Wariant 3
tanh (tangens hiperboliczny)

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

enter image description here

+2

-1 PO wyraźnie wskazywał, że był zainteresowany skalowaniem liniowym poprzez odniesienie do "MinMaxScaler". Opcje 2 i 3 są nieistotne dla PO, a mylić czytelnika bardziej niż pomóc im w mojej opinii. – user40314

+2

@ user40314 Kudos za komentowanie przyczyn odrzucenia głosowania. Wykorzystam to, aby poprawić odpowiedź i uczynić ją bardziej zrozumiałą. – piRSquared

+0

Ktokolwiek kiedykolwiek głosował tę odpowiedź. Byłbym wdzięczny za wyjaśnienie. Zostało to zmienione, aby zapewnić to, co OP chciał i został zaakceptowany. – piRSquared

0

Oto inne podejście, a jeden, że wierzę odpowiedzi OP poprawnie, tylko Różnica polega na tym, że działa to w przypadku ramki danych zamiast listy, którą można łatwo umieścić twoja lista w ramce danych, jak to zrobiono poniżej. Inne opcje nie działały dla mnie, ponieważ musiałem przechowywać MinMaxScaler w celu odwrócenia transformacji po dokonaniu prognozy. Zamiast więc przekazywać całą kolumnę do MinMaxScalera, możesz odfiltrować NaN zarówno dla celu, jak i dla wejścia.

Przykład rozwiązania

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']])

Powiązane problemy