3.2 평균 중심화

평균 중심(Mean Centering) 정규화는 평점에서 평점 데이터의 평균을 빼주어 평점 데이터의 평균을 0으로 평균 중심으로 변환하는 것입니다. 즉, 평점 집합의 평균을 구하고 각 평점에서 평균을 뺀 값으로 정규화하는 것입니다. 이는 평균 중심화된 평점이 음수이면 원본 평점이 평균보다 낮고, 양수면 평균보다 높으며, 0인 경우에는 평균과 같다는 것을 나타냅니다. 즉 평균 평점에 비하여 개별 평점이 긍정적인지 부정적인지 판단할 수 있습니다.

또한, 평점을 평점 데이터의 평균값이 중심에 오게 이동하는 것으로 분산(Variation)은 동일하게 유지됩니다. 이렇게 평균 중심화된 평점을 표준편차로 나눠주면 다음 절에서 다룰 Z점수화가 됩니다. 평균 중심화는 전체 평점의 평균을 중심으로 변환하는 전체 평균 중심화(Grand Mean Centering)와 각 집단(사용자 또는 아이템)의 평균을 중심으로 변환하는 집단 평균 중심화(Group Mean Centering)의 두 가지 방법이 있습니다.

3.2.1 수식 살펴보기

여기에서는 전체 평점의 평균값으로 중심화하는 전체 평균 중심화와 사용자 또는 아이템의 평점을 각 집단 평점의 평균값으로 중심화하는 집단 평균 중심화에 대한 수식을 살펴봅니다.

3.2.1.1 전체 평균 중심화

전체 평균 중심화는 평점을 전체 평점의 평균값으로 중심화하는 것입니다.

전체 평균 중심화는 다음과 같이 정의됩니다.

$$ \begin{flalign} \notag \hat r_{ui} & = r_{ui} - \mu \end{flalign} $$

여기에서 $r_{ui}$은 사용자 $u$가 아이템 $i$에 매긴 평점, $\mu $은 평점 집합 $R$의 평균입니다. 정규화된 평점은 정규화 과정에서 사용된 평점 집합 $R$의 평균을 알고 있다면 역정규화 할 수 있습니다.

평균 중심으로 정규화된 평점의 역정규화는 다음과 같이 정의됩니다.

$$ \begin{flalign} \notag r_{ui} & = \hat r_{ui} + \mu \end{flalign} $$

여기에서 $\hat r_{ui}$는 평균 중심화된 평점, $\mu $은 평점 집합 $R$의 평균입니다.

3.2.1.2 사용자 평균 중심화

사용자 평균 중심화는 사용자의 평점을 사용자 그룹의 평점 평균값으로 중심화하는 것입니다.

사용자 평균 중심화는 다음과 같이 정의됩니다.

$$ \begin{flalign} \hat r_{ui} & =r_{ui} - {\mu _u} \end{flalign} $$

여기에서 $r_{ui}$은 사용자 $u$가 아이템 $i$에 매긴 평점, ${\mu _u}$은 사용자 $u$에게 평가된 아이템 집합 ${I_u}$의 평점 평균입니다. 정규화된 평점은 정규화 과정에서 사용된 아이템 집합 ${I_u}$의 평점 평균을 알고 있다면 역정규화 할 수 있습니다.

사용자 평균 중심으로 정규화된 평점의 역정규화는 다음과 같이 정의됩니다.

$$ \begin{flalign} r_{ui} & = \hat r_{ui} + {\mu _u} \end{flalign} $$

여기에서 $\hat r_{ui}$는 정규화된 평점, ${\mu _u}$은 아이템 집합 ${I_u}$의 평점 평균입니다.

3.2.1.3 아이템 평균 중심화

아이템 평균 중심화는 아이템의 평점을 아이템 그룹의 평점 평균값으로 중심화하는 것입니다.

아이템 평균 중심화는 다음과 같이 정의됩니다.

$$ \begin{flalign} \hat r_{ui} & = r_{ui} - {\mu _i} \end{flalign} $$

여기에서 $r_{ui}$은 아이템 $i$를 평가한 사용자 $u$의 평점, ${\mu _i}$은 아이템 $i$를 평가한 사용자 집합 ${U_i}$의 평점 평균입니다. 정규화된 평점은 정규화 과정에서 사용된 사용자 집합 ${U_i}$의 평점 평균을 알고 있다면 역정규화 할 수 있습니다.

아이템 평균 중심으로 정규화된 평점의 역정규화는 다음과 같이 정의됩니다.

