[Day28] 캐글 경진대회 노하우 & Full Stack ML Engineer

캐글은 세계에서 가장 유명한 AI 경진대회 플랫폼이다.

 

 

캐글 경진대회

  • 캐글의 전반적인 소개로 너무 좋았다.
  • 어떻게 시작해야 하는지와 캐글 용어들에 대해서 자세히 알게 되었다.
  • 제출까지 파이프 라인을 먼저 만들고 진행하는 것이 좋다.

  • 이 파이프 라인을 기준으로 파라미터 및 feature engineering을 통해서 점수를 개선한다.

  • 또 이 파이프 라인이 너무 오래 걸리면 다른 방법을 찾아보는 것이 좋다 ex) GPU를 더 좋은 것으로 바꾼다 or 데이터를 줄여본다.

 

Full Stack ML Engineer

  • Full stack의 전반적인 파이프 라인으로 이해하기 좋았다.
  • Data version 관리 및 loader개발은 유익한 내용이였다.

 

 

  • 데이터 대시보드 - streamlit

 

 

피어세션

  • 저번에 풀어봤던 백준 17142번: 연구소 3에 대해서 다른 사람 소스를 보고 토론을 진행하였다.
import collections as col


def DFS(cnt, idx_list):
    if len(idx_list) == M:
        subset.append(idx_list)
        return
    for i in range(cnt, total_virus):
        if not used[i]:
            used[i] = 1
            DFS(i, idx_list + [i])
            used[i] = 0

def BFS(i, j, idx):
    que = col.deque()
    que.append((i, j))
    cnt = 1
    while que:
        for _ in range(len(que)):
            u, v = que.popleft()
            for n in range(4):
                if 0 <= u + dirs[n][0] < N and 0 <= v + dirs[n][1] < N:
                    if board[u + dirs[n][0]][v + dirs[n][1]] != 1:
                        if void_dict[(u + dirs[n][0], v + dirs[n][1])][idx] == 9999:
                            void_dict[(u + dirs[n][0], v + dirs[n][1])][idx] = cnt
                            que.append((u + dirs[n][0], v + dirs[n][1]))
        cnt += 1


def find_num(idxs):
    global answer
    max_value = 0
    for numbers in results:
        min_value = 9999
        for idx in idxs:
            if numbers[idx] < min_value:
                min_value = numbers[idx]
        if min_value > max_value:
            max_value = min_value
        if max_value >= answer:
            return
    answer = max_value


dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]
N, M = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
total_virus = 0
void_dict = {}
subset = []
answer = 9999

for i in range(N):
    for j in range(N):
        if board[i][j] == 2:
            total_virus += 1
            void_dict[(i, j)] = [9999] * 10
        elif not board[i][j]:
            void_dict[(i, j)] = [9999]*10

used = [0]*total_virus
DFS(0, [])

n = 0
for i in range(N):
    for j in range(N):
        if board[i][j] == 2:
            BFS(i, j, n)
            n += 1

for i in range(N):
    for j in range(N):
        if board[i][j] == 2:
            void_dict[(i, j)] = [0] * 10

results = list(void_dict.values())

for i in range(len(subset)):
    find_num(subset[i])

if answer == 9999:
    answer = -1

print(answer)

모든 경우의 수를 각각 탐색하는 방법이 아니라 각 바이러스가 걸리는 시간을 미리 저장해 두어서 그 값에서 최소값을 찾는 방식으로 시간을 단축하였다.

+ Recent posts