이 책은 블로그 이웃분이 서평으로 남겨서 찾아본 책이다.

원래는 "사람을 얻는 지혜"라는 책을 읽으려고 했다. 

 

학교 온라인 도서관에서 발타자르 그라시안을 검색하니 똑같은 내용인데 제목이 다른 2012년 책이 있었다. 

 

"사람을 얻는 지혜"는 재판된 도서로 예전에 "너무나 인간적이지만 현실감각 없는 당신에게" 라는 그시절 감성의 제목의 책으로 예전에 출판되었었다. 목차를 보니 완전히 똑같아 그냥 이 책을 읽기로 했다. 

 

책은 잠언록과 같다.

하나의 주제에 작가의 통찰을 담은 교휵적인 짤막한 글들이 한페이지에 담겨져 있다. 

내용 자체는 분량이 많지 않고 빈공간이 많다.

그러나 묵상하면서 읽게 되기 때문에 페이지를 넘기는 속도가 느리다. 

 

 

작가가 17세기 사람이라고 알고있는데, 인간의 본성은 변하지 않는다는것을 이 책을 읽으면서 깨달았다. 

참 생각이 많아지는 책이고 오래오래 여러번 읽으면서 (되도록 자기전 매일) 나를 갈고닦아야 겠다. 

 

 

'독서' 카테고리의 다른 글

[요약] 애덤 그랜트, '싱크 어게인'  (0) 2022.06.19

주식가격이라니, 솔깃한 테마이다. 

https://school.programmers.co.kr/learn/courses/30/lessons/42584

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

첫번째 시도

 

문제 자체는 쉽다. 

prices의 각 가격에 대해서 다음 가격부터 끝까지 검사하면 된다. 

아래와 같이 구현했는데... 

효율성테스트에서 떨어졌다. 

def solution(prices):
    # 1번째 요소는 2번째부터 처음부터 끝가지
    # 2번재 요소는 3번째부터 끝까지.... 
    # 즉 하나씩 빼면서 세기만하면됨 
    answer = [] 
    while prices:
        price = prices.pop(0)
        cnt = 0
        for elem in prices:
            if elem >= price:
                cnt += 1
            else:
                cnt += 1
                break
        answer.append(cnt)
    return answer

두번째시도

 

나를 믿지말고 라이브러리를 믿어라.

collections는 기본 라이브러리이기때문에 대부분의 코테에서 임포트 가능하다.

collections의 deque는 스택과 큐의 역할을 모두 수행할 수 있고, 이중연결리스트로 구현 되어 있다. 

때문에 큐나 스택같이 리스트의 왼쪽이나 오른쪽에 접근하는 경우 높은 효율성을 자랑한다. 

앞으로 큐/스택를 활용할 때에는 무조건 deque로 만들자.

from collections import deque
def solution(prices):
    prices=deque(prices)
    answer = [] 
    while prices:
        price = prices.popleft()
        cnt = 0
        for elem in prices:
            if elem >= price:
                cnt += 1
            else:
                cnt += 1
                break
        answer.append(cnt)
    return answer

 

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[접근법]

 

기본적인 스택 문제라고 한다. 

기본적인 스택에서 문자열 검사할 때 이렇게 접근하면 좋을거같다. 

외워두자(코테가 참 무슨의민지).

 

1. 전체 문자열을 순회(O(N))

2. 매칭쌍중 하나를 지정해서 발견할때마다 스택에 쌓기 

3. pair를 이루는 문자열 발견시 스택에서 하나씩 빼기 

4. 마지막에 스택 검사해 길이가 0이 아니면 불완전 매칭 쌍 존재 --> False 리턴 

 

def solution(s):
    stack = []
    for c in s:
        if c == '(':
            stack.append(c)
        elif len(stack) !=0 and c ==')':
            stack.pop()
        else:
            return False
    if len(stack) !=0:
        return False
    else:
        return True

 

탐색 문제를 풀기 위해서 먼저 스택과 큐에 대한 문제들에 익숙해지기로 했다. 

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

 

스택/큐로 분류된 문제인데, 사실 파이썬에서는 리스트로 다 처리할 수 있다. 

초기값을 할당하고 이전 저장 요소만 검사해 추가한다. 

복잡도는 N-1이 된다.  

해시 문제다. 

https://school.programmers.co.kr/learn/courses/30/lessons/1845

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

def solution(nums):
    pokemons={}
    for num in nums:
        pokemons[num]=pokemons.get(num,0)+1
    if len(nums)//2 > len(pokemons.keys()): 
        return len(pokemons.keys()) 
    else :
        return len(nums)//2

