카테고리 없음

6/24 천꾸

tundercloud 2026. 6. 24. 19:30

에이타니

 

RMSE

- 제곱 과정을 거치기 때문에 큰 오차에 더 큰 패널티를 주며, 원래 단위로 표현된다. → 제곱으로 인해 큰 오차에 더 민감하게 반응한다.

- 수학적으로 RMSE ≥ MAE 가 항상 성립

MAE

- 단순히 예측값과 실제값의 평균 절대 오차를 나타내므로 원래 단위 그대로 직관적으로 이해할 수 있다.

- 모든 오차를 절댓값으로 처리하여 이상치의 영향을 덜 받는다.

F1- score

- Precision과 Recall의 조화평균으로 계산된다.

공식 : 2 * (precision * recall) / (precision + recall)

→ 조화평균을 사용하는 이유 : precision과 recall 중 하나라도 낮으면 F1-score도 낮아지도록 하여 두 지표의 균형을 평가하기 위함.

 

- 불균형 데이터셋에서 질병 진단 모델을 평가할 때, 실제 질병 환자를 놓치지 않는 것이 가장 중요한 경우 우선적으로 고려해야할 평가지표는?

False Negative (실제 질병인데 정상으로 예측)를 최소화하는 것이 목표일 때 Recall이 중요하다.

Recall 실제 양성(Positive) 샘플 중 모델이 양성으로 예측한 비율(TP/(TP+FN))을 나타낸다.
Precision 양성으로 예측한 것 중 실제 양성의 비율로, 오진을 줄이는 데 중점을 둔다.
Accuracy 불균형 데이터에서 신뢰하기 어렵다.
F1-score precision과 recall의 균형을 보지만 특정 지표를 우선할 때는 부적절하다.

코드카타

 

89번 할인 행사

 

XYZ 마트는 일정한 금액을 지불하면 10일 동안 회원 자격을 부여합니다. 

XYZ 마트에서는 회원을 대상으로 매일 한 가지 제품을 할인하는 행사를 합니다. 

할인하는 제품은 하루에 하나씩만 구매할 수 있습니다. 

알뜰한 정현이는 자신이 원하는 제품과 수량이 할인하는 날짜와 10일 연속으로 일치할 경우에 맞춰서 회원가입을 하려 합니다.

예를 들어, 정현이가 원하는 제품이 바나나 3개, 사과 2개, 쌀 2개, 돼지고기 2개, 냄비 1개이며, XYZ 마트에서 14일간 회원을 대상으로 할인하는 제품이 날짜 순서대로 치킨, 사과, 사과, 바나나, 쌀, 사과, 돼지고기, 바나나, 돼지고기, 쌀, 냄비, 바나나, 사과, 바나나인 경우에 대해 알아봅시다. 

첫째 날부터 열흘 간에는 냄비가 할인하지 않기 때문에 첫째 날에는 회원가입을 하지 않습니다. 

둘째 날부터 열흘 간에는 바나나를 원하는 만큼 할인구매할 수 없기 때문에 둘째 날에도 회원가입을 하지 않습니다. 

셋째 날, 넷째 날, 다섯째 날부터 각각 열흘은 원하는 제품과 수량이 일치하기 때문에 셋 중 하루에 회원가입을 하려 합니다.

정현이가 원하는 제품을 나타내는 문자열 배열 want와 정현이가 원하는 제품의 수량을 나타내는 정수 배열 number, XYZ 마트에서 할인하는 제품을 나타내는 문자열 배열 discount가 주어졌을 때, 회원등록시 정현이가 원하는 제품을 모두 할인 받을 수 있는 회원등록 날짜의 총 일수를 return 하는 solution 함수를 완성하시오. 가능한 날이 없으면 0을 return 합니다.

제한사항
- 1 ≤ want의 길이 = number의 길이 ≤ 10
- 1 ≤ number의 원소 ≤ 10
- number[i]는 want[i]의 수량을 의미하며, number의 원소의 합은 10입니다.
- 10 ≤ discount의 길이 ≤ 100,000
- want와 discount의 원소들은 알파벳 소문자로 이루어진 문자열입니다.
- 1 ≤ want의 원소의 길이, discount의 원소의 길이 ≤ 12

● 매 날짜마다 10일을 다시 확인하면 비효율적이므로 슬라이딩 윈도우를 사용한다.
● 처음 10일의 상품 개수를 dict에 저장하고, 날짜가 이동할 때마다:
 ○ 빠지는 상품 개수 감소
 ○ 추가되는 상품 개수 증가
● 현재 10일의 상품 개수와 원하는 상품 개수를 비교해서 조건을 만족하는 날짜를 찾는다.
def solution(want, number, discount):

    answer = 0

    # 원하는 제품 개수 저장
    want_dict = {}

    for i in range(len(want)):
        want_dict[want[i]] = number[i]

    # 처음 10일 할인 제품 개수
    window = {}

    for i in range(10):
        window[discount[i]] = window.get(discount[i], 0) + 1


    # 현재 윈도우가 조건 만족하는지 확인
    if window == want_dict:
        answer += 1

    # 슬라이딩 윈도우
    for i in range(10, len(discount)):

        # 빠지는 상품 제거
        remove = discount[i-10]

        window[remove] -= 1

        if window[remove] == 0:
            del window[remove]

        # 추가되는 상품
        add = discount[i]

        window[add] = window.get(add, 0) + 1

        # 비교
        if window == want_dict:
            answer += 1

    return answer