$$ \begin{flalign} r_{ui} & = \hat r_{ui} + {\mu _i} \end{flalign} $$

여기에서 $\hat r_{ui}$는 정규화된 평점, ${\mu _i}$은 사용자 집합 ${U_i}$의 평점 평균입니다.

3.2.2 직접 계산해보기

이제부터 예제 데이터셋을 사용하여 앞서 살펴본 수식으로 직접 계산해 볼 것입니다. 다음 표는 평점 데이터를 사용자는 행, 아이템은 열로 나타낸 것입니다.

예제 데이터셋의 평점 데이터

사용자/아이템 $i_1$ $i_2$ $i_3$ $i_4$ $i_5$ $i_6$ $i_7$ $i_8$ $i_9$ $i_{10}$
$u_1$ 0.5 5 1 3 3.5 5 2.5
$u_2$ 3 2 3.5 2 4 4 1
$u_3$ 3.5 1 3.5 4 1 3.5
$u_4$ 3 5 0.5 3.5 3.5 4.5
$u_5$ 3 4 2.5 4

3.2.2.1 전체 평균 중심화

예를 들어 사용자 $u_4$가 아이템 $i_1$에 매긴 평점 3을 평균 중심화로 정규화해 봅니다. 여기에서 평점 평균은 전체 평점 데이터의 평균으로 $3$입니다. 따라서 전체 평균 중심으로 정규화된 평점은 사용자 $u_4$가 아이템 $i_1$에 매긴 평점 3에서 전체 평점 평균인 3을 뺀 0이 됩니다.

$$ \begin{flalign} {\hat r_{u_4,i_1}} & = 3 - 3 \\ & = 0 \end{flalign} $$

정규화된 평점은 정규화 과정에서 사용된 전체 평점 평균을 알고 있다면 원본 평점인 $3$으로 역정규화 할 수 있습니다.

$$ \begin{flalign} r_{u_4,i_1} & = 0 + 3 \\ & = 3 \end{flalign} $$

다음 표는 직접 계산한 결괏값을 나타낸 것입니다.

계산 결과

원본 평점 평점 평균 정규화된 평점 역정규화된 평점
3 3 0 3

같은 방법으로 전체 평균 중심화로 모두 정규화해 봅니다.

다음 표는 전체 평균 중심으로 정규화된 평점 데이터를 나타낸 것입니다.

사용자 평균 중심화 평점 데이터

아이템 $i_1$ $i_2$ $i_3$ $i_4$ $i_5$ $i_6$ $i_7$ $i_8$ $i_9$ $i_{10}$
$u_1$ -2.5 2 -2 0 0.5 2 -0.5
$u_2$ 0 -1 0.5 -1 1 1 -2
$u_3$ 0.5 -2 0.5 1 -2 0.5
$u_4$ 0 2 -2.5 0.5 0.5 1.5
$u_5$ 0 1 -0.5 1

3.2.2.2 사용자 평균 중심화

예를 들어 사용자 $u_4$가 아이템 $i_1$에 매긴 평점을 사용자 평균 중심으로 정규화해 봅니다. 다음 표는 사용자 $u_4$가 아이템에 매긴 평점을 나타낸 것입니다.

다음 표는 평점 데이터의 사용자 평점 평균을 나타낸 것입니다.

평점 데이터의 사용자 평점 평균

사용자 $u_1$ $u_2$ $u_3$ $u_4$ $u_5$
평점 평균 2.9285714 2.7857142 2.75 3.3333333 3.375

여기에서 사용자 $u_4$가 평가한 아이템의 평점 평균은 $3.3333333$입니다. 사용자 평균 중심으로 정규화된 평점은 사용자 $u_4$가 아이템 $i_1$에 매긴 평점에서 사용자 $u_4$의 평점 평균을 뺀 $- 3.3333$이 됩니다.

$$ \begin{flalign} {\hat r_{u_4,i_1}} & = 3 - 3.3333333 \\ & \approx - 0.3333 \end{flalign} $$

Tip:

여기에서는 설명의 편의상 계산 결과를 소수 자릿수 7자리(8자리부터 절사)까지만 표기합니다.

정규화된 평점은 정규화 과정에서 사용된 사용자 $u_4$가 평가한 아이템의 평점 평균을 알고 있다면 원본 평점인 $3$으로 역정규화 할 수 있습니다.

$$ \begin{flalign} r_{u_4,i_1} & = - 0.3333 + 3.3333333 \\ & \approx 3 \end{flalign} $$