지난번에 배웠던 get 매서드로 초기화 한뒤 키값을 조회하면된다. 

keys()의 복잡도는 O(n)이다. 

 

베스트풀이는. 

def solution(ls):
    return min(len(ls)/2, len(set(ls)))

 

set과 min 을 썻다. 

굉장히 심플하네 

하긴 횟수 접근이 불필요하니 내 코드는 문제가 있었다. 

https://school.programmers.co.kr/learn/courses/30/lessons/76501

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

absolutes와 signs의 ordering이 같기 때문에 쉬운 문제다. 

 

def solution(absolutes, signs):
    answer = 0
    for i, sign in enumerate(signs):
        if sign:
            answer+=absolutes[i]
        else:
            answer-=absolutes[i]
    return answer

 

베스트 풀이는 한줄로 했다. 

def solution(absolutes, signs):
    return sum(absolutes if sign else -absolutes for absolutes, sign in zip(absolutes, signs))

개인적으론 저런 스타일을 싫어한다. 

https://school.programmers.co.kr/learn/courses/30/lessons/42576

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

def solution(participant, completion):
    answer = {}
    for p in participant :
        answer[p] = answer.get(p,0) +1
    for c in completion :
        answer[c] -= 1
    for a in answer:
        if answer[a]>0:
            return a

 

딕셔너리 get 함수의 유연성을 배웠다. 

keys() 매서드를 이용해 키를 조회하는 것은 O(1)이지만

불필요한 if/else 문의 사용을 줄일 수 있다. 

default 값은 키값을 조회해 없으면 default value로 초기화도 해준다.

 

그런데 베스트 풀이는 혁명적이었다. 

import collections

def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

카운터 객체에서 - 연산자가 재정의 되어 있었다. 

이것이 가능하다니!! 

참으로 유용한 기능이 아닐수 없다. 

 

  나는 원래는 컴퓨터 비전을 연구 했지만 최근 테이블 형태의 빅데이터 처리나 비즈니스 인포메틱스와 관련된 공부를 시작했다. 실제 이윤 창출에는 이쪽이 더 생산성 있는것 같다. 이것은 순전히 나의 개인 공부 기록이니 참고 정도로 활용하시면 되겠다. 많은 인터넷 자료들과 영상들을 참고하였고 그중에서도 카카오 추천팀의 자료를 많이 참고했다.

  좋은 글과 참고 코드를 공개하여 주신 카카오 추천팀에게 많은 감사를 드린다. 

 


1. 콘텐츠 기반 필터링 

- 어떤 데이터? 

데이터의 특징이 기존 소비 패턴을 지속적으로 따르는 경우 

ex) 좋아하는 작가의 만화를 계속 본다. 좋아하는 브랜드의 옷을 자주 구매한다 등.

이럴경우 기존 아이템의 정보를 활용해 추천하는 콘텐츠 기반 필터링이 적합

- 뭐라고?

그러니까, 사용자가 선택한 경험이 있는 아이템(높은 평점을 매긴 영상, 구매한 물건 등)과 

유사한특징을 가지고 있는 아이템을 추천한다. 

나와 유사한 사람이 선택한 아이템을 추천하는 협업 필터링과는 다르다.

- Strong and Weak?

사용자들의 데이터가 필요 없다. 아이템과 아이템간의 관계만 연산하면 되기 때문에 

아이템의 정보에 대한 태깅만 필요하다. 사용자가 클릭했던 상품과 연관된 아이템을 뿌려주면 된다. 

하지만 사용자가 오래 사이트를 이용했을 경우, 해당 데이터들을 활용한 협업 필터링보다 성능이 떨어진다는 인식이 있다.

때문에 소비 이력이 적은 아이템, 또는 사용자 데이터가 적을 때 제한적으로 활용.  

- 어떻게 한다고?

때문에, 각 아이템간 유사도를 연산 할 수 있어야함. 

각 아이템에 대한 정보 태그를 기록하고 원-핫 인코딩이나 임베딩 등의 방법을 활용해 

벡터화 해서 벡터 유사도를 측정하면 된다.  

그리고 벡터 유사도로 sorting해서 화면에 뿌려주면 된다.

 

벡터화 할때에는 각 데이터의 유형에 따라서 다른 방법과 전처리를 해야함. 

아래의 전처리 방법은 앞으로 다루어볼 문제들이다. 

