CS/Data Science

[Data Science] EPOCH_Kaggle 2주차

rngPwns 2025. 3. 19. 15:16
[4개의 정답이 모두 마지막 4개일 때]

#Prediction (예측결과)
0 0 0 1 1 1 1

#Precicion (예측의 정확도)
0 0 0 1/4 2/5 3/6 4/7

#Average Precision (예측 정확도의 평균)
(1/1 + 2/2 + 3/3 + 4/4) / 4 = 1.00

2.1 경진대회 소개

  • 산탄데르 은행은 고객 맞춤형 제품 추천 제공
  • 소수 고객에게만 다양한 추천 제공, 나머지 고객에게는 제품추천기회가 적어 불균등한 고객경험으로 이어진다. 
  • 고객의 과거 이력과 유사한 고객군들의 데이터를 기반으로 다음달에 해당 고객이 무슨 제품을 사용할지 예측하는 문제 준비
  • 더 효과적인 추천시스템을 갖추게 된다면 산탄데르는 고객이 인생의 어느 단계에 있든 모든 고객의 개인적 필요에 알맞는 제품을 추천하여 그들을 만족시킬 수 있다.

2.2 경진대회 주최자의 동기

  • 스페인의 산탄데르 그룹이 소유하고 있는 큰 은행.
  • 고객을 대상으로 예금, 적금, 대출, 신용카드, 자금 관리 및 보험 등 다양한 금융제품을 판매하며 매출 올림. 
  • 자사의 금융제품을 사용중인 고객을 대상으로, 아직 고객이 사용하고 있지 않은 다른 금융제품을 소개하여 고객의 만족도 향상+은행매출 올리고 싶어함
  • 고객 만족의 베스트 제품추천방법 : 은행의 숙련된 영업사원이 고객의 나이, 연봉, 자산, 결혼 유무, 거주지역, 성격 등의 정보를 토대로 이상적 자산계획을 세워주고 그에 알맞는 금융제품을 추천해주는 것.
    • 그러나 매일 은행을 방문하는 고객 모두에게 적절한 추천을 할 수 있는 충분한 숫자의 영업사용 고용은 현실적으로 불가능
  • 매일 은행을 방문하는 몇만명의 고객들 모두에게 1대1 맞춤 수준 금융 추천을 하기 위해 머신러닝 알고리즘을 사용하기로 함.

2.3 평가척도

  • 산탄데르 제품 추천 경진대회: 고객이 신규로 구매할 제품이 무엇인지 예측하는 경진대회
  • 신규구매제품: 지난 달에 이미 보유한 제품을 지속사용하는 것은 신규구매 x
  • 캐글에 제출해야 하는 값: '고객이 2016-05-28(지난달) 시점에 보유하고 있지 않은 금융 제품 중, 2016-06-28(이번 달)에 구매할 것으로 예측되는 제품 상위 7개' 
  • 고객 고유 식별번호인 ncodeprs와 함께 'ind'로 시작하는 24개의 금융제품 중 고객이 구매할 것으로 예상되는 제품 상위 7개를 공백으로 띄워서 저장하면 된다.
  • 이번 경진대회에서 사용되는 평가척도 : MAP@7(Mean Average Precision@7).
    • Average Precision : 예측 정확도의 평균, 1은 정답, 0은 오답 의미
#Prediction(예측결과)
1 0 0 1 1 1 0
  • 예측 결과물에 대한 정확도 측정 : 첫 번째에는 1개를 예측했을 때의 정확도가 1/1=100%, 두 번째와 세 번째는 오답 -> 0%, 4번째 예측 결과물이 정답인 경우 정확가 2/4=50%.
#Precision(예측의 정확도)
1/1 0 0 2/4 3/5 4/6 0

#Average Precision(예측 정확도의 평균)
(1/1+2/4+3/5+4/6) / 4 = 0.69
  • 예측 결과물의 Average Precision : 정확도의 합을 정답개수만큼 나눈 숫자. 
    • 예측 개수인 7이 아닌 정답개수 4로 정확도의 합을 나누는 것
    • 예측 결과물의 Average Precision은 0.69
  • Mean Average Precision : 모든 예측 결과물의 Average Precision의 평균값 의미. @7이 붙는 이유 : 최대 7개의 금융상품을 예측할 수 있다는 것 의미.
    • MAP@7의 예측 순서에 매우 예민한 평가척도. 정답을 앞쪽에 예측하는 것이 더 좋은 점수를 받을 수 있다는 뜻.
