티스토리 뷰

SQL 코드카타

Q157. Top Earners

1. 문제 링크: https://www.hackerrank.com/challenges/earnings-of-employees/problem

2. 정답 코드:

SELECT
    (months * salary) as total,
    COUNT(*)
FROM Employee
WHERE (months * salary) = (SELECT MAX(months * salary) FROM Employee)
GROUP BY total;
집계 함수가 아닌 (months * salary) 컬럼은 GROUP BY로 묶어주기!
WHERE 절에서 monthe * salary는 2개 컬럼을 연결한 값이기 때문에 비교할 때 괄호로 적어주기

 

Q158. Weather Observation Station 13

1. 문제 링크: https://www.hackerrank.com/challenges/weather-observation-station-13/problem

2. 정답 코드:

SELECT ROUND(SUM(LAT_N), 4)
FROM STATION
WHERE LAT_N > 38.7880 AND LAT_N < 137.2345;

 

Q170. Weather Observation Station 20

1. 문제 링크: https://www.hackerrank.com/challenges/weather-observation-station-20/problem

2. 정답 코드:

SELECT ROUND(LAT_N, 4)
FROM (SELECT LAT_N, ROW_NUMBER() OVER (ORDER BY LAT_N DESC) AS rnk FROM STATION) as sub
WHERE rnk = (SELECT CEIL(COUNT(*)/2) FROM STATION)

3. 오류 상황: 중앙값의 순서를 찾는 방법을 쿼리로 구현하지 못함

4. 시도 방법: 생성형 AI를 활용해 힌트를 얻음

5. 최종 문제 해결 방법: 쿼리 구조 변경

 [문제 풀이 순서]
1. FROM 절에 윈도우 함수를 사용하여 서브쿼리 작성 → ROW_NUMBER() OVER (ORDER BY LAT_N DESC)
PARTITION BY가 아닌 ORDER BY를 쓰는 구조라서 익숙하지 않았다.

2. 중앙값의 순서를 찾기 위해 WHERE 절에서 서브쿼리 사용 → (SELECT CEIL(COUNT(*)/2) FROM STATION)
CEIL을 하지 않으면 COUNT(*)/2이 정수가 되지 않을 때 값이 나오지 않으므로 무조건 CEIL 해줘야 한다!

Python 코드카타 (https://github.com/heeso0908/codekata.git)

Q53. 명예의 전당 (1)

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/138477

2. 정답 코드:

def solution(k, score):
    answer = []
    temp = []
    for n in score:
        if len(temp) < k:
            temp.append(n)
            answer.append(min(temp))
        elif len(temp) == k:
            if min(temp) < n:
                temp.remove(min(temp))
                temp.append(n)
                answer.append(min(temp))
            else: 
                answer.append(min(temp))
    
    return answer
상위 k개 점수를 저장하는 temp 리스트와 최하위 점수를 저장하는 answer 리스트로 구분!  
if문을 중첩해서 작성해야 하는데,  

1) temp 리스트에 k개만 들어가야 하므로 len(temp)가 k보다 작을 때와 같을 때 2가지 케이스로 먼저 나눈다  
→ k보다 작을 때는 temp.append(n), 그리고 최하위 점수를 출력하기 위해 answer.append(min(temp))  

2) len(temp) == k 일 때는 경우가 나뉘는데,  
   새로 들어가는 n이 기존 최소값보다 클 때
    → 기존 min(temp) 값을 remove 하고 n을 append 한 후 answer.append(min(temp)) 해준다! ★중요★ 

   새로 들어가는 n이 기존 최소값보다 작거나 같을 때
    → answer.append(min(temp)) → n은 어차피 temp에 안 들어가니까

라이브 세션) 머신러닝 실습 4일차: 평가지표

sigmoid 쓰는 이유? 0~1 사이의 확률 값으로 만든다!

(sin 함수도 되는데 왜 sigmoid 쓸까? → 로짓(로그 + 오즈)을 가지고 확률 값을 구하기로 정의했기 때문에!)

로지스틱 회귀 = 로짓을 예측하는 회귀 → 로짓 값을 가지고 확률도 구할 수 있다! (분류)

태어난 핏줄은 회귀이지만, 출생의 비밀로 인해 현재 분류로 살아가고 있다.

 

오버피팅 막기 위해서 아래와 같은 하이퍼파라미터 조정!

 

1) C(규제 강도의 역수)

규제(regularization) = 극단적인 값이 안 나오도록 제한해주는 역할 (≠ 정규화(normalization))값이 작을수록 규제가 강함값이 클수록 규제가 약함

 

2) penaltyl2(가장 일반적)l1(불필요한 feature를 0으로 만들 수 있음 → feature selection 효과)

 

accuracy 쓰면 좋지만 불균형 데이터일 때는 f1-score를 봐야 하기 때문에, 주로 f1-score를 보면 값을 파악하기 용이하다!

 

트리기반 모델에서는 스케일링 안해도 괜찮다! → 실무에서 많이 사용


3) Base Rate Fallacy (기저율 오류)

기저율 = 사전 확률(Base Rate)→ 어떤 사건이 발생할 확률을 전체적으로 바라본 기본 확률

 

기저율 오류 → 특정 정보(추가 정보, 단서)에만 주목하고 전체 집단의 기본 확률(Base Rate)을 무시해 잘못된 판단을 하는 오류

라이브 세션) 머신러닝 이론 5일차: 분류

1) KNN (K-Nearest Neighbors) - 거리 기반 다수결

KNN은 지도학습 → 훈련 데이터에 이미 정답 값이 있음!

