spam
스팸 메시지와 관련된 58 열과 약 3500 행의 데이터를 포함 하는 데이터 세트 가 있습니다.
앞으로이 데이터 세트에서 선형 회귀를 실행할 계획이지만 사전 처리를 수행하고 평균 및 단위 분산이 0이 아닌 열을 표준화하고 싶습니다.
이 문제를 해결하는 가장 좋은 방법은 R을 사용한다는 것 입니다 .R로 정규화를 달성하는 방법 을 묻고 싶습니다 . 이미 데이터를 올바르게로드했으며이 작업을 수행 할 패키지 나 방법을 찾고 있습니다.
답변
평균 0과 표준 편차 1을 원한다고 가정해야합니다. 데이터가 데이터 프레임에 있고 모든 열이 숫자 scale
이면 데이터 에서 함수를 호출하여 원하는 것을 수행 할 수 있습니다.
dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5))
scaled.dat <- scale(dat)
# check that we get mean of 0 and sd of 1
colMeans(scaled.dat) # faster version of apply(scaled.dat, 2, mean)
apply(scaled.dat, 2, sd)
내장 함수를 사용하는 것이 고급입니다. 이 고양이처럼 :
답변
질문이 오래되었고 하나의 답변이 수락됨을 알기 위해 참고할 다른 답변을 제공하겠습니다.
scale
모든 변수의 크기를 조정한다는 사실에 의해 제한됩니다 . 아래의 솔루션을 사용하면 다른 변수는 변경하지 않고 특정 변수 이름 만 확장 할 수 있습니다 (변수 이름은 동적으로 생성 될 수 있음).
library(dplyr)
set.seed(1234)
dat <- data.frame(x = rnorm(10, 30, .2),
y = runif(10, 3, 5),
z = runif(10, 10, 20))
dat
dat2 <- dat %>% mutate_at(c("y", "z"), ~(scale(.) %>% as.vector))
dat2
이것은 나에게 이것을 준다 :
> dat
x y z
1 29.75859 3.633225 14.56091
2 30.05549 3.605387 12.65187
3 30.21689 3.318092 13.04672
4 29.53086 3.079992 15.07307
5 30.08582 3.437599 11.81096
6 30.10121 4.621197 17.59671
7 29.88505 4.051395 12.01248
8 29.89067 4.829316 12.58810
9 29.88711 4.662690 19.92150
10 29.82199 3.091541 18.07352
과
> dat2 <- dat %>% mutate_at(c("y", "z"), ~(scale(.) %>% as.vector))
> dat2
x y z
1 29.75859 -0.3004815 -0.06016029
2 30.05549 -0.3423437 -0.72529604
3 30.21689 -0.7743696 -0.58772361
4 29.53086 -1.1324181 0.11828039
5 30.08582 -0.5946582 -1.01827752
6 30.10121 1.1852038 0.99754666
7 29.88505 0.3283513 -0.94806607
8 29.89067 1.4981677 -0.74751378
9 29.88711 1.2475998 1.80753470
10 29.82199 -1.1150515 1.16367556
편집 1 (2016) : Julian의 의견에 따르면 : 출력 scale
은 Nx1 행렬이므로 이상적으로 as.vector
행렬 유형을 다시 벡터 유형으로 변환 하려면를 추가해야합니다 . 줄리안 감사합니다!
편집 2 (2019) : 인용 Duccio A.의 의견 : 최신 dplyr (버전 0.8)의 경우 다음과 같이 목록으로 dplyr :: funcs를 변경해야합니다dat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
편집 3 (2020) : @mj_whales 덕분에 : 이전 솔루션은 더 이상 사용되지 않으므로 이제 사용해야 mutate_at
합니다.
답변
이것은 3 살입니다. 여전히 다음을 추가해야한다고 생각합니다.
가장 일반적인 정규화는 평균을 빼고 변수의 표준 편차로 나누는 z 변환 입니다. 결과는 mean = 0이고 sd = 1입니다.
이를 위해 패키지가 필요하지 않습니다.
zVar <- (myVar - mean(myVar)) / sd(myVar)
그게 다야.
답변
‘Caret’패키지는 데이터 전처리 방법 (예 : 중심 및 스케일링)을 제공합니다. 다음 코드를 사용할 수도 있습니다.
library(caret)
# Assuming goal class is column 10
preObj <- preProcess(data[, -10], method=c("center", "scale"))
newData <- predict(preObj, data[, -10])
답변
Dason이 언급 한 솔루션을 사용했을 때 결과적으로 데이터 프레임을 얻는 대신 숫자 벡터 (df의 배율 값)를 얻었습니다.
누군가 같은 문제가 발생하면 다음과 같이 as.data.frame ()을 코드에 추가해야합니다.
df.scaled <- as.data.frame(scale(df))
이것이 동일한 문제를 가진 ppl에 유용 할 수 있기를 바랍니다!
답변
clusterSim 패키지의 data.Normalization 함수를 사용하여 데이터를 쉽게 정규화 할 수 있습니다. 다른 데이터 정규화 방법을 제공합니다.
data.Normalization (x,type="n0",normalization="column")
인수
x
벡터, 행렬 또는 데이터 세트 유형
정규화 : n0-정규화 없음
n1-표준화 ((x-mean) / sd)
n2-위치 표준화 ((x-median) / mad)
n3-단위 화 ((x-mean) / range)
n3a-위치 단위 화 ((x-median) / 범위)
n4-최소값이 0 인 단위 ((x-min) / 범위)
n5-<-1,1> 범위의 정규화 ((x-mean) / max (abs (x-mean)))
n5a-<-1,1> 범위의 위치 정규화 ((x-median) / max (abs (x-median)))
n6-몫 변환 (x / sd)
n6a-위치 몫 변환 (x / mad)
n7-몫 변환 (x / range)
n8-몫 변환 (x / max)
n9-몫 변환 (x / mean)
n9a-위치 몫 변환 (x / median)
n10-몫 변환 (x / sum)
n11-몫 변환 (x / sqrt (SSQ))
n12-정규화 ((x-mean) / sqrt (sum ((x-mean) ^ 2)))
n12a-위치 정규화 ((x-median) / sqrt (sum ((x-median) ^ 2)))
n13-중심점이 0 인 정규화 ((x-midrange) / (range / 2))
정규화
“열”-변수 별 정규화, “행”-객체 별 정규화
답변
함께 dplyr
v0.7.4 모든 변수를 사용하여 확장 할 수 있습니다 mutate_all()
:
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library(tibble)
set.seed(1234)
dat <- tibble(x = rnorm(10, 30, .2),
y = runif(10, 3, 5),
z = runif(10, 10, 20))
dat %>% mutate_all(scale)
#> # A tibble: 10 x 3
#> x y z
#> <dbl> <dbl> <dbl>
#> 1 -0.827 -0.300 -0.0602
#> 2 0.663 -0.342 -0.725
#> 3 1.47 -0.774 -0.588
#> 4 -1.97 -1.13 0.118
#> 5 0.816 -0.595 -1.02
#> 6 0.893 1.19 0.998
#> 7 -0.192 0.328 -0.948
#> 8 -0.164 1.50 -0.748
#> 9 -0.182 1.25 1.81
#> 10 -0.509 -1.12 1.16
다음을 사용하여 특정 변수를 제외 할 수 있습니다 mutate_at()
.
dat %>% mutate_at(scale, .vars = vars(-x))
#> # A tibble: 10 x 3
#> x y z
#> <dbl> <dbl> <dbl>
#> 1 29.8 -0.300 -0.0602
#> 2 30.1 -0.342 -0.725
#> 3 30.2 -0.774 -0.588
#> 4 29.5 -1.13 0.118
#> 5 30.1 -0.595 -1.02
#> 6 30.1 1.19 0.998
#> 7 29.9 0.328 -0.948
#> 8 29.9 1.50 -0.748
#> 9 29.9 1.25 1.81
#> 10 29.8 -1.12 1.16
2018-04-24에 reprex 패키지 (v0.2.0)로 작성되었습니다.