90번 의상

 

코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다.

예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야합니다.

종류 이름
얼굴 동그란 안경, 검정 선글라스
상의 파란색 티셔츠
하의 청바지
겉옷 긴 코트


● 코니는 각 종류별로 최대 1가지 의상만 착용할 수 있습니다. 예를 들어 위 예시의 경우 동그란 안경과 검정 선글라스를 동시에 착용할 수는 없습니다.
●  착용한 의상의 일부가 겹치더라도, 다른 의상이 겹치지 않거나, 혹은 의상을 추가로 더 착용한 경우에는 서로 다른 방법으로 옷을 착용한 것으로 계산합니다.
●  코니는 하루에 최소 한 개의 의상은 입습니다.
코니가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항
- clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
 -코니가 가진 의상의 수는 1개 이상 30개 이하입니다.
 -같은 이름을 가진 의상은 존재하지 않습니다.
 -clothes의 모든 원소는 문자열로 이루어져 있습니다.
 -모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.

● 각 종류의 옷 개수를 구한 뒤,
해당 종류에서 "입지 않는 경우"도 포함해서 (옷 개수 + 1)을 곱한다.
● 마지막에는 모든 종류의 옷을 입지 않는 경우가 포함되어 있으므로 1을 빼준다.
● 딕셔너리를 사용해 옷 종류별 개수를 저장하고 조합 공식을 적용했다.
● 개념 
  ○ Dictionary로 종류별 개수 카운팅
  ○ 조합 : (각 종류 개수 +1)의 곱 -1
  ○ 전체 탐색보다 경우의 수 계산으로 접근하기
def solution(clothes):
    answer = 1
    
    clothes_dict = {}
    
    # 종류별 옷 개수 저장
    for name, kind in clothes:
        if kind not in clothes_dict:
            clothes_dict[kind] = 1
        else:
            clothes_dict[kind] += 1
            
    # 각 종류별 (옷 개수 + 안 입는 경우)를 곱함
    for count in clothes_dict.values():
        answer *= (count + 1)
        
    # 아무것도 입지 않은 경우 제외
    return answer - 1

91번 기능개발

 

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

제한 사항
- 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
- 작업 진도는 100 미만의 자연수입니다.
- 작업 속도는 100 이하의 자연수입니다.
- 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

● 기능마다 완료까지 걸리는 날짜를 먼저 계산한다.
● 배포는 순서대로 진행되므로 완료 날짜 배열을 만든 뒤 비교한다.
● 현재 배포 기준 날짜보다 작거나 같은 기능은 함께 배포한다.
● 완료 날짜가 더 크면 새로운 배포 그룹을 만든다.

● 개념 : 
  ○ 올림 나눗셈 : (a+b-1)//b
  ○ Queue처럼 앞 작업 기준으로 뒤 작업을 묶는 방식
def solution(progresses, speeds):
    answer = []

    days = []

    # 각 기능이 완료되는 날짜 계산
    for p, s in zip(progresses, speeds):
        remain = 100 - p
        day = (remain + s - 1) // s  # 올림 계산
        days.append(day)

    # 배포 그룹 만들기
    current = days[0]
    count = 1

    for day in days[1:]:
        if day <= current:
            count += 1
        else:
            answer.append(count)
            current = day
            count = 1

    answer.append(count)

    return answer

머신러닝 심화 강의

머신러닝 심화 챕터1.ipynb
1.02MB
머신러닝 심화 챕터2.ipynb
0.11MB


머신러닝 심화 라이브세션 3회차

 

1. 이상탐지

구분 Anomaly (이상) Abnormal (비정상)
관점 희소성 (얼마나 드문가?) 부적합성 (규칙을 어겼는가?)
상태 본 적 없는 새로운 패턴(Unknown) 이미 알고 있는 잘못된 패턴 (Known Bad)
분석 목표 "평소와 다른 것을 찾아내자" "불량품을 골라내자"
QAQC 적용 예방 보전, 신규 불량 유형 감지 최종 합격/불격 판정, 공정 규격 관리

 

2. 이상의 형태

● 점 이상치

- 가장 일반적이고 단순한 형태

- 전체 데이터 분포에서 완전히 벗어난 단일 데이터 지점

ex) 센서 오작동으로 인해 갑자기 온도가 5,000도 (정상 범위 20~40도)로 튀는 경우

 

● 상황적 이상치

- 특정 문맥이나 조건 하에서만 이상치로 판단되는 데이터

ex) 한겨울 새벽 기온이 30도 인것은 이상

 

● 집단 이상치