다음 표는 직접 계산한 결괏값을 나타낸 것입니다.

계산 결과

원본 평점 평점 평균 정규화된 평점 역정규화된 평점
3 3.3333333 -0.3333 3

같은 방법으로 사용자 평균 중심화로 모두 정규화해 봅니다.

다음 표는 사용자 평균 중심으로 정규화된 평점 데이터를 나타낸 것입니다.

사용자 평균 중심화 평점 데이터

아이템 $i_1$ $i_2$ $i_3$ $i_4$ $i_5$ $i_6$ $i_7$ $i_8$ $i_9$ $i_{10}$
$u_1$ -2.4285714 2.0714286 -1.9285714 0.0714286 0.5714286 2.0714286 -0.4285714
$u_2$ 0.2142857 -0.7857143 0.7142857 -0.7857143 1.2142857 1.2142857 -1.7857143
$u_3$ 0.75 -1.75 0.75 1.25 -1.75 0.75
$u_4$ -0.3333333 1.6666667 -2.8333333 0.1666667 0.1666667 1.1666667
$u_5$ -0.375 0.625 -0.875 0.625

3.2.2.3 아이템 평균 중심화

예를 들어 사용자 $u_4$가 아이템 $i_1$에 매긴 평점을 아이템 평균 중심으로 정규화해 봅니다.

다음 표는 평점 데이터의 아이템 평점 평균을 나타낸 것입니다.

평점 데이터의 아이템 평점 평균

아이템 $i_1$ $i_2$ $i_3$ $i_4$ $i_5$ $i_6$ $i_7$ $i_8$ $i_9$ $i_{10}$
평점 평균 2.1666666 3.7 2.375 2 4 2.5 3.8333333 3.5 4.3333333 1.75

여기에서 아이템 $i_1$을 평가한 사용자의 평점 평균은 $2.1666666$입니다. 아이템 평균 중심으로 정규화된 평점은 아이템 $i_1$을 평가한 사용자 $u_4$의 평점에서 아이템 $i_1$의 평점 평균을 뺀 $0.8333$이 됩니다.

$$ \begin{flalign} {\hat r_{u_4,i_1}} & = 3 - 2.1666666 \\ & \approx 0.8333 \end{flalign} $$

정규화된 평점은 정규화 과정에서 사용된 아이템 $i_1$을 평가한 사용자의 평점 평균을 알고 있다면 원본 평점인 $3$으로 역정규화 할 수 있습니다.

$$ \begin{flalign} r_{u_4,i_1} & = 0.8333 + 2.1666666 \\ & \approx 3 \end{flalign} $$

다음 표는 직접 계산한 결괏값을 나타낸 것입니다.

계산 결과

원본 평점 평점 평균 정규화된 평점 역정규화된 평점
3 2.1666666 0.8333 3

같은 방법으로 아이템 평균 중심화로 모두 정규화해 봅니다.

다음 표는 아이템 평균 중심으로 정규화된 평점 데이터를 나타낸 것입니다.

아이템 평균 중심화 평점 데이터

아이템 $i_1$ $i_2$ $i_3$ $i_4$ $i_5$ $i_6$ $i_7$ $i_8$ $i_9$ $i_{10}$
$u_1$ -1.6666667 1.3 -1.375 0.5 -0.3333333 0.6666667 0.75
$u_2$ 0.8333333 -1.7 1.125 0 0 0.1666667 -0.75
$u_3$ -0.2 -1.375 1.5 0 -1.5 -0.8333333
$u_4$ 0.8333333 1.3 -1.5 1 0 0.1666667
$u_5$ -0.7 1.625 0 0.1666667

3.2.3 예제 코드 실행해보기

앞서 "직접 계산하기"에서는 예제 데이터셋의 평점 데이터를 사용하여 계산해 보았습니다. 이제부터는 데이터 파일과 예제 코드를 사용하여 "직접 계산하기"의 계산 결과에 대해 한번 더 확인해 볼 것입니다.

“직접 계산하기”의 결과

구분 사용자 아이템 원본 평점 정규화된 평점 설명
전체 평균 중심화 $u_4$ $i_1$ 3 0 평점을 전체 평점의 평균값으로 중심화
사용자 평균 중심화 $u_4$ $i_1$ 3 -0.3333333 각 사용자 그룹의 평점을 사용자 그룹의 평점 평균값으로 중심화
아이템 평균 중심화 $u_4$ $i_1$ 3 0.8333333 각 아이템 그룹의 평점을 아이템 그룹의 평점 평균값으로 중심화