[4개의 정답이 모두 첫 4개일 때]

#Prediction (예측결과)
1 1 1 1 0 0 0

#Precision (예측의 정확도)
1/1 2/2 3/3 4/4 0 0 0

#Average Precision (예측 정확도의 평균)
(1/1 + 2/2 + 3/3 + 4/4 ) / 4 = 1.00
[4개의 정답이 모두 마지막 4개일 때]

#Prediction (예측결과)
0 0 0 1 1 1 1

#Precision(예측의 정확도)
0 0 0 1/4 2/5 3/6 4/7

#Average Precision (예측 정확도의 평균)
(1/4 + 2/5 + 3/6 + 4/7) / 4 = 0.43

 

경진대회에서 MAP@7 평가 척도를 구하기 위해 사용하는 코드

  • mapk()의 입력 값으로 들어가는 actual, predicted는 (고객 수*7)의 dimension을 갖는 list of list
  • 7개의 금융 제품명이 숫자 목록 형태로 저장되고 이러한 목록이 고객 수만큼 있는 list of list
import numpy as np

def apk(actual, predicted, k=7, default=0.0):
	# Map@7 이므로, 최대 7개만 사용
    if len(predicted) > k:
    	predicted = predicted[:k]
        
        score=0.0
        num_hits=0.0
        
        for i, p in enumerate(predicted);
        # 점수를 부여하는 조건은 다음과 같다 : 
        # 예측값이 정답에 있고 ('p in actual')
        # 예측값이 중복이 아니면 ('p not in predicted[:i]')
        if p in actual and p not in predicted[:i]:
        	num_hits += 1.0
            score += num_hits / (i+1.0)
            
            #정답 값이 공백일 경우 무조건 0.0점 반환
            if not actual;
            	return default
                
                #정답의 개수(len(actual))로 average precision을 구한다.
                return score / min(len(actual), k)
                
        def mapk(actual, predicted, k=7, default=0.0):
        	#list of list인 정답 값(actual)과 예측 값(predicted)에서 고객 별 Average Precision을 구하고 np.mean()을 통해 평균 계산
            return np.mean([apk(a, p, k, default) for a,p in zip(actual, predicted)])

 

2.4 주요 접근

  • 산탄데르 제품 추천 경진대회에서는 tabular형태의 시계열 데이터가 제공
    • 시계열 데이터: 기본적으로 'A라는 시간에 B라는 고객이 C라는 제품을 구매했다'라는 정보가 담긴 데이터.
      • 데이터에는 고객 B에 대한 다양한 정보 포함 가능. C라는 제품에 대해서도 다양한 정보 포함 가능(제품 가격, 인기도, 제품분류, 특징 등 -> 더 풍부)
  • 데이터 전처리 작업 필수
    • 데이터 노이즈 : 결측값-입력된 값이 없음을 의미, NA or nan(not a number), 이상치(outlier), 사람의 실수로 인해 잘못 입력된 값, 개인정보 보호를 위해 익명화된 변수 등
  • 피쳐 엔지니어링 필수
    • 머신러닝 모델이 좋은 성능을 얻기 위해서는 좋은 피처 엔지니어링 반드시 필요.
    • 시계열 데이터를 다루는 경진대회에서 쓰이는, 유의미 파생변수를 생성하기 위한 몇 가지 기술
      • 날짜,시간 포함 데이터: 주중/주말여부, 공휴일여부, 계절, 아침낮밤 등 다양한 파생변수
      • 과거 데이터를 활용하는 lag데이터를 파생변수로 생성 가능
      • 모든 파생변수가 모델에 유의미한 것은 x. 식별력이 있는 변수는 모델마다, 문제마다 다름 -> 모든 가능성을 시도해보는 것이 좋음
      • Tabular 형태의 시계열 데이터를 다루는 경진대회에서는 딥러닝모델보다 트리기반 앙상블모델이 더 좋은 성능을 낸다.
        • XGBoost가 가장 좋은 성능, 빠른 속도, 가장 많이 사용되는 트리모델
        • LightGBM은 마이크로소프트에서 오픈소스한 Boosting Tree 알고리즘 -> XGBoost보다 빠른 학습속도, 캐글 경진대회에서 활발하게 사용중

 

2.6 탐색적 데이터 분석

실습