- 개별 데이터는 정상 범주에 속하나, 이들이 모여서 형성하는 패턴이 전체 데이터의 흐름과 다른 경우

ex) 작은 진동이 장기간 누적고 한계(임계치에) 도달하면 문제 발tod

 

3. 데이터의 불균형 문제

머신러닝 모델이 학습할 데이터 세트에서 각 클래스(정상/이상)가 차지하는 비중이 어느 한쪽으로 과도하게 치우친 상태를 말함.

○ 다수 클래스 : 데이터의 대부분을 차지하는 클래스 (예 : 정상 제품)

○ 소수 클래스 : 데이터가 극히 적은 클래스 (예 : 불량 제품)

 

4. 불균형 해소 

 4-1. 평가 방법의 변화 : 정확도 대신 '재현율'

이상 탐지에서 가장 중요한 것은 "불량을 얼마나 안 놓치고 잡았는가"이다.

정확도 (Accuracy) 정밀도 (Precision) 재현율 (Recall)
전체 중 맞힌 개수 (불균형 데이터에선 무의미) 모델이 불량이라고 예측한 것들 중에서 실제 불량인 비율 실제 불량들 중에서 모델이 불량이라고 맞힌 비율
시험 문제 100개 중 99개의 정답이 'A'인 상황 모델이 너무 예민해서 정상 제품까지 다 불량이라고 하면 작업자들이 피곤해짐. 정밀도는 '양치기 소년'이 되지 않기 위한 지표임 100개의 불량 제품이 나갔는데, 모델이 90개를 잡아냈다면 재현율은 90%임. 나머지 10개는 고객에게 전달. 실무에서는 이 10개를 줄이는 것이 핵심

 

 4-2 데이터 조정 기법 : 샘플링 (Sampling)

오버 샘플링 (Over-sampling) - SMOTE

- 원리 

○ 소수의 데이터(불량) 중 하나를 선택

○ 그 데이터와 가장 가까운 이웃을 찾음

○ 두 데이터 사이의 직선상에 새로운 가짜 데이터를 생성

- 효과

○ 단순히 똑같은 데이터를 복제하는 것보다 과적합 방지에 훨씬 효과적이다.

 

5. 주요 알고리즘 및 작동 원리

● Isolation Forest 

- 원리 : 데이터를 랜덤하게 계쏙 반으로 나누다보면 이상치는 정상 데이터보다 훨씬 적은 횟수만으로도 혼자 남겨진다.

- 특징 : 구조가 던순해서 데이터가 많아도 매우 빠르고 강력하다.

 

● LOF (Local Outlier Factor)

- 원리

○ 데이터의 '밀도(Density)를 이용

○ 단순히 멀리 떨어져 있다고 이상치가 아니라, 내 주변 이웃들의 밀도에 비해 나의 밀도가 현저히 낮을 때 이상치라고 판단함.

- 특징 : 데이터가 군집별로 밀도가 다를 때 매우 효과적이다.

 

● Autoencoder 

- 원리 : 데이터를 아주 작게 압축했다가 다시 원래대로 복원하는 과정을 거침

→ 모델은 정상 데이터만 반복 학습하여 정상적인 패턴을 복원하는 데 도사가 됨.

- 특징 : 이미지나 복잡한 세서 데이터의 패턴을 잡을 때 아주 유리함.

 

6. 이상 탐지 모델의 평가 지표

● 필수 지표 3종

1. 재현율 (Recall) - "불량 사냥꾼"

- 의미 : 실제 불량 중에서 모델이 몇 개나 찾아냈는가?

- 실무적 관점

가장 중요한 지표. 재현율이 낮으면 불량품이 시장에 유출됨.

"일단 의심되면 다 잡아라!"라는 전략일 때 높게 나옴.

 

2. 정밀도 (Precision) - "신중한 검사관"

- 의미 : 모델이 불량이라고 찍은 것들 중 진짜 불량은 몇 개인가?

- 실무적 관점

정밀도가 낮으면 '양치기 소년'이 됨.

멀쩡한 제품을 자꾸 불량이라 판정하니 작업자가 모델을 안 믿게 됨.

 

3. F1-score - "균형 잡힌 전문가"

- 의미 : 정밀도와 재현율의 조화 평균.

- 실무적 관점

재현율을 높이려고 무조건 '불량'이라 하면 정밀도가 깨지고, 정밀도를 높이려고 확실한 것만 불량이라 하면 재현율이 깨짐.

이 둘의 밸런스를 보는 지표

 

● ROC 및 AUC

데이터의 임계값(Threshold)을 바꿀 때마다 모델의 성능이 어떻게 변하는지 한눈에 보여주는 곡선

ROC 곡선 '불량을 잘 잡는 능력'(TPR)**과 '멀쩡한 걸 불량으로 오해하는 실수'(FPR) 사이의 관계를 그린 선
AUC 곡선 아래의 면적
1에 가까울수록 어떤 상황에서도 이상치를 기가 막히게 구분해내는 '천재 모델'임을 뜻함.