(정답값을 기준으로 + k개 기준으로) 새로운 데이터가 뭔지 분류!

 

KNN에서는 모델 성능보다는 어떤 데이터를 넣었는지가 중요함!

  • k값
  • 거리(어떤 거리 공식 적용했는지?)
  • 스케일링

(1) k값(홀수로 → 동률 방지하기 위해서)

k값 특징 문제
k 작음(1~3) 경계가 복잡 노이즈에 민감 → 과적합
k 큼(15~) 경계가 단순 세부 패턴 놓침 → 과소적합
k 적당 균형 교차검증(CV)으로 찾기

 

(2) 거리(유클리드 거리) : 피타고라스 정리 기반

 

(3) 스케일링 필수 : 거리 구하려면 단위 맞춰야 하니까?

스케일링 전후 Accuracy 차이가 많이 남!

근데 스케일링을 한다고 해서 무조건 Accuracy가 올라가는 것은 아님 → 더 정확한 결과가 나오는 것!


2) 결정 트리

각각의 박스 = 노드

gini: 불순도 → 0에 가까울 수록 혼란이 없어진다!

 

max_depth를 None(횟수 제한 X)으로 할 때, max_depth = 3인 경우보다 Accuracy가 더 낮았음!

→ 왜? 과적합으로 인해서 새로운 문제는 못풀기 때문에

 

좋은 질문 = gini(불순도)를 낮출 수 있는 질문!

 

2클래스 기준, gini(불순도) : 0 ~ 0.5

 

+ gini(불순도) 말고 엔트로피라는 값도 있음 (gini에 비해 계산 속도 느림)

 

(1) 하이퍼파라미터

  • max_depth
  • min_samples_split
  • min_samples_leaf

→ 같은 max_depth를 설정해줘도, min_samples_split이나 min_samples_leaf 조건에 위배되면 depth가 바뀔 수 있다!

 

(2) Feature Importance

불순도를 낮출 때 가장 기여했던 Feature를 말함 → 제일 중요한 Feature라는 뜻은 아님!

Feature가 많이 사용됐다는 뜻일 뿐 인과관계 성립을 말하는 것은 아님

 

F1, F2, F3이 비슷하다면 중요도를 나눌 수 있다? 하나의 Feature를 안 쓰는 것도 방법

 

(3) 결측치와 클래스 불균형 처리

  • 결측치(NaN)가 있으면 결정 트리 적용 못함 → SimpleImputer로 채워야 함
  • class_weight='balanced'를 사용하면 소수 클래스에 더 큰 가중치를 부여해서 균형 있는 학습을 시킬 수 있다

데이터 과학이나 머신러닝 공부를 시작하면 반드시 마주치게 되는 '차원의 저주(Curse of Dimensionality)'는 데이터의 차원(변수/특성)이 늘어날수록 오히려 모델의 성능이 떨어지고 분석이 어려워지는 현상을 말한다.

쉽게 말해, "정보(변수)가 많아질수록 더 정확해질 것 같지만, 실제로는 데이터가 너무 희소해져서 아무것도 찾을 수 없게 되는 상황"

 

1. 왜 이런 현상이 발생할까?

차원이 늘어남에 따라 우리가 직면하는 가장 큰 문제는 공간의 급격한 팽창

  • 데이터의 희소성 (Sparsity): 차원이 증가하면 공간의 부피가 기하급수적으로 늘어난다. 하지만 데이터의 양은 그대로라면, 데이터 사이의 거리가 너무 멀어져 빈 공간이 대부분을 차지하게 된다.
  • 거리 개념의 상실: 고차원에서는 모든 데이터 포인트 사이의 거리가 거의 비슷해진다. '가까운 이웃'과 '먼 이웃'의 구분이 모호해져서, 거리 기반 알고리즘(예: KNN, Clustering)이 제대로 작동하지 않는다.

2. 시각적인 예시 (상자에 담긴 공)

이해를 돕기 위해 1차원에서 3차원으로 확장되는 과정을 상상해 보자.

차원 비유 설명
1차원 (선) 10cm 선 위에 점 10개 점들이 촘촘하게 모여 있어 패턴을 찾기 쉽다.
2차원 (면) 10x10 사각형 안에 점 10개 점들이 여기저기 흩어지기 시작한다.
3차원 (입체) 10x10x10 상자 안에 점 10개 점들이 어디 있는지 찾기도 힘들 정도로 휑해진다.

만약 이게 100차원이라면? 데이터는 마치 광활한 우주에 떠 있는 먼지처럼 서로 너무 멀리 떨어져 있게 된다.

 

3. 어떻게 해결하나요?

데이터 과학자들은 이 '저주'를 풀기 위해 다음과 같은 전략을 사용한다.

  1. 차원 축소 (Dimension Reduction): 중요하지 않은 변수는 버리거나, 여러 변수를 합쳐 핵심적인 특성만 추출한다. (예: PCA, LDA)
  2. 데이터 추가 확보: 차원이 늘어난 만큼 공간을 채울 수 있도록 훨씬 더 많은 양의 데이터를 수집한다. (현실적으로 가장 어렵다.)
  3. 규제(Regularization) 적용: 모델이 너무 복잡해져서 개별 데이터(노이즈)에 과적합(Overfitting)되지 않도록 제약을 건다. (예: L1, L2 규제)

결국 차원의 저주는 "과유불급"이라는 말과 통한다. 변수가 많다고 무조건 좋은 게 아니라, 모델이 감당할 수 있을 만큼의 핵심 정보만 남기는 것이 기술!

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함