- 숫자형 데이터들은 normalization이나 standalization을 해야한다.

- 결측치도 핸들링 해야한다. (필터를 활용한 예측, 분포를 활용한 샘플링, 데이터 먼징 등)

- 문자열은 대부분 범주형일 것이기 때문에 0~1사이로 핸들링 한다.

- 만약 상품 설명에 대한 자연어일 경우 자연어 모델을 이용해 임베딩을 뽑아낸다. 

   (BERT, GPT 등을 활용해 자연어 임베딩 추출 후 유사도 활용 등, word2vec 할바엔 이게 나을듯, 최근엔 한국어 임베딩 모델도 많이 나오고 있음)  

- 상품 추천 이라면 이미지를 활용하는 방법도 있음, 이경우 pre-trained CNN을 활용해 단순 이미지 피처를 뽑아내 

  활용할 수 있음. 요즘 각광받는 초거대 비전-언어 대조 학습으로 사전학습된 모델을 활용하면 좋을듯.  

- Similarity metric 

(1) Cosine similarity 

 

일반적으로 활용할 수 있는 가장 기본이 되는 벡터 유사도 측정 방법.

추가 정보는 아래를 참고하시길.

https://wikidocs.net/24603

 

1) 코사인 유사도(Cosine Similarity)

BoW에 기반한 단어 표현 방법인 DTM, TF-IDF, 또는 뒤에서 배우게 될 Word2Vec 등과 같이 단어를 수치화할 수 있는 방법을 이해했다면 이러한 표현 방법에 대 ...

wikidocs.net

 

(2) Jaccard vector similarity 

 

CVPR2021에서 처음 제안된 vector similarity. 

간단히 설명하자면 각도 뿐만 아니라 거리도 반영된 유사도를 획득할 수 있다. 

 

Fernando, B., & Herath, S. (2021). Anticipating human actions by correlating past with the future with jaccard similarity measures. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition(CVPR) (pp. 13224-13233).

 

구현 : https://github.com/khm159/jaccard-vector-similarity 

 

GitHub - khm159/jaccard-vector-similarity: this is unofficial implementation of Jaccard Vector Similarity

this is unofficial implementation of Jaccard Vector Similarity - GitHub - khm159/jaccard-vector-similarity: this is unofficial implementation of Jaccard Vector Similarity

github.com

 

(3) 피어슨 상관계수(Pearson correlation coefficient)

 

https://en.wikipedia.org/wiki/Pearson_correlation_coefficient

그냥 두 벡터간 normalization후 cosine similarity를 구하는 것으로 이해해도 무방.

-1 ~ 1 사이의 값으로 나오고 absolute value 는 정확히 1이 되기 때문에 similarity 로 활용 가능. 

엄범님이 잘 정리해 놓으셨다. 

 

 

2. 협업 필터링

- 뭐라고? 

  어떤 소비자가 어떤 상품 내지는 아이템을 소비한 이력이 있을 때, 유사한 소비 패턴을 보이는 다른 소비자가 좋아하는 아이템을 좋아할 가능성이 높다라고 가정한다. 사용자가 함께 소비하는 아이템을 추천할 수 있기 때문에 충분한 데이터를 확보할 수 있을경우에 더 정확한 추천이 가능하다. 

- Strong and Weak?

  사용자와 아이템간의 상호작용을 기반으로 추천한다. 때문에 컨텐츠 기반 추천 방식에서 유사도 점수가 낮은 아이템도 소비 패턴으로 발견되어 추천될 수 있다. 하지만 충분한 이용 데이터가 쌓이기 전에는 서비스에 도입하기 어렵다. 

  모델 학습이 필요하지만, 추론시에는 적은 부하가 걸린다. 

 

- 어떻게 한다고? 

메모리 기반의 방법과 모델 기반의 방법이 존재한다. 

 

(1) 메모리 기반의 방법

 

소비 이력을 저장해 놓았다가 조회하는 방식으로 구현되는 협업 필터링. 

어떤 아이템에 대한 rating이 필요하거나, 소비자의 ui에 추천 아이템을 뿌려줄 때 

소비자의 패턴과 유사한 패턴을 보인 다른 소비자들의 데이터를 조회하여 추정한다. 

전통적인 방식이다. 

 

(2) 모델 기반의 방법 

 

단순히 이전 데이터를 조회하는 방식이 아니라 

통계적 모델이나 딥 러닝을 이용해 예측하는 방식 

latent factor 방식이나 classification/regression을 수행, 또는 딥러닝을 이용한 방식이 있다. 

 

