하마가 분석하마

[팀 분석-2주차] 우승자 코드 분석 및 아이디어 도출 본문

Brightics 서포터즈

[팀 분석-2주차] 우승자 코드 분석 및 아이디어 도출

Rrohchan 2021. 8. 9. 22:06

 

안녕하세요.

Brightics 서포터즈 노승찬입니다.

[팀 분석-1주차]에는 프로젝트 소개와 데이터를 이해하는 시간을 가졌습니다.

 

이번 주차에는 우승자 코드를 브라이틱스로 구현해보면서 그 이상의 정확도를 도출하려면 어떤 방법이 필요할지 고민해보는 시간을 가지려고 합니다.

 

우승자 코드 분석 및 아이디어 도출

 

우승자 코드 분석

 

우승자 코드는 1등 코드와 3등 코드를 참고했습니다. 두 수상자의 코드를 구현해보고 해당 처리에 대한 이유를 알아보도록 하겠습니다.

 

각 수상자 코드 중에서 브라이틱스로 구현해보는 과정이 어렵거나 지금까지 해보지 못한 것, 독특한 것 등을 중심으로 포스팅을 이어가겠습니다!

 

 

수상자 코드 분석

 

1. 날짜 변수 변환

 

birth_plus, employed_plus

DAYS_BIRTH는 카드 발급일 기준 태어난 날이 음수로 표현되어 있습니다. 카드 발급일 1342일 전에 태어났다고 하면 -1342가 되는 것이지요. 때문에 이 변수에 -1을 곱한 후, 365로 나눠서 나이로 변환해줍니다.

 

고용일 (DAYS_EMPLOYED)도 태어난 날과 마찬가지로 되어있기에 일을 시작한 지 몇 연차인지 확인하기 위해 나이와 똑같은 방법으로 변환해줍니다.

 

 

2. LABEL ENCODING

 

신용카드 고객 데이터에는 범주형 변수들이 매우 많습니다. 모든 변수를 사용하지는 않을 지라도 여기 있는 범주형 변수들을 모두 원핫인코딩으로 바꿔준다면 엄청나게 많은 변수들이 생길 것입니다. 이를 방지하기 위해서 존재하는 범주형 변수들을 모두 LABEL ENCODING 해주었습니다. 26000개의 관측치 수 및 인코딩 방법을 모두 적용해 본 후 성능 비교를 통해서 인코딩 방법을 정했을 거라 추측합니다.

 

LABEL ENCODING

 

 

3. 변수 변환

 

income_total은 연봉으로 신용도의 예측에 매우 중요한 영향을 미칠 거라 예상되는 변수 중 하나입니다. 

income_total*income_total은 해당 변수를 제곱하여 새롭게 생성해주는 것입니다. 알고리즘이 변수들을 사용할 때, 중요한 변수에 가중치를 주기 위해 제곱이나 루트 등으로 데이터에 약간의 변화를 주어 새로운 변수를 생성해 줍니다.

 

밑의 income_age의 경우도 마찬가지로 중요한 변수 2개 (income_total, DAYS_BIRTH)를 곱하여 새롭게 만들어준 것입니다. 중요한 변수들끼리 곱하여 각 특징을 가진 새로운 변수를 생성한 것이지요. 

 

본 대회에서 해당 변수가 중요한지 아닌지 등의 여부는 도메인 파악과 중간중간 모델을 통한 변수 중요도를 확인해봄으로써 확인했던 것 같습니다.

 

변수 중요도

 

변수 생성

 

 

4. 변수 변환 2

 

Add Column

 

Add Column 함수의 문법은 SQL을 따릅니다. 파이썬의 연산자 혹은 함수와는 다르니 반드시 확인하셔야 해요!

 

위의 변수 변환에서 주목할 만한 것은 log(DAYS_BIRTH)입니다. 연속형 변수에 로그를 취해서 데이터를 재표현해주는 것이죠. 우리는 분석을 할 때 데이터가 어떠한 분포를 따른다는 가정하에 분석을 진행합니다. 어떤 분포를 따르지 않는다고 하면 이후 통계적 검정을 할 때 비교할 수 있는 지표가 사라집니다. 그렇기에 대부분은 정규분포를 따른다는 가정하에 분석을 진행합니다!

 

비선형 변환 전과 후

 

5. 정확도 확인

 

 

실제 대회에서는 log-loss로 평가합니다. 정확도를 기준으로 삼으면 대회 내의 정확도는 0.73 정도로 브라이틱스로 코드를 구현한 것과 조금 차이가 나는 것을 알 수 있습니다. 

 

이 이유에 대해서 생각해보면 먼저 데이터 분할 및 알고리즘 seed 넘버가 파이썬의 seed 동작과 다르기 때문이라 생각합니다. 또한 트리 개수에서 차이가 있었는데요. 파이썬의 랜덤포레스트의 경우 트리 개수를 그리는 하이퍼 파라미터로 7000개를 사용했으나 Brightics studio 내에서 60 이상으로 할 경우 에러가 나와 50개 정도만 사용이 가능했습니다.

 

이 수상자의 코드에서 아이디어를 얻어 저희가 알아낸 변수를 조합하거나 새로운 feature set으로 구성하여 스태킹을 하는 것을 최종 목표로 삼고 있습니다.

 

 

Brightics에 SQL 적용

 

brightics studio 내에서 sql을 사용해야 할 경우가 많을 수도 있습니다. 이런 경우 어떻게 적용하는지 살펴보도록 하겠습니다.

 

Add Function Column 함수를 보면 Expression Type을 정하는 옵션이 있습니다. 종류를 SQL로 지정하면 밑에서 sql문을 사용해서 변수를 생성할 수 있습니다. Floor 등 SQL내의 함수를 from 없이 그대로 사용할 수 있으니 편하게 사용하시면 됩니다!

 

 

 

Brightics에 Python 적용

 

브라이틱스 스튜디오 내에도 다양한 기능이 있으나 python의 문법을 사용해야 하는 경우도 있습니다. 이럴 경우 Python Script 함수를 사용하면 파이썬 코드를 통해 변수를 생성하는 등 다양한 작업을 할 수 있습니다.

 

앞의 함수에서 출력된 테이블을 python script 함수에서 사용하려면 옆의 inputs[0]을 클릭해주면 됩니다.

또한 필요한 라이브러리는 파이썬과 똑같이 호출하면 되며 lambda 등의 함수도 주피터 노트북과 마찬가지로 생성하면 됩니다.

 

파이썬 사용

 

다음 주차에는 앞의 분석 내용들에 팀원 들의 분석 내용을 더하여 스태킹을 해보려고 합니다.

Brightics Studio를 사용하시다가 헷갈리는 부분이 있으시면 댓글 달아주세요!

감사합니다!!

 

"Brightics 서포터즈 활동의 일환으로 작성된 포스팅입니다."