3.2.3.1 구현 클래스 살펴보기

먼저 예제 코드에서 사용하는 평균 중심화가 구현된 MeanCenteringNormalizer 클래스를 살펴봅니다. MeanCenteringNormalizer 클래스는 Apache Spark ML 패키지의 추상 클래스인 Transformer 클래스를 상속받아 평점 데이터를 평균 중심화된 평점 데이터로 변환하는 transform 메서드를 구현한 클래스입니다.

다음 그림은 UML 클래스 다이어그램 표기법을 사용하여 MeanCenteringNormalizer 클래스를 클래스 다이어그램으로 나타낸 것입니다.

Download

[UML 클래스 다이어그램]

MeanCenteringNormalizer 클래스는 평균 중심화를 위해 필요한 매개변수의 설정이나 기본값 변경이 필요한 경우에는 필요에 따라 다음의 코드와 같이 빌더 패턴을 사용하여 인스턴스를 생성할 수 있습니다.

MeanCenteringNormalizer normalizer =
                new MeanCenteringNormalizer()
                        .setGroup(Group.USER)
                        .setGroupCol("user")
                        .setVerbose(true)
                        .setOutputCol("rating")
                        .setUserCol("user")
                        .setItemCol("item")
                        .setRatingCol("rating");

MeanCenteringNormalizer 클래스의 인스턴스에 설정 가능한 매개변수는 다음과 같습니다.

주요 매개변수

매개변수 유형 필수여부 기본값 설명
group Enum - 평점 정규화 기준을 Enum 유형으로 설정(기본값/null: 전체, Group.USER: 사용자, Group.ITEM: 아이템)
groupCol String - 평점 정규화 기준을 문자열로 설정(기본값/null: 전체, user: 사용자, item:아이템).
verbose boolean false 처리과정에 대한 정보를 출력할 것인지 여부 체크(기본값: false).
userCol String user 평점 데이터의 사용자 칼럼명(기본값: user)
itemCol String item 평점 데이터의 아이템 칼럼명(기본값: item)
ratingCol String rating 평점 데이터의 평점 칼럼명(기본값: rating)
outputCol String ratingCol 출력 칼럼명(기본값: ratingCol)으로 정규화된 평점

생성된 MeanCenteringNormalizer 인스턴스는 RatingNormalizer 클래스에 구현된 transform 메서드를 사용하여 평점 데이터를 입력받아 평점을 평균 중심화된 평점으로 변환할 수 있습니다.

Dataset<Row> normalizedRatingDS = normalizer.transform(ratingDS);

3.2.3.2 예제 코드 살펴보기

여기에서는 "직접 계산하기"의 계산 결과를 확인하기 위해 JUnit으로 작성된 예제 클래스의 소스 코드를 살펴봅니다. 다음은 r4tings-recommender 라이브러리에 포함된 평균 중심화 정규화를 위한 구현 클래스인 MeanCenteringNormalizer 클래스를 이용하여 "직접 계산하기"의 계산 결과를 확인하기 위한 MeanCenteringTest 클래스의 meanCenteringExamples는 테스트 메서드입니다.

MeanCenteringTest.java

소스 코드에서 볼 수 있듯이 대부분 코드는 테스트를 처리하기 위한 것이지만 기본 흐름은 매우 단순합니다. 먼저 ❶ 매개변수를 바꿔가면서 실행하고 결과를 확인하기 위한 CSV 형식의 인자 목록을 설정합니다(17~21행). 반복 실행되는 meanCenteringExamples 메서드에서는 테스트 인자들을 매개변수로 받습니다. 다음으로 ❷ Parquet 유형의 평점 데이터를 읽어 들이고(28행) ❸ MeanCenteringNormalizer 클래스의 인스턴스를 생성하여(30행~31행) ❹ 평점 데이터를 전달하여 정규화합니다(45행). 마지막으로 ❺ "직접 계산하기"에서 계산해 본 특정 사용자와 아이템에 해당하는 기댓값(Expected)과 예제 코드의 실행 결과인 실제 값(Actual)의 소수 자릿수 7자리까지 비교합니다(61행).

3.2.3.3 실행 결과 확인하기

여기에서는 앞서 살펴본 테스트 클래스인 MeanCenteringTest 클래스의 테스트 메서드인 meanCenteringExamples의 실행 결과를 살펴봅니다. 다음과 같이 명령줄 인터페이스(CLI, Command line interface)에서 빌드 도구인 Gradle Wrapper로 MeanCenteringTest 클래스의 테스트 메서드인 meanCenteringExamples를 실행해 봅니다.