- latent factor 

 

기본적으로 벡터 유사도를 기반으로 한다는 점에서는 컨텐츠 기반 방식과 동일한 것으로 보임.

하지만 아이템-아이템간 벡터 유사도를 구하는 것과는 달리, 사용자-아이템간 유사도를 구하는것이 다른점이다.

대표적인 방법은 Matrix factorization이다.

 

 

https://blog.naver.com/PostView.naver?blogId=shino1025&logNo=222394488801

factorization은 분해를 의미하며 여기서 matrix 는 사용자와 아이템 간의 관계를 의미한다. 

사용자가 어떤 아이템들에 대해 매긴 rating 정보가 있을 때 이를 사용자별로 matrix 형태로 만들 수 있다. 

사용자는 일부 데이터에 대해서만 rating 하기 때문에 대부분 sparse 한 데이터를 획득할 것이다. 

matrix factorization은 이를 찾는 과정이라고 볼 수 있다. 

 

많은 내용들이 있는데 간단히 말하면 

 

rating matrix = M_r = (num of user * num of item)

사용자의 latent matrix를 정의하고 (M_u = num of user * D)

아이템의 latent matrix를 정의해서 (M_i = num of item * D)

M_u^T*M_i=M_r 과 같이 하나 transpose 시켜서 곱해주어서 같은 값이 되도록 업데이트 시키면 된다. 

즉 원래의 rating 이 되도록 latent matrix를 학습하면 M_u와 M_i가 학습될거고 

이 D를 이용해 사용자가 rating 하지 않은 아이템에 대해서도 예측이 가능하다! 

그리고 데이터가 쌓이면 쌓일수록 편향이 없다면 더 좋은 latent matrix가 얻어진다. 

 

rating matrix를 M_u와 M_i로 분해하는 방법이기 때문에 다양한 matrix decomposition 방식을 활용할 수 있음. 

예를들자면 SVD 

 

https://en.wikipedia.org/wiki/Singular_value_decomposition

 

Singular value decomposition - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Matrix decomposition Illustration of the singular value decomposition UΣV⁎ of a real 2×2 matrix M. Top: The action of M, indicated by its effect on the unit disc D and the two cano

en.wikipedia.org

https://en.wikipedia.org/wiki/Singular_value_decomposition#/media/File:Singular_value_decomposition_visualisation.svg

 

위 그림을 기준으로 M을 rating matrix라고 가정한다면 SVD 알고리즘을 통해서 U와 V로 분해할 수 있음 

SVD를 통해서 이 둘은 orthogonal 하기 때문에 서로 다른 특징으로 잘 분리가 가능함. 

 

많은 방법들을 사용할 수 있음. 

더 자세한 내용은 다른 포스팅으로 다룰 예정. 


사용자 데이터가 없어도 우선적으로 적용할 수 있는 방법은 콘텐츠 기반 추천이다. 다음에는 이 방법에 대해서 더 자세히 알아보겠다. 

 


Reference

[1] 카카오 추천팀 공개 레포지토리

[2] 카카오 AI 추천: 카카오의 콘텐츠 기반 필터링

[3] 카카오 AI 추천: 협업 필터링 모델 선택 시의 기준에 대하여 

 

'데이터 분석 > 머신러닝' 카테고리의 다른 글

[머신러닝] 통계적 접근과 데이터 분석  (0) 2022.07.03

※본 포스팅은 저의 공부 기록으로 틀린 부분이 있을 수 있습니다. 

 

 

 

통계적 추론(Statictical Estimation) 

 

우리가 획득하는 모든 데이터는 '수집'된 것이다. 

데이터는 현실세계에서 '추출'되며, 추출 방법과 조건에 따라서 어느정도의 '편향'을 포함하게 되어 있다. 

데이터 수집 방법과 추출 방법은 대단히 주관적이며, 수행하는 사람에 따라서 그 기준이 다를 수있다. 

어떤 항목을 수집할 것인지 정의하는 것에서 부터 시작해서, 수집 과정이 일어나는 조건까지 말이다. 

때문에 수집된 데이터는 불확실하며 무작위적인 특징을 띈다. 

 

수학적으로 정의된 통계학 기법과 함수들은 이 불확실하고 무작위적인 특징을 가진 데이터를 '간략화' 할 수 있다.

통계학적 추정과정을 통해 간략화 된 수치들은 좀더 해석가능하고 이해 가능하다. 

