Mam wywołany zestaw danych, spam
który zawiera 58 kolumn i około 3500 wierszy danych związanych ze spamem.
Planuję uruchomić regresję liniową dla tego zestawu danych w przyszłości, ale chciałbym wcześniej wykonać pewne wstępne przetwarzanie i ujednolicić kolumny, aby miały zerową średnią i wariancję jednostkową.
Powiedziano mi, że najlepszym sposobem na to jest R, więc chciałbym zapytać, jak mogę osiągnąć normalizację za pomocą R ? Mam już poprawnie załadowane dane i szukam tylko niektórych pakietów lub metod do wykonania tego zadania.
źródło
Zdając sobie sprawę, że pytanie jest stare i jedna odpowiedź została zaakceptowana, przedstawię inną odpowiedź w celach informacyjnych.
scale
jest ograniczony faktem, że skaluje wszystkie zmienne . Poniższe rozwiązanie pozwala skalować tylko określone nazwy zmiennych, zachowując jednocześnie inne zmienne bez zmian (a nazwy zmiennych można generować dynamicznie):co daje mi to:
i
EDYCJA 1 (2016) :
scale
Rozwiązano komentarz Juliana: wyjściem jest macierz Nx1, więc najlepiej dodać argument,as.vector
aby przekonwertować typ macierzy z powrotem na typ wektorowy. Dzięki Julian!EDYCJA 2 (2019) : Cytując komentarz Duccio A.: W najnowszym dplyr (wersja 0.8) musisz zmienić dplyr :: funcs z listą, jak
dat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
EDYCJA 3 (2020) : Dzięki @mj_whales: stare rozwiązanie jest przestarzałe i teraz musimy go użyć
mutate_at
.źródło
f(g(x))
, ładniej by wyglądało, gdyby ktoś napisałx %>% g %>% f
. Innymi słowy,dat %>% mutate_each_(funs(scale),vars=c("y","z"))
jest sprawiedliwymutate_each_(dat,funs(scale),vars=c("y","z"))
. Operator bardzo pomaga, gdy łańcuch jest bardzo długi, ponieważf(g(h(i(j(x)))))
może być bardzo trudny do odczytania.dplyr
(wersja 0.8), trzeba zmienićdplyr::funcs
zlist
, jakdat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
mutate_each_()
jest teraz przestarzałe Zamiast tego możesz użyćmutate_at()
. Nowy sposób na zrobienie tego to:dat2 <- dat %>% mutate_at(c("y", "z"), scale)
To ma 3 lata. Mimo to uważam, że muszę dodać:
Najczęstszą normalizacją jest transformacja z , w której odejmuje się średnią i dzieli przez odchylenie standardowe zmiennej. Wynik będzie miał średnią = 0 i sd = 1.
Do tego nie potrzebujesz żadnej paczki.
Otóż to.
źródło
mutate(var = (var - mean(var))/sd(var))
.myVar <- (zVar * sd(zVar)) + mean(zVar)
, prawda?newVar <- (zVar * sd(myVar)) + mean(myVar)
. Musisz użyć oryginalnego oznaczenia / sd. Jak napisałeś, pomnożysz przezsd(zVar)=1
i dodaszmean(zVar)=0
, więc nic się nie zmieni :)Pakiet „Caret” zapewnia metody wstępnego przetwarzania danych (np. Centrowanie i skalowanie). Możesz także użyć następującego kodu:
Więcej informacji: http://www.inside-r.org/node/86978
źródło
Kiedy skorzystałem z rozwiązania podanego przez Dason, zamiast otrzymać ramkę danych, otrzymałem wektor liczb (skalowane wartości mojego df).
Jeśli ktoś ma takie same problemy, musisz dodać as.data.frame () do kodu, tak jak poniżej:
Mam nadzieję, że będzie to przydatne dla ppl mającego ten sam problem!
źródło
train_dt[-24] <- scale(train_dt[-24])
gdzie „24” to numer kolumny do wykluczeniaMożesz łatwo znormalizować dane również za pomocą funkcji data.Normalization w pakiecieusterSim. Zapewnia inną metodę normalizacji danych.
Argumenty
x typ normalizacji
wektorowej, macierzowej lub zestawu danych
: n0 - bez normalizacji
n1 - standaryzacja ((x-średnia) / sd)
n2 - standaryzacja pozycyjna ((x-mediana) / mad)
n3 - ujednolicenie ((średnia x) / zakres)
n3a - ujednolicenie pozycyjne ((x-mediana) / zakres)
n4 - ujednolicenie z zerowym minimum ((x-min) / zakres)
n5 - normalizacja w zakresie <-1,1> ((x-średnia) / max (abs (x-średnia)))
n5a - normalizacja położenia w zakresie <-1,1> ((x-mediana) / max (abs (x-mediana)))
n6 - transformacja ilorazowa (x / sd)
n6a - transformacja ilorazu pozycyjnego (x / mad)
n7 - transformacja ilorazowa (x / zakres)
n8 - transformacja ilorazowa (x / max)
n9 - transformacja ilorazowa (x / średnia)
n9a - transformacja ilorazu pozycyjnego (x / mediana)
n10 - transformacja ilorazowa (x / suma)
n11 - transformacja ilorazowa (x / sqrt (SSQ))
n12 - normalizacja ((x-średnia) / sqrt (suma ((x-średnia) ^ 2)))
n12a - normalizacja pozycyjna ((x-mediana) / sqrt (suma ((x-mediana) ^ 2)))
n13 - normalizacja z punktem zerowym będącym punktem środkowym ((x-średnica) / (zakres / 2))
normalizacja
„kolumna” - normalizacja według zmiennej, „wiersz” - normalizacja według obiektu
źródło
W wersji
dplyr
0.4.4 wszystkie zmienne można skalować za pomocąmutate_all()
:Określone zmienne można wykluczyć, używając
mutate_at()
:Utworzono 24.04.2018 przez pakiet reprezentx (v0.2.0).
źródło
Ponownie, mimo że jest to stare pytanie, jest bardzo istotne! I znalazłem prosty sposób na znormalizowanie niektórych kolumn bez potrzeby żadnych pakietów:
Na przykład
Zobaczysz, że kolumny y i z zostały znormalizowane. Żadne pakiety nie są potrzebne :-)
źródło
Skali można używać zarówno dla pełnej ramki danych, jak i dla konkretnych kolumn. W przypadku określonych kolumn można użyć następującego kodu:
Pełna ramka danych
źródło
dplyr
Pakiet posiada dwie funkcje, które to zrobić.Aby mutować określone kolumny tabeli danych, możesz użyć funkcji
mutate_at()
. Aby mutować wszystkie kolumny, możesz użyćmutate_all
.Poniżej znajduje się krótki przykład użycia tych funkcji do standaryzacji danych.
Mutuj określone kolumny:
Mutuj wszystkie kolumny:
źródło
Zanim znalazłem ten wątek, miałem ten sam problem. Miałem zależne od użytkownika typy kolumn, więc napisałem
for
pętlę przechodzącą przez nie i szukającą potrzebnych kolumnscale
. Prawdopodobnie istnieją lepsze sposoby, aby to zrobić, ale to dobrze rozwiązało problem:as.vector
jest potrzebną częścią, ponieważ okazało się, żescale
marownames x 1
matrycę, która zwykle nie jest tym, co chcesz mieć w sobiedata.frame
.źródło
Skorzystaj z pakietu „Recommenderlab”. Pobierz i zainstaluj pakiet. Ten pakiet ma wbudowane polecenie „Normalizuj”. Pozwala także wybrać jedną z wielu metod normalizacji, a mianowicie „środek” lub „wynik Z”. Postępuj zgodnie z następującym przykładem:
źródło
Funkcja normalizacji z pakietu BBMisc była dla mnie właściwym narzędziem, ponieważ może radzić sobie z wartościami NA.
Oto jak z niego korzystać:
Biorąc pod uwagę następujący zestaw danych,
znormalizowane wartości można uzyskać w następujący sposób:
gdzie ręcznie obliczona metoda ignoruje colmuns zawierające NA:
(znormalizowany Człowiek tworzy listę NA ...)
w odniesieniu do wyboru konkretnych kolumn do obliczeń można zastosować ogólną metodę, taką jak ta:
źródło
@BBKim prawie dał najlepszą odpowiedź, ale można to zrobić krócej. Dziwi mnie, że nikt jeszcze tego nie wymyślił.
dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5)) dat <- apply(dat, 2, function(x) (x - mean(x)) / sd(x))
źródło