Boost Camp P stage 4 ๋ํ์ ๊ณผ์ ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ Git repo ์
๋๋ค. ๋ํ ๊ท์น์ ํน์ ๋ด์ฉ์ด ์์ ๋๊ฑฐ๋ ์ญ์ ๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํฉ๋๋ค
Team Rank : 7 , AUROC : 0.8362, Accuracy : 0.7527
๊น์ข ํธ Project Branch
๋ฐ์๊ธฐ Project Branch
์๋ํ Project Branch
์ง์ ์ฌ Project Branch
ํ์ฑ์ Project Branch
Project Branch๋ DKT ๋ํ์์ ์ฌ์ฉํ ํ์ ๋ณ Branch์
๋๋ค. ํ์์ ์์ธํ ์ ๋ณด๋ฅผ ์ํ์๋ ๊ฒฝ์ฐ Project Branch๋ก ํ์ธ ๊ฐ๋ฅํฉ๋๋ค
โก๊ต์ก ๋๋ฉ์ธ ์ง์ ํ์ฉ
โกUser split augmentation
โกprivate leader board๋ฅผ ๊ณ ๋ คํ ๋ชจ๋ธ ์คํ
โกTwo track (task cross-reference)
โก ๋ค์ํ EDA๋ฅผ ํตํด Feature engineering๊ณผ validation ์ ๋ต์ ์ธ์ฐ๋๋ฐ ํ์ฉ
โก ๋ฐ์ดํฐ ๋ถ์ ๊ธฐ๋ฐ Feature
ใโณ User ID, assessmentItemID, testId, KnowledgeTag, Timestamp ๊ณผ answerCode ๊ด๊ณ
ใโณ๊ฐ Value์ answerCode๊ฐ์ ํ๊ท , ๋ถ์ฐ, Skew, ๋์ ํฉ, ๋์ ํ๊ท
ใโณ๊ฐ Value ๊ฐ์ ํต๊ณ์ ์์น
โก ๊ต์กํ ์ด๋ก ๊ธฐ๋ฐ Feature
ใโณassessmentItemID, testId, KnowledgeTag์ ๋ณ๋ณ๋ ๊ฐ
ใโณ๋ณ๋ณ๋ : (์์ ์ ๋ต ์ - ํ์ ์ ๋ต ์ ) / (์ด ์์์ / 2)
โก ELO rating
ใโณ์ ๋ต ์ฌ๋ถ์ ๋ฐ๋ฅธ ๊ฐ์ธ Rank ์ ์ ์ ์ฉ
ใโณ๋ฌธ์ ๋์ด๋์ ๋ฐ๋ฅธ Rank ์ ์์ ์ฆ๊ฐ์ ๊ฐ์
โก ์ด 47๊ฐ์ Feature ์์ฑ
โก Feature Engineering ์์ธ
โก Sliding Window(Stride = 10,20, ... ,128)
โก User month split (์ฌ์ฉ์๋ฅผ ์๋ณ๋ก ์ ๋ฆฌ)
โก User testID grade split (์ฌ์ฉ์๋ฅผ ๋ฌธ์ ์ง๋ณ ์ ๋ฆฌ)
โก Tree decision : LGBM , XGBoost , Catboost
โก NN Models : LSTM , LSTM with Attention , Bert , Saint , GPT-2, LastQuery_pre/post
์ด์ stage์์ shake-up์ด ํฌ๊ฒ ์ผ์ด๋์ ํฐ ์ ์ ํ๋ฝ์ ๊ฒช์๊ธฐ ๋๋ฌธ์ validation ์ ๋ต์ ์กฐ๊ธ ๋ ์ ๊ฒฝ์ ์ผ์ต๋๋ค.
โก UserID split
ใโณuserID๋ฅผ ๊ธฐ์ค์ผ๋ก k-fold๋ฅผ ์งํ
โ
โก grade๋ณ ๊ฒ์ฆ
ใโณ ์ฌ์ฉ์์ ๋ํ grade๋ฅผ ์ถ์ถํ์ฌ, grade์ ๋น์จ์ ๋ง๊ฒ K-fold ์ํ
ใโณ ex) A030071005, testID, AssesmentID ์์ ์์๋ฆฌ 3์๋ฆฌ์ ๊ฒฝ์ฐ Grade
ใโณ ์์ธ
User ๋ณ๋ก grade๊ฐ ๊ณ ์ ๋์ด ์์ง ์์ ๊ฒฝ์ฐ๋ฅผ ํ์ธํ์๋ค.( ex, userID 315๊ฐ grade 3, 4, 7์ ๋ฌธ์ ๋ฅผ ๋ชจ๋ ํธ๋ ๊ฒฝ์ฐ) ๋ฐ๋ผ์ ์ฌ์ฉ์์ grade๋ฅผ ํ๋๋ก ํน์ ํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ๋ฐ์ํ์๋ค. ์ด๋ฅผ ํด๊ฒฐ ํ๊ธฐ ์ํด ํ๋์ ์ฌ์ฉ์์์ ๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ grade๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ์์ ๋ํ grade ์ค์ ํ์๋ค.
์ค์ ํ ๋ํ grade๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ ๋ถํฌ๋ฅผ ํ์ธ ํ ๊ฒฐ๊ณผ Train set ๊ณผ Test set์ ๋ถํฌ๊ฐ ์ ์ฌํ๋ค๋ ๊ฒ์ ํ์ธํ์๋ค.
โก Hyper parameter tuning - Optuna
โก PCA
ใโณ 40๊ฐ์ features๋ฅผ input์ผ๋ก ํ์ฌ ์ฃผ์ฑ๋ถ ๋ถ์์ ์ํ
ใโณ ์ฃผ์ฑ๋ถ ๋ถ์ ๊ฒฐ๊ณผ
94%์ด์์ ๋ถ์ฐ์ค๋ช ๋ ฅ์ ๊ฐ์ง๊ธฐ ์ํด์๋ 20๊ฐ ์ด์์ ์ฃผ์ฑ๋ถ์ด ํ์ํ๋ค.
20๊ฐ์ ์ฃผ์ฑ๋ถ์ ๊ฐ์ง๊ณ ๋ชจ๋ธ train๊ณผ inferenceํ ๊ฒฐ๊ณผ, Validation AUC๊ฐ 0.8136 ๋์๋ค.
โก ensemble
ใโณ soft voting
๋ถ๋ฅ๊ธฐ๋ค์ ๋ ์ด๋ธ ๊ฐ ๊ฒฐ์ ํ๋ฅ ์ ๋ชจ๋ ๋ํ๊ณ ์ด๋ฅผ ํ๊ท ํด์ ์ด๋ค ์ค ํ๋ฅ ์ด ๊ฐ์ฅ ๋์ ๋ ์ด๋ธ ๊ฐ์ ์ต์ข ๋ณดํ ๊ฒฐ๊ด๊ฐ ์ผ๋ก ์ ์ .
DKT competetion์ eval-metric์ด AUC ์ด๋ฏ๋ก class label๊ฐ์ ์ ์ถํ๋ ๊ฒ์ด ์๋ ํ๋ฅ ๊ฐ์ ์ ์ถํ๋ฏ๋ก, ๋ชจ๋ธ๋ณ prediction ๊ฐ์ ํ๊ท ๋ด๋ ๋ถ๋ถ๊น์ง ์งํํ์๊ณ , ๋จ์ผ ๋ชจ๋ธ ๊ฒฐ๊ณผ๋ณด๋ค PB LB ์ ์์์ผ๋ก ํ๋ฝํ์๋ค.
๋ชจ๋ธ๋ง๋ค ์์ดํ prediction์ผ๋ก ์ธํด ๊ฐ์ด ํ๋ฝํ ๊ฒ์ผ๋ก ํ๋จ๋์ด OOF stacking์ ์๋ํด์ผ ํ ๊ฒ์ผ๋ก ํ๋จํ์๋ค.
โณ hard voting
๋ค์๊ฒฐ, ์ฌ๋ฌ ๋ชจ๋ธ์ ๊ฒฐ๊ณผ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ๋ง์ ๋ชจ๋ธ์ด ์์ธกํ class label์ ๊ธฐ์ค์ผ๋ก ์์ธก๊ฐ์ ๋์ถํ์๋ค.
DKT competetion์ eval-metric์ด AUC ์ด๋ฏ๋ก class label๊ฐ์ ์ ์ถํ๋ ๊ฒ์ด ์๋ ํ๋ฅ ๊ฐ์ ์ ์ถํ๋ฏ๋ก, ๊ฐ์ฅ ๋ง์ ๋ชจ๋ธ์ด ์์ธกํ class label๋ก ์์ธกํ ๋ชจ๋ธ๋ค์ prediction ๊ฐ์ ํ๊ท ๋ธ ๊ฐ์ผ๋ก ์ ์ถํ์๊ณ , soft voting๊ณผ ๋์ผํ๊ฒ ๋จ์ผ ๋ชจ๋ธ ๊ฒฐ๊ณผ๋ณด๋ค PB LB ์ ์์์ผ๋ก ํ๋ฝ์ ๋ณด์๋ค.
โณ oof_stacking
NN๊ธฐ๋ฐ model์ prediction ๊ฒฐ๊ณผ๊ฐ๊ณผ tree ๊ธฐ๋ฐ์ model์ prediction ๊ฒฐ๊ณผ ๊ฐ์ด ์์ดํ ๊ฒ์ ์์ soft voting์ ๊ฒฐ๊ณผ๋ก์จ ์ป์๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ๊ฒฐ๊ณผ๊ฐ ์์ดํ ๊ฒฝ์ฐ ๋ฉํ ๋ชจ๋ธ์ ํตํด ensemble์ ํ๊ฒ๋๋ oof-stacking ๋ฐฉ๋ฒ์ด ํจ๊ณผ์ ์ผ๋ก ์๊ณ ์์๊ธฐ์ ์ด๋ฅผ ์งํํ๊ณ ์ ํ์๋ค.
โณ Priority Max Ensemble
์์ 4๊ฐ prediction ์ค ์ ํ๋๊ฐ ๊ฐ์ฅ ๋์ ์ ํ๋๋ฅผ ๊ฐ์ง prediction์ ์ฐ์ ์ผ๋ก 4๊ฐ์ prediction์ max๊ฐ์ ์ทจํด์ Ensemble์ ํ์๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ ํํ ์ด์ ๋ ์ ํ๋ ๊ฐ์ ๋ณด์กดํ๋ฉด์ auc๊ฐ ๋์์ง ๊ฒ์ผ๋ก ์์ํ์ฌ ์ฌ์ฉํ์๋ค.
pd_list[0]['prediction']
new_df = pd.DataFrame(columns=['prediction'])
for i in range(len(pd_list[0])):
id=i
a1 = pd_list[0]['prediction'][i]
a2 = pd_list[1]['prediction'][i] # ๊ฐ์ฅ ๋์ acc๋ฅผ ๊ฐ์ง prediction(์ดํ 1๋ฒ์์ธก)
a3 = pd_list[2]['prediction'][i]
a4 = pd_list[3]['prediction'][i]
d = {"up":[],"down":[]}
for j in range(4): # 0.5๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๋ค.
if pd_list[j]['prediction'][i]>=0.5:
d["up"].append(j)
else:
d["down"].append(j)
if len(d["up"])>0 and len(d["down"])>0:
# 0.5๋ฅผ ๊ธฐ์ค์ผ๋ก up, down์ด ์์ ๋, prediction์ max๋ก ํ์ฌ auc๋ฅผ ๋๋ฆผ
# 1๋ฒ ์์ธก์ด ์ด๋ ๊ทธ๋ฃน์ ํฌํจ๋์ด ์์ ๋, ๊ทธ ๊ทธ๋ฃน์์ max ์ทจํจ
if (1 in d["up"]):
m = pd_list[max(d["up"])]['prediction'][i]
elif (1 in d["down"]):
m = pd_list[max(d["down"])]['prediction'][i]
else: # ๋ค ๊ฐ๋ค up ๋๋ down์ ๋ชจ๋ ์์ผ๋ฉด, max๋ก prediction ๊ฐ์ ๊ตฌํจ
m=(max(pd_list[0]['prediction'][i],pd_list[1]['prediction'][i],pd_list[2]['prediction'][i],pd_list[3]['prediction'][i]))
new_df.loc[len(new_df)]=[m]
์์์ ์์ฑํ ๋ชจ๋ธ์ ํ์ฉํ์ฌ ๊ฐ๋จํ SPA ์น ์ฑ์ธ "Mini ์๋ฅ" ์ ์
์ถ๊ฐ ์ฌ์ฉ ๊ธฐ์ : Flask, HTML, CSS, Javascript
7.1 ์น ์๋น ๊ตฌ์กฐ๋
7.2 ์์ฐ