예를들면, 획득된 데이터가 가우시안 분포를 따른다고 가정했을 때, 표준 편차와 기대값으로 '간략화'할 수 있고, 다른 데이터 분포와도 '해석적으로' 비교할 수 있다. 

가우시안 분포의 예(출처: 위키피디아)

통계적 추론 과정은 stochastic process를 통해 생성된 데이터에 대한 의미, 그리고 도출할 수 있는 법칙에 대한 학문이다. 

데이터셋은 추출하는 과정에 추출 시점마다 새로운 확률변수로 정의되는 확률에 의해서 '추출' 되는 값들의 집합이기 때문이다. 

 

여기서 짚고 넘어가야 하는 점은, 확률과 통계가 함께 자주 나오지만 통계적 추론 과정과 확률론의 관심사가 조금은 다르다는 점이다. 확률은 관측한 데이터를 설명하는 방법론이다. 통계는 데이터를 이용해 기저 현상을 '추측'한다. 

 

- 확률은 한국인의 키 분포를 이용해 100명 중 키카 170cm 이상인 사람이 몇 명인지 추론한다.

- 통계는 100명의 키를 통계적 조사방법을 이용해 조사한 뒤 원 분포인 한국인의 키 분포를 역으로 추측한다.

즉 확률은 말그대로 어떤 것이 나타날 확률에 관심을 가진다면, 통계는 데이터를 수집해 그 뒤에 숨어 있는 보이지 않는 현상을 밝혀내려 노력한다.

 

모집단과 표본(Population and sample) 

 

통계학에서는 모집단과 표본을 엄밀히 구분한다. 모집단은 일반적으로 N으로 표기한다. 

모집단은 우리가 추정하고자 하는 원 분포이다. 

표본은 우리가 모집단으로부터 추출한 부분 집합으로 추출된 표본을 분석하여 모집단의 특징을 유추한다.

때문에 표본 추출 과정은 매우 중요하다. 만약 표본 추출 과정에 어떠한 편향이 존재했다면, 수집된 표본 공간은 모집단을 잘 대표하지 못하게 되고, 결과적으로 통계적 추정 과정으로 추정된 모집단의 분포는 실제 모집단의 분포와 달라지게 된다. 

 

마이크로소프트 선임 연구원 케이트 크로포드는 다음과 같이 말했다[1].

"여러분이 허리케인 샌디 전후에 올라온 트윗을 분석했다면, 여러분은 많은 사람이 샌디 직전에는 쇼핑을 나갔고, 샌디 진후에는 파티를 갔다고 추정했을 지 모른다. 그러나 그 트윗의 대부분은 뉴욕시 거주자들이 올린 것이었다. 뉴욕시 거주자들이 뉴저지 해안가 거주자들 보다 더 열렬한 트위터 사용자였으며, 주택 붕괴와 같은 재난을 걱정해야 했던 뉴저지 해안가 거주자 들은 트위터를 할만한 시간이 없었다." 

표본 집단이 항상 모집단이 될 수는 없다는 것을 염두해야 한다.

 

빅데이터인데 표본 추출이 필요한가?

그런데 빅데이터가 사용자의 모든 정보를 수집하고 있는데, 더이상 표본추출 이 의미가 있는가?

빅데이터가 바로 모집단과 가까운 무엇인가라고 생각할 수 있지 않을까? 

표본추출과정 없이 그냥 모든 데이터를 사용하면 안된나?

 

얼마나 많은 데이터를 추출할지는 목적에 따라 다르다. 

일반적인 분석과 추론을 목표로 하여 모델을 만들때에는 편향되지 않도록 표본추출하는 것이 필요할 수 있다.

반면 실제 서비스를 위해 사용자 UI에 데이터를 출력해 주어야 할 때에는 모든 사람의 데이터가 필요하다.

> [1]에 나온 내용인데, 뭔가 갈피를 못잡고 있는것 같아 내 생각대로 조금 변형했다. 

   표본 추출 과정을 잘 할 수 있다면, 편향을 일부 제거할 수 있고 해당 데이터로부터 모델을 도출하고 

   그 모델로 서비스 과정에서(당연히 개인 데이터는 모두 저장) 사용할 수 있다라고 나는 이해했다. 

   이과정은 주기적으로 수행되어 데이터가 늘어나면 날수록 지속적인 MLOps 가 수행될 듯 하다. 

N은 전체인가?

앞서 생각해본 문제에 이어지는 화두이다. 

일반적으로, 모집단도 어떤 다른 슈퍼집합의 부분집합이다. 

