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
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
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
나는 원래는 컴퓨터 비전을 연구 했지만 최근 테이블 형태의 빅데이터 처리나 비즈니스 인포메틱스와 관련된 공부를 시작했다. 실제 이윤 창출에는 이쪽이 더 생산성 있는것 같다. 이것은 순전히 나의 개인 공부 기록이니 참고 정도로 활용하시면 되겠다. 많은 인터넷 자료들과 영상들을 참고하였고 그중에서도 카카오 추천팀의 자료를 많이 참고했다.
좋은 글과 참고 코드를 공개하여 주신 카카오 추천팀에게 많은 감사를 드린다.
1. 콘텐츠 기반 필터링
- 어떤 데이터?
데이터의 특징이 기존 소비 패턴을 지속적으로 따르는 경우
ex) 좋아하는 작가의 만화를 계속 본다. 좋아하는 브랜드의 옷을 자주 구매한다 등.
이럴경우 기존 아이템의 정보를 활용해 추천하는 콘텐츠 기반 필터링이 적합
- 뭐라고?
그러니까, 사용자가 선택한 경험이 있는 아이템(높은 평점을 매긴 영상, 구매한 물건 등)과
유사한특징을 가지고 있는 아이템을 추천한다.
나와 유사한 사람이 선택한 아이템을 추천하는 협업 필터링과는 다르다.
- Strong and Weak?
사용자들의 데이터가 필요 없다. 아이템과 아이템간의 관계만 연산하면 되기 때문에
아이템의 정보에 대한 태깅만 필요하다. 사용자가 클릭했던 상품과 연관된 아이템을 뿌려주면 된다.
하지만 사용자가 오래 사이트를 이용했을 경우, 해당 데이터들을 활용한 협업 필터링보다 성능이 떨어진다는 인식이 있다.
때문에 소비 이력이 적은 아이템, 또는 사용자 데이터가 적을 때 제한적으로 활용.
- 어떻게 한다고?
때문에, 각 아이템간 유사도를 연산 할 수 있어야함.
각 아이템에 대한 정보 태그를 기록하고 원-핫 인코딩이나 임베딩 등의 방법을 활용해
벡터화 해서 벡터 유사도를 측정하면 된다.
그리고 벡터 유사도로 sorting해서 화면에 뿌려주면 된다.
벡터화 할때에는 각 데이터의 유형에 따라서 다른 방법과 전처리를 해야함.
아래의 전처리 방법은 앞으로 다루어볼 문제들이다.
- 숫자형 데이터들은 normalization이나 standalization을 해야한다.
- 결측치도 핸들링 해야한다. (필터를 활용한 예측, 분포를 활용한 샘플링, 데이터 먼징 등)
- 문자열은 대부분 범주형일 것이기 때문에 0~1사이로 핸들링 한다.
- 만약 상품 설명에 대한 자연어일 경우 자연어 모델을 이용해 임베딩을 뽑아낸다.
(BERT, GPT 등을 활용해 자연어 임베딩 추출 후 유사도 활용 등, word2vec 할바엔 이게 나을듯, 최근엔 한국어 임베딩 모델도 많이 나오고 있음)
- 상품 추천 이라면 이미지를 활용하는 방법도 있음, 이경우 pre-trained CNN을 활용해 단순 이미지 피처를 뽑아내
활용할 수 있음. 요즘 각광받는 초거대 비전-언어 대조 학습으로 사전학습된 모델을 활용하면 좋을듯.
어떤 소비자가 어떤 상품 내지는 아이템을 소비한 이력이 있을 때, 유사한 소비 패턴을 보이는 다른 소비자가 좋아하는 아이템을 좋아할 가능성이 높다라고 가정한다. 사용자가 함께 소비하는 아이템을 추천할 수 있기 때문에 충분한 데이터를 확보할 수 있을경우에 더 정확한 추천이 가능하다.
- Strong and Weak?
사용자와 아이템간의 상호작용을 기반으로 추천한다. 때문에 컨텐츠 기반 추천 방식에서 유사도 점수가 낮은 아이템도 소비 패턴으로 발견되어 추천될 수 있다. 하지만 충분한 이용 데이터가 쌓이기 전에는 서비스에 도입하기 어렵다.
모델 학습이 필요하지만, 추론시에는 적은 부하가 걸린다.
- 어떻게 한다고?
메모리 기반의 방법과 모델 기반의 방법이 존재한다.
(1) 메모리 기반의 방법
소비 이력을 저장해 놓았다가 조회하는 방식으로 구현되는 협업 필터링.
어떤 아이템에 대한 rating이 필요하거나, 소비자의 ui에 추천 아이템을 뿌려줄 때
소비자의 패턴과 유사한 패턴을 보인 다른 소비자들의 데이터를 조회하여 추정한다.
전통적인 방식이다.
(2) 모델 기반의 방법
단순히 이전 데이터를 조회하는 방식이 아니라
통계적 모델이나 딥 러닝을 이용해 예측하는 방식
latent factor 방식이나 classification/regression을 수행, 또는 딥러닝을 이용한 방식이 있다.
- latent factor
기본적으로 벡터 유사도를 기반으로 한다는 점에서는 컨텐츠 기반 방식과 동일한 것으로 보임.
하지만 아이템-아이템간 벡터 유사도를 구하는 것과는 달리, 사용자-아이템간 유사도를 구하는것이 다른점이다.
데이터는 현실세계에서 '추출'되며, 추출 방법과 조건에 따라서 어느정도의 '편향'을 포함하게 되어 있다.
데이터 수집 방법과 추출 방법은 대단히 주관적이며, 수행하는 사람에 따라서 그 기준이 다를 수있다.
어떤 항목을 수집할 것인지 정의하는 것에서 부터 시작해서, 수집 과정이 일어나는 조건까지 말이다.
때문에 수집된 데이터는 불확실하며 무작위적인 특징을 띈다.
수학적으로 정의된 통계학 기법과 함수들은 이 불확실하고 무작위적인 특징을 가진 데이터를 '간략화' 할 수 있다.
통계학적 추정과정을 통해 간략화 된 수치들은 좀더 해석가능하고 이해 가능하다.
예를들면, 획득된 데이터가 가우시안 분포를 따른다고 가정했을 때, 표준 편차와 기대값으로 '간략화'할 수 있고, 다른 데이터 분포와도 '해석적으로' 비교할 수 있다.
가우시안 분포의 예(출처: 위키피디아)
통계적 추론 과정은 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]에서는 각 필드의 값을 검증할 때 통계적 해석을 이용한다. 평균값, 최빈값, 중간값등을 이용해 검증에 사용할 수 있다.
위와 같은 다양한 도구들을 사용해 각 필드값이 어떤 의미를 가지는지, 어떤 유형인지를 확인하고, 어떻게 인코딩하고, 어떤 머신러닝 알고리즘을 사용할 지를 고민해야 한다. (사실 대부분 전처리 과정이 전부이다.)