LG DX DATA SCHOOL

01/14

getfeelingsfrom 2026. 1. 15. 09:11

프레임워크~~ 

 

지도학습일때도 분류형 (머신러닝을 가장 많이 사용하는 .) 

 

 

1. 데이터 로딩 

import pandas as pd #데이터 수집/ 로드 

# 붓꽃 데이터 세트를 로딩합니다. 
iris = load_iris()

# iris.data는 Iris 데이터 세트에서 피처(feature)만으로 된 데이터를 numpy로 가지고 있습니다. 
iris_data = iris.data

# iris.target은 붓꽃 데이터 세트에서 레이블(결정 값) 데이터를 numpy로 가지고 있습니다. 
iris_label = iris.target
print('iris target값:', iris_label)
print('iris target명:', iris.target_names)

# 붓꽃 데이터 세트를 자세히 보기 위해 DataFrame으로 변환합니다. 
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
iris_df['label'] = iris.target
iris_df.head(3)

 

2. 데이터 분할 

#목표 : feature(x)가 label(y)을 향해서 감 
X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label, 
                                                    test_size=0.2, random_state=11)

 

 

  • X는 feature임
  • y는 label임
    => feature와 label을 함께 분리함

 

  • X_train은 학습용 feature임
  • y_train은 학습용 label임
  • 모델은 X_train을 입력으로 받음
  • 목표는 y_train을 맞추는 것임

feature(x)가 label(y)을 향해 간다”의 의미

  • 지도학습의 본질적 구조임
  • 입력 공간에서 출력 공간으로 매핑함
  • 모든 학습 과정은 y값을 기준으로 조정됨
  • 손실함수는 y와 예측값(ŷ)의 차이를 측정함

 

# DecisionTreeClassifier 객체 생성 
dt_clf = DecisionTreeClassifier(random_state=11) #지정된 랜덤값을 유지하라는 의미

# 학습 수행 
dt_clf.fit(X_train, y_train)

 

 

 

y값은 반드시 factor : 분류형이어야 함 

X_train과 y_train순서대로

  • DecisionTreeClassifier는 분류 알고리즘임
  • 의사결정나무 기반 모델임
  • random_state는 랜덤성 고정용 옵션임
  • 동일한 데이터 사용 시 동일한 트리 구조 유지함

=> 그만큼 품질좋은 데이터가 결과(성능)를 좌우 한다 

 

feature(X)에 대한 정리

  • feature는 입력 변수임
  • 대부분 연속형 값임
  • 실수값 사용이 기본임
  • 분류 여부와 무관함
  • 계산 가능하면 충분함

예시

  • 시청 시간
  • 이용 일수
  • 키, 몸무게
  • 센서 값

 

label(y)에 대한 정리

  • label은 예측 대상임
  • 분류 문제에서는 범주형이어야 함
  • 모델이 맞춰야 하는 정답임

이진 분류

  • 0 / 1

다중 분류

  • 0, 1, 2 …

 

분류 모델의 실제 계산 흐름

  • X는 연속형 입력값임
  • 모델 내부에서 가중합 계산함
  • 계산 결과는 연속형 점수임
  • 이 값은 아직 분류 결과 아님
  • X는 연속형 입력값임
  • 모델 내부에서 가중합 계산함
  • 계산 결과는 연속형 점수임
  • 이 값은 아직 분류 결과 아님

 

시그모이드 함수의 정확한 역할

  • feature를 변환하지 않음
  • 모델 출력값을 변환함
  • 연속형 점수를 확률로 변환함
  • 출력 범위는 0~1임

 

이진 분류에서의 구조

  • 모델 출력 → 연속형 값임
  • 시그모이드 적용 → 확률값임
  • 임계값 기준 적용함
  • 최종 결과는 0 또는 1임

 

왜 시그모이드를 쓰는가

 

  • 입력값 범위는 −∞ ~ +∞ 임
  • 출력값 범위는 0 ~ 1 임
  • 분류 결과를 확률로 해석하기 위함임
  • 손실함수 계산을 가능하게 하기 위함임
  • 확률 기반 의사결정에 사용함\

 

 

 

이진 분류(Binary Classification) 성능을 평가할 때 사용하는 혼동행렬(Confusion Matrix) 을 설명

 