./gradlew :recommender-examples:test --tests com.r4tings.recommender.examples.ch03.MeanCenteringTest.meanCenteringExamples

테스트 메서드가 실행되면 직접 계산하기에서 다룬 결과를 확인하기 위해 설정한 테스트 인자 목록을 테스트 메서드의 매개변수에 대입해가며 반복 실행되어 결과가 출력됩니다.

다음은 반복 실행 테스트를 위한 테스트 인자 목록입니다.

테스트 인자 목록

구분 데이터 경로 그룹 상세출력 사용자 아이템 정규화된 평점
전체 평균 중심화 dataset/r4tings/ratings.parquet true $u_4$ $i_1$ 0
사용자 평균 중심화 dataset/r4tings/ratings.parquet USER true $u_4$ $i_1$ -0.3333333
아이템 평균 중심화 dataset/r4tings/ratings.parquet ITEM true $u_4$ $i_1$ 0.8333333

Note:

예제 코드에서 사용되는 예제 데이터셋의 평점 데이터는 기본값에 적절한 칼럼명을 따르고 있어, 여기에서는 별도로 컬럼명 인자들(userCol, itemCol, ratingCol, outputCol)은 설정하지 않지만 상세 출력을 위한 verbose 인자는 모두 활성화(true)하여 구현 클래스의 처리 과정에서 사용되거나 파생된 정보를 로그로 출력합니다. 이를 위해 Gradle Build 스크립트의 Test 태스크의 testLogging 이벤트에 표준 출력과 표준 에러를 추가하였습니다.

예제 코드의 실행 결과는 다음과 같습니다.

예제 코드 실행 결과더보기

이 실행 결과에서 볼 수 있듯이 설정한 테스트 인자 목록에 따라 예상대로 실제 값이 반환되어 ❶ 전체 평점 중심화 ❷ 사용자 평균 중심화 ❸ 아이템 평균 중심화에 대한 테스트 케이스가 성공적으로 종료(PASSED) 되었음을 확인할 수 있습니다. 또한, 실행 결과는 "직접 계산하기"에서 계산해 본 내용을 쉽게 확인하기 위해 처리 과정에서 파생된 상세 출력 정보도 함께 보여주고 있습니다.

3.2.3.4 R 패키지로 확인해보기

다음은 R 패키지를 이용하여 "직접 계산하기"의 계산 결과를 확인하기 위해 작성된 R 스크립트입니다.

MeanCenteringTest.R

이 R 스크립트는 평균 중심화를 위한 recommenderlab 패키지의 normalize 함수를 실행하고 결과를 확인하기 위한 방법을 설명합니다. 소스 코드에서 볼 수 있듯이 기본 흐름은 매우 단순합니다. 먼저 ❶ data.table 패키지의 fread 함수를 이용하여 CSV 유형의 평점 데이터를 읽어 들이고(14행) ❷ recommenderlab 패키지에서 사용하는 realRatingMatrix 유형으로 변환하여 읽어 들인 평점 데이터를 출력합니다((31행~35행). 다음으로 ❸ 사용자 평균 중심화를 하고 정규화한 평점 데이터를 matrix 유형으로 변환하여 출력합니다(37행~41행). 같은 방법으로 ❹ 아이템 평균 중심화를 하고 정규화한 평점 데이터를 matrix 유형으로 변환하여 출력합니다(43행~47행).

Tip:

R 패키지 recommenderlab의 normalize 함수는 사용자 또는 아이템의 평점을 각 집단 평점의 평균값으로 중심화하는 정규화만 지원됩니다.

R 스크립트를 실행 후 출력된 결과는 다음과 같습니다.

R 스크립트의 실행 결과는 다음과 같습니다.

R 스크립트 실행 결과더보기

이 실행 결과에서 볼 수 있듯이 ❶ 사용자 평균 중심화와 ❷ 아이템 평균 중심화 결과를 확인할 수 있습니다. 또한, 실행 결과가 "직접 계산하기"의 계산 결과와 같음을 확인할 수 있습니다.

한글:4019 영어:3911 숫자:1158

추천 시스템: 워크북

Comments

Do you have a problem, want to share feedback, or discuss further ideas? Feel free to leave a comment here! Please follow Rust's code of conduct. This comment thread directly maps to a discussion on GitHub, so you can also comment there if you prefer.

Instead of authenticating the giscus application, you can also comment directly on GitHub.