경진대회

[국민대학교 AI빅데이터 분석 경진대회] cosine similarity

K_Hyul 2023. 10. 22. 19:26
728x90

DACON - 제1회 국민대학교 AI빅데이터 분석 경진대회 (2023.10.16~2023.11.13 09:59

[Baseline] 사용자 기반 협업 필터링(User-based Collaborative Filtering) 설명

 

 

Fig. 1 apply_train_df

 

첫번째 apply_train_df를 선언해 apply_train.py에 있는 값들을 가져오면 57946개의 채용 지원이 있다는 것을 알 수 있다.

 

 

Fig. 2 user_item_matrix

 

apply_train_df를 'resume_seq(지원자 번호)', 'recruitment_seq(채용 번호)' groupby해 2X2 Matrix로 표현한다. 

(.unstack(fill_value=0) ==> 값이 없으면 0으로 입력)

 

총 8482명의 지원자가 있고 채용공고는 6695개 있다는 것을 확인 할 수 있다.

 

Fig. 3 cosine_similarity

 

우선 지원 횟수가 2번 이상이면 1로 변경한다.

그 후 cosine_similarity를 적용하는데 이 함수는

Fig. 4 Cosine Similarity 계산 식

 

3차원에서 표현하면 위의 식처럼 계산 되는 것이다.

Fig. 5 위 식과 동일한 결과 확인
Fig. 6 추천 점수 계산

 

그림 4와 같은 계산을 끝낸 user_similarity는 (8482, 8482)로 각각의 유사도가 계산되어있다.

user_similarity.dot(user_item_matrix) 같은 경우 

그림 4 예시에서의 x,y로 본다면

Fig. 7 결과

 

이러한 형식으로 결과가 나온다.

즉, 우리는 (8482, 8482) x (8482, 6695)로 결과는 (8482, 6695)의 값이 된다.

 

Fig. 8 np.array([np.abs(user_similarity).sum(axis=1)]).T

 

 

예시 값을 적용 했을 때 np.array([np.abs(suer_similarity).sum(axis=1)]).T의 과정이다.

본래의 값을 넣으면 (8482,1)의 열 벡터가 나와 각 값을 나누는 것을 연산하게된다.

 

위 과정들을 다 구하면 각각의 유사도값이 결과로 나온다. (8482, 6695)

 

Fig. 9 추천

 

idx = 0, user = U00001

부터 idx = 8481, user = U08482 까지 for 문을 돌면서

 

해당 user가 지원한 채용 공고 부터 찾는다.

applied_jobs = set(user_item_matrix.loc[user][user_item_matrix.loc[user] == 1.index)

그 후 추천 점수가 높은 점수로 정렬한 뒤,  추천 점수가 높은 사람의 공고를 가져와 이미 지원한 공고를 제외하고 

5개의 공고를 가져오게된다.(그 사람의 공고로 5개가 안되면 다음 높은 점수인 사람의 공고에서 가져온다.)

그렇게 각 user별 job 5개를 받아서

submission.csv 형태로 저장한다.

 

즉, sample_submission 같은 경우 지원한 곳이 비슷한 사람들을 내림차순으로 나열해서

다른 곳에 지원한 list를 제작한것과 같다.

여기 까지 문제 및 기본 submission에 대해서 설명이 끝났다. 

 

 

이제 이 대회에서 고득점을 위한 방안을 생각해 봐야한다.

 

sample은 고작 지원한 곳만 비교를 했는데 다른 값들, 대학교, 학과, 사는 곳 등등을 포함시켜 Cosine Similary를 적용해도 되고 다른 추천 시스템 모델을 가져와 적용해도 된다.

 

예를 들면, 대학교 내에서 같은 학과 사람들이 특정 회사에 지원한다던지,

연계 시스템으로 인해 다들 간다던지 등 이런 정보가 포함되어있을 수 있다.

 

이는 유사도를 증가 시키기 때문에 같은 학교 사람들은 제거한다는 등 이러한 작업을 할 수 있다.

728x90