가로축과 세로축의 의미가 핵심입니다.

  • 가로축: 예측값 (Prediction)
    • 0 = Negative (neg)
    • 1 = Positive (pos)
  • 세로축: 실제값 (Actual / 실측치)
    • 0
    • 1

“모델이 이렇게 예측했고, 실제는 이랬다”를 교차해서 본 표

 

네 개의 칸 의미 (아주 중요)

① TN (True Negative)

  • 실제: 0
  • 예측: 0
  • 의미:
    → Negative를 Negative로 맞춤
  • 예:
    • 해지 안 한 고객 → 해지 안 한다고 예측
  • 그림: 왼쪽 위 (초록색)

 

② FP (False Positive)

  • 실제: 0
  • 예측: 1
  • 의미:
    → Negative인데 Positive로 잘못 예측
  • 예:
    • 해지 안 할 고객 → 해지할 거라고 잘못 판단
  • 그림: 오른쪽 위 (주황색)

③ FN (False Negative)

  • 실제: 1
  • 예측: 0
  • 의미:
    → Positive인데 Negative로 놓침
  • 예:
    • 실제 해지 고객 → 해지 안 한다고 예측

 

④ TP (True Positive)

  • 실제: 1
  • 예측: 1
  • 의미:
    → Positive를 Positive로 맞춤
  • 예:
    • 해지 고객 → 해지한다고 정확히 예측

 

 

 

  • 전체 중에서 맞춘 비율 => “전체 예측 중에서 정답을 맞힌 비율”

용어해지 분석 의미

Positive (1) 해지
Negative (0) 유지
TP 해지 고객을 정확히 잡음
FN 해지 고객을 놓침 (가장 위험)
FP 괜히 해지 위험으로 오판
TN 안정 고객 정확히 분류

 

 

혼동행렬은
모델이 무엇을 맞추고, 무엇을 틀렸는지
네 가지 경우(TN, FP, FN, TP)로 나누어
분류 모델의 성능을 해석하는 도구

 

 

 

 

1을 기준으로 

실측치 기준 = 재현율 = TP/(FN+TP) =민감도=참 양성률이라고도 한다 //# 자주 사용 (일반적으로)

예측치 기준 = 정밀도 = TP/(TP+FP) = 양성예측률 -> 스팸메일(FP) ..스팸메일을 휴지통에 버려서 나 확인 못하게 하는 것 

 

 

관심사가 = POSITIVE : 사기거래 = 1 

FP : 귀무가설이 맞는데 대립 가설을 채택하는 경ㅇ우 1종오류 ( 이진오류롤 봤을 때) 

 

FN: 대립가설이 맞는데 귀무가설을 채택한 경우 => 2종오류 

 

 

“1(Positive)”을 기준으로 본다는 의미

  • Positive(1) = 우리가 관심 있는 사건
    • 예: 사기거래, 질병 있음, 스팸메일, 해지
  • 모든 지표는 **“1을 얼마나 잘 잡았는가”**를 중심으로 해석


재현율

실측치 기준 → 재현율(Recall)

정의 재현율 = TP/ (FN + TP)

의미

  • 실제로 1인 것들 중에서
  • 모델이 1이라고 맞힌 비율

=> “놓치지 않고 얼마나 잘 잡았나?”

다른 이름

  • 민감도 (Sensitivity)
  • TPR (True Positive Rate, 참양성률)

언제 중요한가

  • FN이 치명적인 문제
    • 사기거래
    • 암 진단
    • 해지 고객 탐지
      ✔ “진짜 위험한 애들 중에서, 내가 얼마나 놓치지 않았나?”

재현율과 정밀도는 trade -off 관계에 있다 

 

 

정밀도(Precision)

precision = TP/TP+FP

의미

  • 1이라고 예측한 것들 중에서
  • 진짜 1인 비율

->  “내가 1이라고 한 말이 얼마나 믿을 만한가?”

다른 이름

  • 양성예측률 (PPV, Positive Predictive Value)

스팸메일 예시 (아주 적절함)

  • FP = 정상 메일을 스팸으로 분류
  • 결과:
    → 중요한 메일을 휴지통에 버려서 아예 못 봄
  • 차라리 스팸 하나 놓치는 게 낫지, 중요한 메일 버리면 안 된다”

Precision vs Recall 한 줄 비교

