DKT

Jihoon·2022년 12월 12일
0

AI_CONTEST

목록 보기
2/7
post-thumbnail
post-custom-banner

🎈 Wrap-up Report 및 개인 회고


🎈 학습 및 대회 적용 내용


🙌 Feature Engineering

👌 도메인 지식

말 그대로, Domain 지식을 활용하여 모델의 성능을 높이는 전략이다.

  • 문제의 난이도 판정
  • 모르는 문제를 만났을 경우 학생의 찍는 경향 -> 이런 건 어떻게 구현해야 할까?
  • 학생의 지식 수준 판정

👌 메모리

Sequential Data : LSTM, Transformer와 같은 Sequence Model은 메모리(Memory)를 내장하고 있어서 이전, 이후 입력된 데이터들을 기억하고 참조함.

Tabular Data : 주어진 데이터 이전/이후의 데이터들을 포함하는 Memory를 feature로 포함시킴으로써 Sequence Model 사용하지 않고, 일반적인 지도학습 모델인 LGBM 등을 사용하여 훈련 가능

    #유저들의 문제 풀이수, 정답 수, 정답률을 시간순으로 누적해서 계산
    df['user_correct_answer'] = df.groupby('userID')['answerCode'].transform(lambda x: x.cumsum().shift(1))
    df['user_total_answer'] = df.groupby('userID')['answerCode'].cumcount()
    df['user_acc'] = df['user_correct_answer']/df['user_total_answer']

▶ Shift(이동)

edu_shift_df = edu_df.copy()

# 미래 정보
# 두 시점 뒤 -2
edu_shift_df['correct_shift_-2'] = edu_shift_df.groupby('user')['correct'].shift(-2) 
# 한 시점 뒤 -1
edu_shift_df['correct_shift_-1'] = edu_shift_df.groupby('user')['correct'].shift(-1)

# 과거 정보
# 한 시점 전 1
edu_shift_df['correct_shift_1'] = edu_shift_df.groupby('user')['correct'].shift(1)
# 두 시점 전 2
edu_shift_df['correct_shift_2'] = edu_shift_df.groupby('user')['correct'].shift(2)

edu_shift_df.iloc[:, [0, 3, 4, 5, 6, 7]]

▶ cumsum(누적합)
▶ cumcount(누적 총계)
▶ Rolling Mean(이동 평균)

👌 일자와 시간(dt) 처리법


🙌 LGBM Modeling

1-1. Optuna 적용시

  1. Objective 함수에 lgb.train() 적용 -> Model에게 train 함을 알려줘야 함
  2. 뽑아낸 BestParameters 통해서 lgbm의 모델 종류 중(Regressor, Ranking, Classifier) 선택해서 적용
  3. Best Parameters 적용한 모델에 대해서 훈련시킬 데이터와 평가할 validation sets을 기입하여, 훈련(fit)시킴
  4. 훈련시킨 모델을 통해서 test dataset에 대해 predict함수를 통해 예측하여 평가를 진행함

1-2. Optuna, CV 적용 시 성능이 더 떨어지는 이유

기존의 세팅 해놓은 파라미터를 통해 LGBM을 돌렸을 때, 성능이 0.764가 나왔는데, Optuna와 CV를 적용했더니 성능이 0.67까지 떨어지는 기괴한 현상이 발생했다.

  1. train & valid Split

    정답을 찾았다. train 과 test의 데이터 분포 차이가 크기 때문에 두 데이터셋을 합쳐서 학습을 시키면 오히려 예측이 안된다는 것이다.

  2. 기존의 하이퍼 파라미터에서 더 추가함

    하이퍼 파라미터를 어떻게 설정하는 지에 따라 모델의 결과 역시 천차만별이다. 각 모델 별 하이퍼 파라미터 공부 필요하고, 다른 사람의 코드 참고할 필요가 있음

profile
장난감이 데이터인 사람
post-custom-banner

0개의 댓글