반응형
wb_sunny 오늘 일상 공유
오늘은 오전에 운동을 갔다가 부트캠프 수업을 듣고, 프로그래머스 문제 하나를 풀고 위클리 페이퍼를 마무리했다. 오늘 블로그는 프로그래머스 문제 풀이와 위클리 페이퍼에서 정리한 내용, 그리고 요즘 준비 중인 스터디 팀 이야기를 공유하려고 한다.
edit_note 오늘 코테 문제
| 문제 | 성격 유형 검사하기 |
| 플랫폼 | 프로그래머스 |
| 핵심 요구사항 | 설문 문항 survey와 각 문항에 대한 선택지 choices가 주어졌을 때, 8가지 성격 유형 지표 점수를 계산해서 4자리 성격 유형을 판별하기 |
python
def solution(survey, choices):
answer = ''
p_dict = {
'R':0,
'T':0,
'C':0,
'F':0,
'J':0,
'M':0,
'A':0,
'N':0
}
for index, i in enumerate(survey):
if choices[index] < 4:
p_dict[i[0]] += 4-choices[index]
elif choices[index] > 4:
p_dict[i[1]] += choices[index]-4
for i in range(0,8,2):
a = list(p_dict.keys())[i]
b = list(p_dict.keys())[i+1]
if p_dict[a] >= p_dict[b]:
answer += a
else:
answer += b
return answer
풀이 접근법
1
유형별 점수 딕셔너리 만들기
8가지 지표(R, T, C, F, J, M, A, N)를 key로 갖는 딕셔너리를 0점부터 시작해서 준비한다.
2
문항마다 선택지 점수를 지표에 반영
survey를 enumerate로 순회하면서 인덱스로 choices에 동시에 접근한다. 선택지가 1~7이고 4가 중립일 때, 1:3 / 2:2 / 3:1 / 4:0 / 5:1 / 6:2 / 7:3점으로 대응되기 때문에, 4보다 작으면 4 - 선택지만큼 문항의 앞쪽 지표(i[0])에, 4보다 크면 선택지 - 4만큼 뒤쪽 지표(i[1])에 점수를 더해준다.3
지표쌍끼리 비교해서 유형 완성
(R,T), (C,F), (J,M), (A,N) 두 개씩 짝을 지어 점수를 비교하고, 앞쪽 지표 점수가 같거나 크면 앞쪽 문자를, 아니면 뒤쪽 문자를
answer에 붙여서 4자리 유형을 완성한다.시간복잡도
첫번째 for문은 survey 길이(n)만큼 도니까 O(n), 두번째 for문은 지표 8개를 고정으로 도니까 O(4)로 상수다. 따라서 전체는 O(n) + O(1) = O(n)이 된다.
groups 위클리 페이퍼
지난번 위클리 페이퍼에서는 선형대수학과 머신러닝의 관계를 정리했다면, 이번에는 지도 학습과 비지도 학습의 차이, 손실 함수, 편향과 분산, K-폴드 교차 검증까지 정리해봤다.
지도 학습 vs 비지도 학습
위키피디아 정의에 따르면 지도 학습은 훈련 데이터로부터 하나의 함수를 유추해내기 위한 기계 학습의 한 방법이다. 여기서 훈련 데이터는 입력 벡터마다 정답이 함께 표시되어 있는 데이터를 말한다. 예를 들어 집값 예측이라면 [평수, 방 개수, 역까지 거리]라는 입력에 실제 집값이라는 정답이 짝지어져 있는 식이다.
지도 학습은 정답의 형태에 따라 다시 회귀와 분류로 나뉜다. 회귀는 연속형 변수 간의 관계를 수식(모형)으로 나타내고 그 수식이 실제 데이터를 얼마나 잘 설명하는지 확인하는 분석 방법이라 "얼마야?"를 묻는 문제고, 분류는 데이터 하나하나가 미리 정해둔 여러 그룹 중 어디에 속하는지 알아맞히는 문제라 "어디 소속이야?"를 묻는 문제로 정리했다.
반면 비지도 학습은 입력값에 대한 목표치(정답)가 주어지지 않는 상태에서, 데이터가 어떻게 구성되었는지 스스로 찾아내는 방법이다. 목적에 따라 비슷한 것끼리 묶는 군집화, 변수 개수를 줄이는 차원 축소, 항목 간의 숨은 관계를 규칙으로 찾아내는 연관 규칙 학습으로 나뉜다.
| 지도 학습 | 정답(Y)이 있는 데이터로 입력과 정답 사이의 함수를 유추 → 회귀(얼마야?) / 분류(어디 소속이야?) |
| 비지도 학습 | 정답 없이 입력만으로 데이터의 구조나 패턴을 스스로 발견 → 군집화 / 차원 축소 / 연관 규칙 학습 |
손실 함수(Loss Function)
손실 함수는 어떤 사건, 즉 모델의 예측 결과 하나를 넣으면 그게 얼마나 손해(오차)인지를 숫자로 알려주는 함수다. 학습이라는 게 결국 규칙이 맞는지 틀린지를 계속 확인하면서 고쳐나가는 과정인데, 그 틀린 정도를 숫자로 알려주는 역할을 손실 함수가 담당한다. 그리고 그 손실을 줄이는 방향으로 규칙을 계속 고쳐나가는 과정 자체가 학습이기 때문에, 손실 함수는 학습에서 빠질 수 없는 핵심 요소라고 정리했다.
편향과 분산의 관계
모델의 예측이 틀리는 원인은 크게 편향과 분산으로 나뉜다. 편향은 지나치게 단순한 가정 때문에 예측이 실제값에서 얼마나 멀리 떨어져 있는지를, 분산은 학습 데이터가 바뀔 때마다 예측이 얼마나 크게 흔들리는지를 나타낸다.
python
전체 오차 = 편향² + 분산 + 어쩔 수 없는 노이즈
이 둘은 따로 움직이지 않고 한쪽을 조절하면 다른 쪽도 같이 반응한다는 게 핵심이었다. 모델이 복잡해질수록(파라미터가 많아질수록) 테스트할 때마다 예측값이 많이 흔들려서 분산이 커지고, 반대로 모델이 단순해질수록 예측이 정답에서 일정하게 벗어나서 편향이 커진다. 학습 데이터도 테스트 데이터도 둘 다 못 맞추면 편향이 문제고, 학습할 땐 잘 맞추다가 테스트에서 갑자기 못 맞추면 분산이 문제라는 식으로 구분한다고 정리했다.
K-폴드 교차 검증에서 K를 고를 때
K-폴드 교차 검증은 데이터셋을 K개의 폴드로 나눠서 K-1개로 학습하고 나머지 1개로 테스트하는 과정을 K번 반복하는 리샘플링 기법이다. 모든 데이터가 학습에도 테스트에도 최소 한 번씩은 참여하기 때문에, 특정 데이터만 계속 테스트에서 빠지거나 계속 테스트로만 쓰이는 편중이 없어진다.
K값 선택도 결국 편향-분산 트레이드오프와 연결된다. K가 작으면 학습에 쓰는 데이터가 줄어서 편향이 커지고, K가 크면 폴드마다 결과가 들쭉날쭉해져서 분산과 계산 비용이 커진다. 그래서 데이터가 적을 때는 K를 크게 해서 학습에 최대한 활용하고, 데이터가 많을 때는 K를 작게 해도 충분하다고 정리했다. 분류 문제에서 클래스 비율이 안 맞는다면 stratified k-fold로 각 폴드의 클래스 비율을 유지해주는 것도 고려해야 한다. 일반적으로는 편향-분산 균형과 계산 비용을 종합했을 때 K=5 또는 K=10이 실무에서 무난한 절충점으로 널리 쓰인다.
오늘 정리한 것
✓지도 학습은 정답 있는 데이터로 함수를 유추(회귀/분류), 비지도 학습은 정답 없이 구조를 스스로 발견(군집화/차원 축소/연관 규칙 학습)한다.
✓손실 함수는 예측이 얼마나 틀렸는지 숫자로 알려주고, 그 숫자를 줄이는 과정 자체가 학습이다.
✓편향과 분산은 한쪽을 줄이면 다른 쪽이 커지는 트레이드오프 관계이며, K-폴드의 K값도 이 트레이드오프를 고려해서 정한다.
diversity_3 스터디 팀 모집
요즘 부트캠프 내에서 8주 과정의 초보자 대상 ML 스터디 팀을 모집하고 운영하려고 준비 중이다. 다행히 함께하는 팀원들이 적극적이라 준비하는 입장에서도 자연스럽게 더 열심히 하게 되는 것 같다. 아직 부족한 부분도 많지만, 팀원들에게 도움이 될 수 있도록 계속 준비해나갈 생각이다.
nights_stay 오늘 하루 회고
위클리 페이퍼를 진행하면서 개념을 정리해보는 시간이 나에게는 꼭 필요한 시간이라는 걸 다시 느꼈다. 하나의 질문에 답을 적기까지 최소 한 시간은 걸리는 것 같은데, 그만큼 개념을 한 번 파악할 때 제대로 알아보고 싶은 욕심이 있는 것 같다. 과하지 않은 욕심으로 개념을 하나씩 채워나가면서 남들보다 뒤처지지 않고 열심히 따라가야겠다는 생각이 든다. 스터디 팀을 모집하는 것도 팀원들이 적극적이어서 정말 다행이고, 그 덕분에 더 열심히 하게 되는 것 같다. 부족한 부분이 있더라도 뭐든 잘 해낼 수 있도록 계속 노력해야겠다.
반응형
'AI' 카테고리의 다른 글
| [부트캠프 휴강일] 이론과 실습을 연결해보자 - 선형 회귀와 다중 선형 회귀 (0) | 2026.07.18 |
|---|---|
| [부트캠프 8일차] 선형대수학 (1) | 2026.07.13 |
| [부트캠프 5일차] 첫 멘토링 후기 (0) | 2026.07.08 |
| [부트캠프 3일차] 시간복잡도와 DataFrame 전처리 정리 (0) | 2026.07.06 |
| [부트캠프 2일차] 파이썬 기초부터 OOP까지 (0) | 2026.07.03 |