구분 기준 질문
재현율(Recall) 실제 1 “놓치지 않았나?”
정밀도(Precision) 예측 1 “믿을 만한가?”

 

precision과 recall은 trade-off 관계에 있다 

Recall을 높이려고 하면 Precision이 떨어지고,
Precision을 높이려고 하면 Recall이 떨어지는 관계

 

=

  • FN을 줄이면 FP가 늘어나고
  • FP를 줄이면 FN이 늘어나는 구조

 

분류 기준선(threshold)이 하나이기 때문

로지스틱 회귀나 대부분의 분류 모델은:

  • 결과를 확률(0~1) 로 출력
  • 우리가 임의로 cut-off(보통 0.5) 를 정해 0/1로 나눔

Threshold를 움직이면 무슨 일이 생기나

(1) Threshold ↓ (낮게 잡음)

예: 0.5 → 0.3

  • 조금만 위험해 보여도 Positive(1) 로 판단
  • 결과:
    • TP ↑
    • FN ↓
    • FP ↑

Recall ↑ / Precision ↓

=> 웬만하면 다 잡자 (놓치지 말자)”

 

(2)Threshold ↑ (높게 잡음)

예: 0.5 → 0.7

  • 정말 확실한 경우만 Positive(1)
  • 결과:
    • FP ↓
    • TP ↓
    • FN ↑

Precision ↑ / Recall ↓

=> “확실한 것만 잡자 (오판하지 말자)”

 

조정 Precision Recall 발생 현상
Threshold ↓ FP 증가, FN 감소
Threshold ↑ FP 감소, FN 증가

 

 

=> Precision과 Recall은 분류 기준(threshold)에 따라

서로 반비례적으로 변하는 trade-off 관계에 있다.

 

 

#정확도에 관한 코드 
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
sdata = load_breast_cancer()
print(sdata.DESCR) #메타정보까지 전달 

#데이터 구조가 정형 데이터일 때 효과가 있다

 

  • sdata는 Bunch 객체 (dict처럼 접근 가능)
  • DESCR:
    • 데이터 출처
    • feature 설명
    • 타깃 클래스 의미
    • 전체 데이터 구조

 

Feature(X)와 Label(y) 분리

X = sdata.data
y = sdata.target
  • X (features)
    • shape: (샘플 수, 변수 수)
    • 각 환자의 측정 지표
  • y (label)
    • 0 / 1 이진값
    • 분류 대상

 지도학습의 기본 구조 : X → y

 

 

학습/테스트 데이터 분리

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=11, stratify=y
)

 

 

  • test_size=0.3
    • 전체 데이터의 30%를 평가용으로 분리
  • random_state=11
    • 결과 재현성 확보
  • stratify=y
    • 클래스 비율(0/1)을 train/test에 동일하게 유지

 

모델생성 

model = LogisticRegression()

 

 

  • 로지스틱 회귀 분류기 객체 생성
  • 아직 학습은 안 된 상태
  • 내부적으로는:
    • 시그모이드 함수 사용
    • 확률 기반 이진 분류 모델

 

모델 학습 

model.fit(X_train, y_train)

 

 

  • 훈련 데이터로 모델 학습
  • feature(X)와 label(y)의 관계 학습
  • 내부적으로:
    • 로그우도 최대화
    • 반복 최적화 수행

 

예측 수행

pred = model.predict(X_test)

 

 

  • 테스트 데이터에 대해 클래스(0/1) 예측
  • 실제로는:
    1. 확률 계산
    2. threshold(기본 0.5) 적용
    3. 최종 클래스 반환

행렬 계산 

from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
cm = confusion_matrix(y_test, pred)

 

 

  • 첫 번째 인자: 실측치 (ground truth)
  • 두 번째 인자: 예측치

cm의 기본 구조

[[TN  FP]
 [FN  TP]]

 

  • 행(row) → 실제값
  • 열(column) → 예측값

 

'LG DX DATA SCHOOL' 카테고리의 다른 글

01/19 결정트리부터 ...  (1) 2026.01.19
01/16 사이킷런으로 시작하는 머신러닝  (0) 2026.01.16
01/13 파이썬 머신러닝 시작  (0) 2026.01.13
01/12 회귀 분석 마무리  (0) 2026.01.12
01/08 가설 검정  (0) 2026.01.08