티스토리 뷰

SQL 코드카타

Q144Weather Observation Station 12

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

2. 정답 코드:

SELECT DISTINCT CITY
FROM STATION
WHERE LEFT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u')
  AND RIGHT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u');

 

Q145. Higher Than 75 Marks

1. 문제 링크: https://www.hackerrank.com/challenges/more-than-75-marks/problem

2. 정답 코드:

SELECT Name
FROM STUDENTS
WHERE Marks > 75
ORDER BY RIGHT(Name, 3), ID;

 

Q168. Binary Tree Nodes

1. 문제 링크: https://www.hackerrank.com/challenges/binary-search-tree-1/problem

2. 정답 코드:

SELECT N,
    CASE
        WHEN P IS NULL THEN 'Root'
        WHEN N IN (SELECT DISTINCT P FROM BST) THEN 'Inner'
        ELSE 'Leaf'
    END AS node_type
FROM BST
ORDER BY N;

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

Q51. 푸드 파이트 대회 ★

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

2. 정답 코드:

def solution(food):
    left = ''
    for i in range(1, len(food)):
        left += str(i) * (food[i]//2)
    return left + '0' + left[::-1]
0을 기준으로 좌우 대칭구조! → left + 0 + left[::-1]  
for 문 사용해서 left 만들어야 하는데, range(1, len(food))로 해줘야 함  
food[i]//2 (몫) 만큼 str(i) 반복!


라이브 세션) 머신러닝 이론 3일차: 전처리, 분류 모델 평가지표

1) 전처리(Preprocessing)


2) 인코딩(Encoding)

: 범주형 데이터의 글자(문자열)를 직접 계산할 수 없음 → 숫자로 인코딩해서 계산!

 

레이블 인코딩 vs 원-핫 인코딩

레이블 인코딩은 숫자 크기에 따라 중요도를 다르게 인식할 수 있어서, 원-핫 인코딩을 많이 쓰는 추세(차원을 늘려서 관리)


+ 벡터화 (리스트=배열로 만들기)

CountVectorizer 사용

단어 사전을 만들어서 숫자로 각 단어들을 바꿔줌


3) 스케일링

StandardScaler : 평균과 표준편차를 이용해 스케일링을 해서 이상치에 민감

RobustScaler : 중앙값과 IQR을 가지고 스케일링을 해서 이상치에 덜 민감 (이상치 없는 IQR 50%만 가지고 하니까)

MinMaxScaler : 거리 기반 모델(ex. KNN)에서 잘 작동, Min=0 / Max=1 로 간주하여 나머지 숫자는 비율로서 표현


4) 정규화(Normalization)

원래 벡터는 크기가 있는 방향 이지만,

정규화는 길이(크기) 영향을 지우고, 방향(패턴)만 비교! (길이를 모두 1로 맞추기)

→ 영화 추천처럼 크기보다는 패턴(취향)이 중요한 경우에는 정규화!!



5) 전처리 단계에서의 데이터 누수 방지 → Pipeline

train 데이터에서만 fit을 하고, test 데이터에서만 transform을 한다! 

→ Pipeline



6) 불균형 데이터

: 한 클래스가 극소수인 상황 (ex. 사기, 암 환자, 스팸)

→ 정확도가 높아지므로 주의!


7) 지표

Positive(양성) : 내가 찾고 싶은(관심있는) 대상

Negative(음성) : 나머지

recall: 양성을 얼마나 잡았냐, 내가 관심이 있는 것을 놓치지 않았냐?

precision: 양성 중 진짜 양성? 헛발질 안 했나?

F1: trade-off (저울질) → recall과 precision 균형 맞추기

ROC: 기준값을 바꿔도 Positive랑 Negative를 잘 구분하나?

PR: 불균형한 데이터에서도 Positive를 잘 찾나?


8) 혼동행렬(Confusion Matrix)

여기서 0과 1은 각각 클래스이다.

(1) support 값을 확인해서 각 클래스별 비유 확인 → 균형/불균형 데이터 여부 확인

(2) precision / recall / F1 / support 값 확인

(3) macro avg, weighted avg 간에 차이가 있는지 없는지 확인

(4) 마지막으로 confusion matrix 확인

 

Recall (실제 양성인 것 중에서 얼마나 양성이라고 예측했는지 비율) = TP / (TP + FN)

Precision (양성이라고 예측한 것 중에서 실제 얼마나 양성인지 비율) = TP / (TP + FP)

-> Recall과 Precision 간 줄다리기(Trade-off)를 할 수 밖에 없는게 분자는 똑같은데 분모에서 FN or FP 차이가 나니까 결과 값이 반대로 나올 수 밖에

 

Recall을 볼건지, Precision을 볼건지 어떻게 정할까? → 비용(Cost)를 봐서 정하기

근데 둘 다 중요하면? → F1 값 보기!

 

precision -> 오탐지 비율 줄일때

recall -> 누락 비율 줄일때

F1 -> 조화평균

macro/balanced/weighted -> ??


9) 임계값(Threshold)

: 보통은 0.5를 기준으로 양성/음성 판단 → 임계값 수치 조정도 가능함!

임계값 조절 = 결정 or 정책을 튜닝?

 

임계값이 낮아지니까 recall이 올라감

임계값이 높아지니까 precision이 올라감

 

임계값을 바꾼다고 해서 모델이 재학습을 할 필요는 없음


10) ROC & AUC

어떠한 하나를 뽑았을 때 양성인지 음성인지 확률 → AUC


11) PR 곡선(Precision - Recall Curve)

오른쪽으로 갈수록 많이 잡고 정확하게 잡는다


 

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함