하지만, 대부분의 빅데이터 관점에서는 대규모의 빅 데이터를 수집하게 되면 더이상 기저 현상을 추측하지 않아도 된다라고 이야기 한다. 

즉 N은 전체이며, 진실이며, 충분히 많은 데이터를 수집한다면 표본 오차를 걱정할 필요가 없다는 것이다. 

 

"투표일 저녁 여론조사 기사에 제시된 사례는 심각한 반증이다. 투표소를 나오는 유권자 전원을 대상으로 여론 조사를 실시한다고 해도, 애당초 투표를 하지 않기로 결정한 사람들은 조사에 포함될 수 없다. 그리고 그들이야말로 투표에 관련된 문제를 이해하기 위해 우리가 이야기를 나누어야 할 사람일 수 있다."[1]

 

실제 서비스를 진행하는 상황에서도, 데이터로부터 예측된 결과들이 높은 만족도로 이어지지 못할 수 있다. 

 

"여러분에게는 이것이 넷플릭스에서 받은 추천이 그리 좋게 보이지 않는 정도를 의미할 수 있다. 넷플릭스의 상품과 서비스에 별점을 매기는 사람들은 대부분 젊고 당신과는 다른 취향을 가지고 있을 수 있기 때문이다."[1]

 

인과관계를 포함하지 않은 무지성 분석 

빅 데이터에서는 모든 데이터를 때려 넣고 머신 러닝 알고리즘을 돌려 데이터가 스스로를 말하게 한다. 

때문에, 머신 러닝 알고리즘으로 무지성 예측값을 출력하기 보다는 해석가능성을 보아야하며 그 기저에 숨겨져있는 현상을 생각해야한다. 

 

"가령 여러분이 지금가지 채용했던 동일한 자격의 남녀를 비교해 보기로 결정했다고 치자. 조사해 보면 여성은 남서에 비해 회사를 그만 둘 확률이 높고, 승진이 잘 되지 않으며, 근무 환경에 대해 더 욱 부정적인 소견을 말하는 경향이 있음을 알게 될 것이다."[1] 

 

물론 위의 예는 해석이 매우 용이한 경우긴 하지만, 해당 모델이 학습된 뒤 인사 평가 및 근속 년수 등을 기준으로 결론을 내리게 된다면 같은 조건의 여성 및 남성을 고용할 때 남성을 고용할 가능성이 더 높을 것이다. 

 

모형화 

 

때문에 모형화가 필요하다.(어느정도는) 실제 현상을 분석한 가정이 존재하게 되면, 더 정확한 결과를 획득할 수 있다. 

각 특징들의 피처가 어떤 관계를 가지고 있는지를 간단한 형태에서부터 복잡한 형태로(bottom-up) 해석하라. [1]

 

> 이부분에 대해서는 사람마다 생각하는관점이 다르다. 참고할 만한 여러가지 도구들이 존재하다고 생각하면 될 듯 하다. 

   [1]에서는 확률 분포를 통해서 힌트를 얻을 수 있다고 하였다. [1]에서는 주로 고전적인 통계학적 모델링을 위주로 접근한다. 

   [5]에서는 XAI 기법을 이용해 이를 도출한다. 피처 중요도를 획득하고, 부분 의존성 플롯(PDP) 등을 이용해 각 특징간 상관관계를 분석한다. 

   [4]에서는 각 필드의 값을 검증할 때 통계적 해석을 이용한다. 평균값, 최빈값, 중간값등을 이용해 검증에 사용할 수 있다. 

   

 위와 같은 다양한 도구들을 사용해 각 필드값이 어떤 의미를 가지는지, 어떤 유형인지를 확인하고, 어떻게 인코딩하고, 어떤 머신러닝 알고리즘을 사용할 지를 고민해야 한다. (사실 대부분 전처리 과정이 전부이다.)

 

 

Reference

===========

- [1] 레이첼 슈트, "데이터과학 입문", 한빛미디어.

- [2] 조우쯔화, "단단한 머신러닝", 제이펍.

- [3] 필드 케이디, "처음 배우는 데이터과학", 한빛미디어.

- [4] 이든 맥컬럼, "나쁜 데이터 핸드북", O'REILLY.

- [5] 안재현, "XAI 설명 가능한 인공지능, 인공지능을 해부하다", 위키북스.

'데이터 분석 > 머신러닝' 카테고리의 다른 글

[추천엔진] 1. 추천 알고리즘의 종류  (0) 2022.07.23

+ Recent posts