프레임워크~~

지도학습일때도 분류형 (머신러닝을 가장 많이 사용하는 .)
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) 예측
- 실제로는:
- 확률 계산
- threshold(기본 0.5) 적용
- 최종 클래스 반환
행렬 계산
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 |