3.6 이진 임계화
이진 임계화(Binary Thresholding) 이진화는 주어진 임곗값(Threshold)보다 평점이 같거나 크면 1로, 그렇지 않으면 0으로 변환하는 것입니다.
3.6.1 수식 살펴보기
이진 임계화를 계산하기 위한 수식을 살펴봅니다. 이진 임계화는 전체 평점만 대상으로 사용자 또는 아이템 집단의 집단 평점을 대상으로 변환은 하지 않습니다. 또한, 평점을 임곗값 기준으로 0 또는 1로 변환하기 때문에 평점에 대한 정보가 손실되어 원본 평점으로 되돌릴 수 없습니다.
이진 임계화는 다음과 같이 정의됩니다.
여기에서 $r_{ui}$은 사용자 $u$가 아이템 $i$에 매긴 평점, $\gamma $는 임곗값입니다.
3.6.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 |
사용자 $u_4$가 아이템 $i_1$에 매긴 평점을 이진 임계화로 이진화해 봅니다. 여기에서는 임곗값을 3으로 가정합니다. 이진 임계로 이진화된 평점은 사용자 $u_4$가 아이템 $i_1$에 매긴 평점이 임곗값과 같기 때문에 1이 됩니다.
다음 표는 직접 계산한 결괏값을 나타낸 것입니다.
계산 결과
원본 평점 | 임곗값 | 이진화된 평점 |
---|---|---|
3 | 3 | 1 |
같은 방법으로 이진 임계화로 모두 이진화해 봅니다.
다음 표는 이진 임계로 이진화된 평점 데이터를 나타낸 것입니다.
[이진 임계화 평점 데이터]
아이템 | $i_1$ | $i_2$ | $i_3$ | $i_4$ | $i_5$ | $i_6$ | $i_7$ | $i_8$ | $i_9$ | $i_{10}$ |
---|---|---|---|---|---|---|---|---|---|---|
$u_1$ | 0 | 1 | 0 | 1 | 1 | 1 | 0 | |||
$u_2$ | 1 | 0 | 1 | 0 | 1 | 1 | 0 | |||
$u_3$ | 1 | 0 | 1 | 1 | 0 | 1 | ||||
$u_4$ | 1 | 1 | 0 | 1 | 1 | 1 | ||||
$u_5$ | 1 | 1 | 0 | 1 |
3.6.3 예제 코드 실행해보기
앞서 "직접 계산하기"에서는 예제 데이터셋의 평점 데이터를 사용하여 계산해 보았습니다. 이제부터는 데이터 파일과 예제 코드를 사용하여 "직접 계산하기"의 계산 결과에 대해 한번 더 확인해 볼 것입니다.
“직접 계산하기”의 계산 결과
구분 | 사용자 | 아이템 | 원본 평점 | 이진화된 평점 | 설명 |
---|---|---|---|---|---|
이진 임계화 | $u_4$ | $i_1$ | 3 | 0 | 주어진 임곗값(Threshold)보다 평점이 같거나 크면 1로, 그렇지 않은 경우에는 0으로 변환 |
사용자 이진 임계화 | 이진 임계화는 전체 평점만 대상으로 지원하지 않음 | ||||
아이템 이진 임계화 | 이진 임계화는 전체 평점만 대상으로 지원하지 않음 |
3.6.3.1 구현 클래스 살펴보기
먼저 예제 코드에서 사용하는 이진 임계화가 구현된 ThresholdBinarizer 클래스를 살펴봅니다. ThresholdBinarizer 클래스는 Apache Spark ML 패키지의 추상 클래스인 Transformer 클래스를 상속받아 평점 데이터를 이진 임계화된 평점 데이터로 변환하는 transform 메서드를 구현한 클래스입니다.
다음 그림은 UML의 클래스 다이어그램 표기법을 사용하여 ThresholdBinarizer 클래스를 클래스 다이어그램으로 나타낸 것입니다.
[UML 클래스 다이어그램]
ThresholdBinarizer 클래스는 이진 임계화를 위해 필요한 매개변수의 설정이나 기본값 변경이 필요한 경우에는 필요에 따라 다음 코드와 같이 빌더 패턴을 사용하여 인스턴스를 생성할 수 있습니다.
ThresholdBinarizer binarizer =
new ThresholdBinarizer()
.setGroup(Group.USER)
.setGroupCol("user")
.setThreshold(3)
.setVerbose(true)
.setOutputCol("rating")
.setUserCol("user")
.setItemCol("item")
.setRatingCol("rating");
ThresholdBinarizer 클래스의 인스턴스에 설정 가능한 매개변수는 다음과 같습니다.
주요 매개변수
매개변수 | 유형 | 필수여부 | 기본값 | 설명 |
---|---|---|---|---|
group | Enum | X | - | 이진 임계화 기준을 Enum 유형으로 설정(기본값/null: 전체, Group.USER: 사용자, Group.ITEM: 아이템) |
groupCol | String | X | - | 이진 임계화 기준을 문자열로 설정(기본값/null: 전체, user: 사용자, item:아이템). |
threshold | Double | O | 없음 | 임곗값 |
verbose | boolean | X | false | 처리과정에 대한 정보를 출력할 것인지 여부 체크(기본값: false). |
userCol | String | X | user | 평점 데이터의 사용자 칼럼명(기본값: user) |
itemCol | String | X | item | 평점 데이터의 아이템 칼럼명(기본값: item) |
ratingCol | String | X | rating | 평점 데이터의 평점 칼럼명(기본값: rating) |
outputCol | String | X | ratingCol | 출력 칼럼명(기본값: ratingCol)으로 이진화된 평점 |
생성된 ThresholdBinarizer 인스턴스는 RatingNormalizer 클래스에 구현된 transform 메서드를 사용하여 평점 데이터를 입력받아 평점을 이진 임계화된 평점으로 변환할 수 있습니다.
Dataset<Row> binarizedRatingDS = binarizer.transform(ratingDS);
3.6.3.2 예제 코드 살펴보기
여기에서는 "직접 계산하기"의 계산 결과를 확인하기 위해 JUnit으로 작성된 예제 클래스의 소스 코드를 살펴봅니다. 다음은 r4tings-recommender 라이브러리에 포함된 이진 임계화를 위한 구현 클래스인 ThresholdBinarizer 클래스를 이용하여 "직접 계산하기"의 계산 결과를 확인하기 위한 BinaryThresholdingTest 클래스의 binaryThresholdingExamples는 테스트 메서드입니다.
BinaryThresholdingTest.java
소스 코드에서 볼 수 있듯이 대부분의 코드는 테스트를 처리하기 위한 것이지만 기본 흐름은 매우 단순합니다. 먼저 ❶ 매개변수를 바꿔가면서 실행하고 결과를 확인하기 위한 CSV 형식의 인자 목록을 설정합니다( 20~24행). 반복 실행되는 binaryThresholdingExamples 메서드에서는 테스트 인자들을 매개변수로 받습니다. 다음으로 ❷ Parquet 유형의 평점 데이터를 읽어 들이고(32행) ❸ ThresholdBinarizer 클래스의 인스턴스 생성하여(34행~35행) ❹ 평점 데이터를 전달하여 이진화합니다(38행). 마지막으로 ❺ "직접 계산하기"에서 계산해 본 특정 사용자와 아이템에 해당하는 기댓값( Expected)과 예제 코드의 실행 결과인 실제 값(Actual)의 소수 자릿수 7자리까지 비교합니다(55행).
3.6.3.3 실행 결과 확인하기
여기에서는 앞서 살펴본 테스트 클래스인 BinaryThresholdingTest 클래스의 테스트 메서드인 binaryThresholdingExamples의 실행 결과를 살펴봅니다. 다음과 같이 명령줄 인터페이스(CLI, Command line interface)에서 빌드 도구인 Gradle Wrapper로 BinaryThresholdingTest 클래스의 테스트 메서드인 binaryThresholdingExamples를 실행해 봅니다.
./gradlew :recommender-examples:test --tests com.r4tings.recommender.examples.ch03.BinaryThresholdingTest.binaryThresholdingExamples
테스트 메서드가 실행되면 직접 계산하기에서 다룬 결과를 확인하기 위해 설정한 테스트 인자 목록을 테스트 메서드의 매개변수에 대입해가며 반복 실행되어 결과가 출력됩니다.
다음은 반복 실행 테스트를 위한 테스트 인자 목록입니다
테스트 인자 목록
구분 | 데이터 경로 | 그룹 | 상세출력 | 사용자 | 아이템 | 이진화된 평점 |
---|---|---|---|---|---|---|
전체 이진 임계화 | dataset/r4tings/ratings.parquet | true | $u_4$ | $i_1$ | 0 | |
사용자 이진 임계화 | dataset/r4tings/ratings.parquet | USER | The requested operation is not supported. - user | |||
아이템 이진 임계화 | dataset/r4tings/ratings.parquet | ITEM | The requested operation is not supported. – item |
예제 코드의 실행 결과는 다음과 같습니다.
예제 코드 실행 결과더보기
이 실행 결과에서 볼 수 있듯이 설정한 테스트 인자 목록에 따라 예상대로 실제 값이 반환되어 ❶ 전체 이진 임계화 ❷ 사용자 이진 임계화 ❸ 아이템 이진 임계화에 대한 테스트 케이스가 성공적으로 종료(PASSED) 되었음을 확인할 수 있습니다. 또한, 실행 결과는 "직접 계산하기"에서 계산해 본 내용을 쉽게 확인하기 위해 처리 과정에서 파생된 상세 출력 정보도 함께 보여주고 있습니다.
3.6.3.4 R 패키지로 확인해보기
다음은 R 패키지를 이용하여 "직접 계산하기"의 계산 결과를 확인하기 위해 작성된 R 스크립트입니다.
BinaryThresholdingTest.R
이 R 스크립트는 이진 임계화를 위한 recommenderlab 패키지의 binarize 함수를 실행하고 결과를 확인하기 위한 방법을 설명합니다. 소스 코드에서 볼 수 있듯이 기본 흐름은 매우 단순합니다. 먼저 ❶ data.table 패키지의 fread 함수를 이용하여 CSV 유형의 평점 데이터를 읽어 들이고 (14행) ❷ recommenderlab 패키지에서 사용하는 realRatingMatrix 유형으로 변환하여 읽어 들인 평점 데이터를 출력합니다((31행~33행). 다음으로 ❸ 이진 임계화를 하고 이진화한 평점 데이터를 matrix 유형으로 변환하여 출력합니다(37행~41행).
R 스크립트의 실행 결과는 다음과 같습니다.
R 스크립트 실행 결과더보기
이 실행 결과에서 볼 수 있듯이 ❶ 전체 이진 임계화 결과를 확인할 수 있습니다. 또한, 실행 결과가 "직접 계산하기"의 계산 결과와 같음을 확인할 수 있습니다.
추천 시스템: 워크북
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.