jyamethyst21 님의 블로그
머신러닝 & 딥러닝 본문
분류 문제 및 모델
1) 분류
- 주어진 데이터를 특정 범주나 클래스로 분류하는 작업
- 지도 학습의 한 유형으로 데이터에 레이블이 존재
- 입력 데이터(다양한 특징), 출력 데이터(데이터가 속한 범주 또는 클래스), 클래스 개수(이진 분류 또는 다중 클래스 분류)
2) 로지스틱 회귀
- 분류 문제를 해결하기 위한 지도 학습 알고리즘
- 데이터를 분석하고 특정 데이터가 특정 클래스에 속할 확률 예측
- 선형 회귀처럼 데이터 학습 후 예측값을 분류 문제에 적합하도록 변환(단, 0에서 1 사이의 확률 값을 보장하지 않음)
- 시그모이드 함수 적용(예측값 z를 시그모이드 함수를 사용해 0과 1 사이의 값으로 변환류 문제 및 모델
1) 분류
- 주어진 데이터를 특정 범주나 클래스로 분류하는 작업
- 지도 학습의 한 유형으로 데이터에 레이블이 존재
- 입력 데이터(다양한 특징), 출력 데이터(데이터가 속한 범주 또는 클래스), 클래스 개수(이진 분류 또는 다중 클래스 분류)
2) 로지스틱 회귀
- 분류 문제를 해결하기 위한 지도 학습 알고리즘
- 데이터를 분석하고 특정 데이터가 특정 클래스에 속할 확률 예측
- 선형 회귀처럼 데이터 학습 후 예측값을 분류 문제에 적합하도록 변환(단, 0에서 1 사이의 확률 값을 보장하지 않음)
- 시그모이드 함수 적용(예측값 z를 시그모이드 함수를 사용해 0과 1 사이의 값으로 변환)
- 시그모이드 함수의 결과가 0.5 이상이면 1 그렇지 않으면 0으로 분류(임계값 변경 가능)
3) 성능 평가 지표
- 분류 모델의 성능을 평가하기 위해 다양한 평가 지표 사용
- 각각의 지표는 모델의 성능을 다양한 관점에서 분석하며 특정 문제에 더 적합한 지표를 선택 해야함
- 혼동 행렬: 모든 평가 지표는 혼동 행렬을 기반으로 계산
- 예시

