2. 데이터 분석 대회에서 높은 점수 받기
정파
데이터를 보면 아인슈타인, 폰
노이만 급으로 머리 속에 통찰이
박히면서 바로 수리통계적 분석을
마치고 모델을 학습 및 답 제출 후
scoreboard는 보지 않고 1등
도메인에 대한 심도 깊은 통찰력
수 많은 머신 러닝 모델에 대한 수학적 이해
다양한 모델을 구현하는 뛰어난 프로그래밍 능력
최소 다이아
최소 박사
최소 초등정보영재
3. 데이터 분석 대회에서 높은 점수 받기
사파
좋게 말하면 Heuristic
직설적으로 NOGADA
Try-Error-Feedback
4. 저는 물론 노가다 했습니다
좋은 노가다를 위한 TIP
1. 나올만한 곳을 판다 == 데이터 설계
2. 다양한 곳에서 시도한다 == 모델의 다양성
3. 좋은 연장을 사용한다 == 좋은 Framework와 모델
(*3은 elice의 짧은 대회 기간 및 멘탈을 위해 매우 중요한 요소입니다.)
5. 나올만한 곳을 판다 == 데이터 설계
{
"matchDuration": 1716, // 초 단위, 얼마나 게임이 오래 지속되었는가를 의미
"teams": [ // 2개의 Dictionary
{
"firstDragon": true, // 이 팀이 용(몬스터)를 먼저 죽였는가
"dragonKills": 2, // 이 팀이 용을 몇번 죽였는가
"winner": false, // 이 팀이 대전에서 승리했는가
"firstBaron": false, // 이 팀이 바론(몬스터)를 먼저 죽였는가
"baronKills": 0, // 이 팀이 바론을 몇번 죽였는가
"firstBlood": false, // 첫 킬이 이 팀에서 나왔는가
"teamId": 100 // 팀 ID
},
...
],
"participants": [ // 10개의 Dictionary
{
"championId": 412, // 챔피언 (캐릭터) ID
"summonerId": 21983, // 플레이하는 게이머의 ID
"teamId": 100, // 팀 ID (teams의 teamId와 매치됨)
"stats": { // 이번 대전에서의 통계를 의미
"kills": 2, // 이 게이머가 다른 게이머를 몇번 죽였는가
"deaths": 8, // 이 게이머가 몇번 죽었는가
"assists": 11, // 다른 게이머를 죽이는데 몇번 도움을 주었는가
"goldEarned": 7314, // 총 획득한 골드 (게임 내 화폐)
"totalDamageDealt": 27629, // 몬스터 + 게이머에게 가한 총 데미지
"totalDamageDealtToChampions": 9507, // 게이머에게만 가한 총 데미지
"totalDamageTaken": 20419, // 받은 총 피해
"minionsKilled": 37, // 죽인 미니언(몬스터) 수
"totalHeal": 1014, // 총 치유량
"totalTimeCrowdControlDealt": 241, // 다른 플레이어에게 Crowd Control (CC) 를 사용한 총 시간
"wardsPlaced": 5 // Ward(시야를 넓혀주는 아이템) 을 맵에 장착한 횟수
"items": [ // 아이템 정보
3401,
2049,
1031,
3270,
0,
2043,
{
"teams": [ // 2개의 팀이 있습니다.
{
"teamId": 200 // 팀 ID
},
...
],
"participants": [ // 10명의 게이머 정보
{
"championId": 421, // 챔피언 (플레이 캐릭터) ID
"summonerId": 22082, // 게이머 ID
"teamId": 100 // 팀 ID
},
...
]
}
6. 다양한 곳에서 시도한다 == 모델의 다양성
And Hyperparameter Tuning
8. Experiment. Iter 0
{
"teams": [ // 2개의 팀이 있습니다.
{
"teamId": 200 // 팀 ID
},
...
],
"participants": [ // 10명의 게이머 정보
{
"championId": 421, // 챔피언 (플레이 캐릭터) ID
"summonerId": 22082, // 게이머 ID
"teamId": 100 // 팀 ID
},
...
]
}
Test에서 받을 수 있는 정보는
챔피언 ID, 게이머 ID, 팀
<생각의 흐름>
게임할 때 우디르를 밴하진 않고…
제일 중요한 건 챔피언이겠지?
1 0 0 1 0…
챔피언 수
0 0 1 1 0…
챔피언 수
+
Team 100 Team 200
Sparse Matrix
9. Experiment. Iter 0
1 0 0 1 0…
챔피언 수
0 0 1 1 0…
챔피언 수
+
Team 100 Team 200
<- Data Input
<- Model
<- Output0 || 1
Logistic Regression, Decision Tree, Neural Network,
Gradient Boost, SVC, KNN…
이거 파라미터도 튜닝하고, 여러 모델도
돌려보고, 앙상블도 많이 해야하고…
10. Experiment. Iter 0
1 0 0 1 0…
챔피언 수
0 0 1 1 0…
챔피언 수
+
Team 100 Team 200
<- Data Input
<- Model
<- Output0 || 1
얘가 다해줌 ㄱㅇㄷ
11. Experiment. Iter 0 result
롤은 그래도 컨트롤 겜인데 챔피언만 보면 65 정도겠지?
그것도 마스터1 인데;; 원챔 장인도 있을거고…
아무리 OP챔 해도 정도가 있겠지…
라이엇이 놀고만 있을리가…
12. Experiment. Iter 0 result
85??? 롤은 OP조합 겜이였습니다…
도벽이즈하세요
만족 후 그만하려고 했으나….
14. Experiment. Iter 1
{
"teams": [ // 2개의 팀이 있습니다.
{
"teamId": 200 // 팀 ID
},
...
],
"participants": [ // 10명의 게이머 정보
{
"championId": 421, // 챔피언 (플레이 캐릭터) ID
"summonerId": 22082, // 게이머 ID
"teamId": 100 // 팀 ID
},
...
]
}
챔피언 정보, 팀 정보는 줬으니
남은건 게이머의 정보
op.gg보면 같은 팀으로 게임한 소환사들 (최근 20 게임)이
있던데 괜히 넣어둔건 아니겠지
1 0 0 1 0…
챔피언 수
0 0 1 1 0…
챔피언 수
+
Team 100
Team 200
Sparse Matrix
<생각의 흐름>
+ 3 0 2 1 0 3 2 1 0 0
Team 100
같이 플레이해서
이겼으면 + 1 졌으면 -1 * alpha ( < 1 )
최종 남은 값
15. Experiment. Iter 1
3 0 2 1playerA B,C,D,E
3 -1 1 0playerB A,C,D,E
자기 팀 내의 소환사 조합만 고려
…. X 10
부록 : 버스 의심 혹은 천생의 연분
부록 : 고의 트롤링 의심
1 0 0 1 0…
챔피언 수
0 0 1 1 0…
챔피언 수
+
Team 100
+