1. 문제 정의
'취업'에 고민이 있는 취준생을 위해,
자신의 스펙(학점, 토익, 어학능력 등)을 입력하면,
각 기업에 맞는 스펙점수를 예측하고, 합/불 결과와 보완할 점, 합격자 자소서에서 기업의 인재상을 나타내는 문장 추출해줌
2. 데이터 선정 및 수집
공공데이터포털 등 데이터가 정리된 사이트에서는.. 우리가 원하는 데이터가 없음.
그저 00년도에 몇 명이 취업했는지.. 정도의 데이터만 있음.
따라서 '잡코리아'라는 사이트에서 크롤링을 진행하였음. BeutifulSoup 이용
3. 데이터 전처리
크롤링을 하면 태그 안의 내용이 나오기 때문에, 모두 문자열의 형태이며, '점/개/회' 등의 문자가 포함된 것도 있음.
또한 오픽의 경우 숫자가 아닌 IH 이런 식으로 문자열이 추출됨.
따라서 오픽은 범주화, 나머지는 문자열 제거 후 수치화하였음.
결측치는 모두 평균이 아닌 0으로 표현함.
현재 데이터는 학점/토익 등의 스펙으로 스펙점수를 예측해놓은 데이터인데,
만약 토익값이 결측치라고 토익평균으로 점수를 바꾼다면 스펙점수도 바꿔야 하기 때문.
그럼 정답 스펙점수를 모르기에 모델 학습 진행 불가
이후 데이터가 적은 기업이 있어서 KDE를 이용해 증강 시행.
원랜 그냥 노이즈를 줄까 했는데, 데이터의 분포를 유지하는 방식을 택했다.
단순히 말하면 이산형이었던 히스토그램을 연속형으로 바꾼 후,
그 y값(밀도)을 softmax하여 마치 '확률'처럼 사용했다.
그 확률에 따라 데이터를 샘플링하여 데이터 증강시 데이터 분포가 최대한 변하지 않도록 했다.
4. EDA
사실.. EDA는 그닥 필요하지 않았다.
그냥 평균 정도를 알아보았고, 각 feature별 분포를 시각화해보았다.
5. AI 모델링
조금 복잡할 수도 있다.
- 증강 모델
데이터를 증강할 때 분포에 따라 확률을 주어 증강했다고 했는데,
다른 feature는 그래도 되지만 스펙 점수는 그렇게 하면 안 된다.
사실 스펙 점수도 그렇게 증강했었는데 모델 점수가 너무 안 나와서.. 왤까 하고 생각해보니 스펙점수도 랜덤(?)으로 샘플링했었다.
이는 다른 feature들의 영향을 받기 때문에 다른 feature의 값으로 계산해야 한다.
따라서 일단 증강 전 데이터로 스펙점수를 예측하는 NN 모델을 구현하였다.
이후 그 모델로 스펙점수를 제외한 나머지 feature를 증강한 데이터를 가지고 스펙점수를 예측하여 증강 데이터를 완성했다.
이제 데이터 증강이 완료됐으니 증강된 데이터로 다시 스펙점수를 예측하는 NN을 구현해서, 이걸 사용했다.
- 미래 합격자 스펙 예측 모델
원랜 바로 다음 년도의 합격자 스펙을 예측하려 했는데, 멘토님의 추천으로 변경하였다.
2학년이라 3년 뒤의 합격자 스펙을 예측하고 싶으면 어떡할까.. 에서 기반한 것이다.
그래서 일단 스펙점수를 제외한 나머지 feature들의 모델을 적합시켜보았다.
처음엔 단순선형회귀로 했는데, 이건 진짜 너무 단순했다.
그래서 다항모델로 변경했지만, 이것도 성능이 그다지 좋진 않았다.
과하게 40차수까지도 해봤지만, 여전히 성능이 안좋았다.
또다른 방법인 시계열 모델, GRU도 생각해보았지만, 생각해보니 몇 백개의 데이터가 있는 게 아닌, 우리는 년도별 데이터만 있기에 2014년~2023년까지의 데이터라 생각하면 총 10개의 데이터만 있어서.. GRU는 적당하지 않다고 생각했다.
그나마 괜찮은 것이 다항모델이라 이걸로 채택했다.
각 feature의 예측값으로, 위에서 구한 NN 모델을 통과시켜 예측 스펙점수를 구했다.
- 합/불, 보완할 점
사실 이건 모델을 사용하진 않았다.
그냥 합격자 예측 스펙 점수와 사용자 예측 스펙 점수의 차이를 따져서 합불을 가렸다.
보완할 점도 마찬가지로 각 스펙의 차이를 따져서 출력했다.
- 자소서에서 인재상 추출 모델
이건 원래 OpenAI의 API를 이용하려 했는데.. 잘 안 됐다.
그래서 계속 찾다가 groq라는 API를 발견했다. 완전 뿌듯ㅎ
무료인데다, 다른 LLAMA 이런 모델에 비해 성능이 훨씬 좋았다.
물론 Chat GPT처럼 엄청 대답을 잘 하진 않지만, 일단 해커톤 제출을 위해 사용하였다.
few-shot 프롬프트 엔지니어링을 하고 싶었지만, 입력이 워낙 길다 보니 그냥.. zero-shot을 진행하였다.
결과적으로 그럭저럭 출력됐다.
6. 회고
더 해보면 좋을 것 & 아쉬운 것
1. 합/불 결과를 단순 스펙점수 크기 비교가 아닌 '가능성'으로 나타내는 것도 좋았을 것 같다.
모델의 예측 성능과 예측값을 포함하면 되지 않을까 한다.
각 feature에 대한 예측을 하는 모델의 정확도와 그 예측값을 곱해서? 이를 예측값으로 사용하는 것!
그럼 정확하지 않은 모델의 예측값은 가중치가 떨어지고, 비교적 정확한 모델의 예측값은 가중치가 올라갈 것
이후 만약 사용자 예측 스펙 점수가 550점, 합격자 예측 스펙 점수가 500점이라면 약 80%의 확률로 합격.. 이렇게!
2. EDA를 첨부터 했으면 좋을 것 같다. 항상 이 부분을 건너뛰게 되는데.. 이 부분도 중요해 보인다.
그리고 데이터를 정말 완벽히 파악해야겠다는 생각을 했다. 그럼 위에서 한 실수인, '스펙 점수는 다른 feature들로 계산된다'는 사실을 간과한 짓을 하진 않을 것이다.
프로젝트에 대한 내용
기업을 여러 개 해보는 것도 좋을 듯, 아님 사용자가 필요한 기업의 url을 입력하면 크롤링해서 데이터 수집하고~ 전처리하고~ 해주는 방식도 괜찮겠다.
7. 그냥 마무리
나는 정말 전처리 과정이 재밌는 것 같다. 특히 이번에 결측치 처리하는 방식이나, 데이터를 증강하는 방식을 생각하는 것이 재밌었다. 끝나고 보니 이것도 해볼걸 하는 생각이 들기도 하지만, 전체적으로 만족스러운 해커톤이었다. 사실 최우수상을 받지 않았다면.. 이렇게 맘에 들진 않았을 거 같긴 하다. 정리해보면 꽤 간단한 모델이라고 생각할 수 있는데, 그럼에도 우리가 엄청난 시간을 쏟은 이유는 데이터 수집과 전처리.. 이 과정 때문인 것 같다. 근데 뭐 간단한 모델이라고 해서 안좋은 것도 아니고, 성능만 잘 나오면 된다고 생각한다.
팀플이다 보니 팀끼리 의견이 맞지 않으면 정말 힘들 것이다. 그래서 우리는 다같이 의견을 정리하는 시간도 여럿 가졌다. 이렇게 해서 그래도 더 잘 해낼 수 있었지 않나 싶다!
그리고 멘토님께 정말 많은 조언을 들었는데, 나도 그렇게 여러 방면에서 생각해보고 싶다.
끝!
'AI > 대회' 카테고리의 다른 글
[DACON] 농산물 가격 예측 (0) | 2024.12.12 |
---|