-> positive : 실제 암환자, negative : 실제 암이 아닌 환자-> 모델은 각 환자에 대해 암 여부를 양성 / 음성으로 예측-> TP : 모델이 암 환자를 암이라고 정확히 예측한 경우-> TN : 모델이 암이 아닌 환자를 암이 아니라고 정확히 예측한 경우-> FP : 모델이 암이 아닌 환자를 암이라고 잘못 예측한 경우-> FN : 모델이 암 환자를 암이 아니라고 잘못 예측한 경우
- 성능 평가 지표 종류(정확도, 정밀도, 재현율, F1-Score)가) 정확도 : 정확도는 모델이 올바르게 예측한 비율 (TP+TN / TP+TN+FP+FN)나) 정밀도 : 모델이 Positive로 예측한 것들 중 실제로 Positive인 비율 (TP / TP + FP)다) 재현율 : 실제 Postive 중에서 모델이 Positive로 올바르게 예측한 비율 (TP / TP + FN)라) F1-Score : 정밀도와 재현율의 조화 평균으로 두 지표의 균형을 평가
정확도: 클래스가 균형 잡혀 있을 때 적합(시험 점수 채점 모델)
정밀도 : False Positive가 중요한 경우(스팸 이메일 분류)
재현율 : False Negative가 중요한 경우(암 진단)
F1-Score : 정밀도와 재현율의 균형이 중요할 때(자연어 처리에서 키워드 추출)
4) KNN 알고리즘
- 지도학습 알고리즘 중 하나
- 핵심 아이디어는 가까운 데이터가 비슷한 특성을 가진다는 가정
- 새로운 데이터가 주어졌을 때, 이를 가장 가까운 데이터 포인트들의 그룹으로 분류하거나 값을 예측하는 데 사용
- 데이터의 패턴이 비선형적이고 복잡할 때 좋은 성능을 보일 수 있음, 하지만 데이터가 많거나 고차원일 경우 성능 저하를 겪을 수 있으므로 이런 경우 차원 축소나 데이터 전처리 필요
- 새로운 데이터 포인트와 훈련 데이터 사이의 거리를 계산하는 가장 흔히 사용하는 거리 방식은 유클리드 거리 공식
- K개의 데이터 포인트를 선택하므로 K의 값에 따라 모델이 성능이 달라짐(매우 중요한 하이퍼파라미터!)
- 분류 : 선택된 K개의 이웃 중 가장 많은 빈도로 나타나는 레이블을 선택(다수결)
- 회귀: 선택된 K개의 이웃의 값을 평균을 내어 예측 값 결정
- 훈련 과정에서 데이터 저장만 하고 새로운 데이터가 들어올 때 실시간으로 계산하기 때문에 Laze Learning(게으른 학습) 알고리즘이라고 함
- 분류와 회귀 문제 모두에 사용할 수 있음
로지스틱 회귀 및 KNN 모델
1) 로지스틱 회귀
# 데이터셋 : sklearn에서 제공해주는 load_breast_cancer(암 관련 데이터셋)
# 모델 : 로지스틱 회귀
# 평가 지표: 정확도, 재현율, 정밀도, f1-score, confusion_matrix
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report
data = load_breast_cancer() # 특성과 타깃으로 구분
X = data.data # 특성 데이터 (세포 관련 데이터)
y = data.target # 타깃 데이터 (음성-0, 양성-1)
# 훈련 / 테스트 데이터 나누기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=45)
model = LogisticRegression(max_iter=10000)
# 모델 학습 및 예측
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
prec = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
print('정확도: ', acc)
print('재현율:', recall)
print('정밀도', prec)
print('f1:', f1)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
# 결과
정확도: 0.956140350877193
재현율: 0.9861111111111112
정밀도 0.9466666666666667
f1: 0.9659863945578231
[[38 4]
[ 1 71]]
precision recall f1-score support
0 0.97 0.90 0.94 42
1 0.95 0.99 0.97 72
accuracy 0.96 114
macro avg 0.96 0.95 0.95 114
weighted avg 0.96 0.96 0.96 114
다른 머신러닝 모델 사용하는 것처럼 코드를 작성하면 된다. 다만 로지스틱 회귀는 max_iter이라는 파라미터가 존재하는데, 이는 최적의 파라미터를 찾기 위해 반복 최적화를 허용하는 최대 횟수를 의미한다.
또한 혼동행렬 출력 부분에서는 순서대로 TN(38), FP(4,) FN(1,) TP(71)를 의미한다.
위 코드의 결과는 다음과 같이 해석된다.
• 지표 값 출력
– 정확도 : 모델이 전체 데이터 중 95%를 정확히 예측.
– 정밀도 : 양성으로 예측한 데이터 중 94%가 실제로 양성.
– 재현율 : 실제 양성 데이터 중 98%를 정확히 양성으로 예측.
– F1-Score : 정밀도와 재현율의 조화 평균(균형).
• 혼동 행렬 출력
– 39: 실제 음성 데이터를 음성으로 예측 (TN).
– 4 : 실제 음성 데이터를 양성으로 잘못 예측 (FP).
– 1 : 실제 양성 데이터를 음성으로 잘못 예측 (FN).
– 70: 실제 양성 데이터를 양성으로 예측 (TP).
• 분류 보고서 출력
– 클래스 0(음성)
정밀도 97%, 재현율 91%, F1-Score 94%.
– 클래스 1(양성) 정밀도 95%, 재현율 99%, F1-Score 97%.
– 매크로 평균 : 각 클래스의 단순 평균.
– 가중 평균 : 클래스 비율에 따라 가중치를 둔 평균.
2) KNN
# 데이터셋: sklearn에서 제공해주는 load_iris 사용
# 모델: KNN
# 성능 지표: 정확도
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
k = 3
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print('정확도: ', acc)
# target_names를 설정하면 리포트에서 인덱스값이 출력되던 것이 각 값에 해당하는 컬럼으로 바뀌어서 가독성 향상됨
print(classification_report(y_test, y_pred, target_names=iris.target_names))
# 결과
정확도: 1.0
precision recall f1-score support
setosa 1.00 1.00 1.00 10
versicolor 1.00 1.00 1.00 9
virginica 1.00 1.00 1.00 11
accuracy 1.00 30
macro avg 1.00 1.00 1.00 30
weighted avg 1.00 1.00 1.00 30
KNN은 K 값이 아주 중요한 하이퍼파라미터이다. 모델이 예측을 할 때 고려하는 가장 가까운 이웃의 수를 의미하며 만약 K=1일 경우 가장 가까운 하나의 이웃만 보고 결정하고 3일 경우 가장 가까운 3개의 이웃을 보고 다수결로 결정한다.
K 값이 작을 때는 모델이 데이터의 세부적인 패턴을 잘 잡아내어 복잡한 데이터 처리 시 적합하지만, 과적합 위험이 증가하고 노이즈에 의해 결과가 영향 받을 가능성이 크다. 그렇기 때문에 일반적으로는 작은 데이터셋일 경우 K를 작게, 큰 데이터셋일 경우 K를 크게 잡는다. 또한 K 값은 보통 홀수로 설정하는 것이 좋고 성능 평가를 위해 테스트 교차 검증을 진행하면서 최적의 K 값을 찾는 것이 중요한 과제이다.
위 코드의 결과는 다음과 같이 해석된다.
• 데이터 요약훈련
– 데이터
: 120개 샘플, 4개의 특징 (꽃받침 길이/너비, 꽃잎 길이/너비).
– 테스트 데이터 : 30개 샘플.
– 레이블
: [0, 1, 2] 각각 setosa, versicolor, virginica를 나타냄.
• KNN 모델 성능
– 정확도 (Accuracy) : 100% (테스트 데이터 30개 모두 정확히 분류).
• 분류 보고서 출력
– Precision (정밀도): 모든 클래스 1.00.
– Recall (재현율): 모든 클래스 1.00.
– F1-Score: 모든 클래스 1.00.
– Support:setosa: 10개, versicolor: 9개, virginica: 11개.
• 새로운 데이터 예측
– 입력 데이터를 setosa로 정확히 예측
# 새로운 데이터의 분류 예측
new_data = [ [5.0, 3.5, 1.1, 0.3] ]
new_prid = knn.predict(new_data)
print(new_prid)
new_prid_class = iris.target_names[new_prid]
print(new_prid_class)
# 임의의 데이터에 대해 분류 예측 진행한 결과 아래와 같이 결과값 출력되는 것을 확인 가능함
[0]
['setosa']
'보안 & IT 지식 🌺' 카테고리의 다른 글
| 머신러닝 & 딥러닝 (1) | 2026.01.16 |
|---|---|
| 머신러닝 & 딥러닝 (0) | 2026.01.14 |
| 머신러닝 & 딥러닝 (0) | 2026.01.12 |
| 머신러닝 & 딥러닝 (0) | 2026.01.09 |
| 머신러닝 & 딥러닝 (0) | 2026.01.08 |
