R) 전처리 - 정규화

R) 전처리 - 정규화

군집분석, 추천시스템 등 각 데이터간 거리를 측정하는 경우 정규화(normalization) 전처리를 사전에 하는 것이 좋다. 이와 관련해서 알아보자.

개요

정규화는 데이터간 단위가 달라 객관적인 비교가 어렵거나, 특정 지수 산출값을 직관적으로 보기 위하여 사용하는 경우가 많다. 특히 전자의 사유로 군집분석이나 추천시스템 등 거리계산 알고리즘을 사용하는 경우 그 결과가 편향될 수 있어 보통 모델링 이전에 정규화를 진행한다.


이론

Min-Max Scaling

최대값과 최소값을 사용하여 원 데이터의 최소값을 0, 최대값을 1로 만드는 방법이다. 여기에 100을 곱하여 지표관리 등 다양한 곳에 활용하기도 한다.

$$MinMax(x) = \frac{x - min(x)}{max(x) - min(x)}$$

Standardization

평균과 표준편차를 사용하여 평균이 0, 표준편차를 1로 만드는 방법이다.

$$Standardization(x) = \frac{x - mean(x)}{sd(x)}$$

데이터

실습할 데이터는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
df_sample = data.frame(aa = 1:10,
bb = 4:13)
df_sample
## aa bb
## 1 1 4
## 2 2 5
## 3 3 6
## 4 4 7
## 5 5 8
## 6 6 9
## 7 7 10
## 8 8 11
## 9 9 12
## 10 10 13

사용자 정의 함수

각 정규화의 수식을 참고하여 사용자 정의 함수를 만들어본 예시는 다음과 같다.

Min-Max Scaling

최대값과 최소값을 산출하는 함수 max()min() 함수를 활용하며 다음과 같다.

1
2
3
4
nor_minmax = function(x){
result = (x - min(x)) / (max(x) - min(x))
return(result)
}

여기서 return() 함수와 “result” 객체는 굳이 사용할 필요는 없으며 생략해도 된다.

nor_minmax() 사용자 정의 함수 사용 결과는 다음과 같다.

1
2
3
nor_minmax(df_sample$aa)
## [1] 0.0000000 0.1111111 0.2222222 0.3333333 0.4444444
## [6] 0.5555556 0.6666667 0.7777778 0.8888889 1.0000000

apply() 함수에 적용해보자.

1
2
3
4
5
6
7
8
9
10
11
12
apply(X = df_sample, MARGIN = 2, FUN = "nor_minmax")
## aa bb
## [1,] 0.0000000 0.0000000
## [2,] 0.1111111 0.1111111
## [3,] 0.2222222 0.2222222
## [4,] 0.3333333 0.3333333
## [5,] 0.4444444 0.4444444
## [6,] 0.5555556 0.5555556
## [7,] 0.6666667 0.6666667
## [8,] 0.7777778 0.7777778
## [9,] 0.8888889 0.8888889
## [10,] 1.0000000 1.0000000

입력이 데이터프레임이라도 결과가 matrix로 떨어지니 주의하도록 하자.

Standardization

평균과 표준편차를 산출하는 함수 mean()sd() 함수를 활용하며 다음과 같다.

1
2
3
4
nor_sd = function(x){
result = (x - mean(x)) / sd(x)
return(result)
}

여기서 return() 함수와 “result” 객체는 굳이 사용할 필요는 없으며 생략해도 된다.

nor_sd() 사용자 정의 함수 사용 결과는 다음과 같다.

1
2
3
4
nor_sd(df_sample$aa)
## [1] -1.4863011 -1.1560120 -0.8257228 -0.4954337
## [5] -0.1651446 0.1651446 0.4954337 0.8257228
## [9] 1.1560120 1.4863011

apply() 함수에 적용해보자.

1
2
3
4
5
6
7
8
9
10
11
12
apply(X = df_sample, MARGIN = 2, FUN = "nor_sd")
## aa bb
## [1,] -1.4863011 -1.4863011
## [2,] -1.1560120 -1.1560120
## [3,] -0.8257228 -0.8257228
## [4,] -0.4954337 -0.4954337
## [5,] -0.1651446 -0.1651446
## [6,] 0.1651446 0.1651446
## [7,] 0.4954337 0.4954337
## [8,] 0.8257228 0.8257228
## [9,] 1.1560120 1.1560120
## [10,] 1.4863011 1.4863011

입력이 데이터프레임이라도 결과가 matrix로 떨어지니 주의하도록 하자.

장단점

코드 운용에 있어서 패키지 의존도를 떨어뜨리는 것은 유지보수하기 용이하지만, 정규화 작업을 위와 같은 단순한 사용자 정의 함수로 처리할 경우 그 활용에 한계가 있다. 즉, 머신러닝을 할 때 학습(train) 데이터 세트의 규칙을 평가(test) 세트에 적용할 수 없다는 것이다. 이를 위해서는 최초 정규화에 사용한 규칙(최대, 최소, 평균, 표준편차 등)을 별도의 객체에 저장했다가 뽑아쓰고 해야되는데 여간 귀찮은 일이 아니다. 그래서 caret 패키지의 preProcess() 함수를 활용한다.


caret 패키지

머신러닝에 많이 활용되는 caret 패키지의 preProcess() 함수를 활용하기 위해 우선 패키지를 불러오자.

1
library("caret")

preProcess() 함수는 입력하는 데이터와 정규화 방법론을 기반으로 정규화 규칙이 담겨있는 정보를 반환한다. 이를 별도의 객체에 저장하고 해당 객체와 해당 객체의 규칙을 적용할 데이터 세트를 기본함수인 predict() 함수에 할당하면 정규화된 데이터가 산출됨을 확인할 수 있다.


Min-Max Scaling

“method” 인자에 “range”를 할당하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
model_minmax = preProcess(x = df_sample, method = "range")
predict(model_minmax, df_sample)
## aa bb
## 1 0.0000000 0.0000000
## 2 0.1111111 0.1111111
## 3 0.2222222 0.2222222
## 4 0.3333333 0.3333333
## 5 0.4444444 0.4444444
## 6 0.5555556 0.5555556
## 7 0.6666667 0.6666667
## 8 0.7777778 0.7777778
## 9 0.8888889 0.8888889
## 10 1.0000000 1.0000000

Standardization

“method” 인자에 “center”를 할당하면 중심을 맞춰주고(원 자료에 자료의 평균을 빼버림), “scale”을 할당하면 표준편차로 나누기 때문에 두 방법을 같이 적용하면 표준화(standardization)를 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
model_sd = preProcess(x = df_sample, method = c("center", "scale"))
predict(model_sd, df_sample)
## aa bb
## 1 -1.4863011 -1.4863011
## 2 -1.1560120 -1.1560120
## 3 -0.8257228 -0.8257228
## 4 -0.4954337 -0.4954337
## 5 -0.1651446 -0.1651446
## 6 0.1651446 0.1651446
## 7 0.4954337 0.4954337
## 8 0.8257228 0.8257228
## 9 1.1560120 1.1560120
## 10 1.4863011 1.4863011
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×