이미지와 영상처리

머신러닝 기초 실습 - SVM, 로지스틱 회귀, KNN 분류 모델 비교 (with OpenCV)📅 작성일: 2025년 4월 8일

EasyHanAI 2025. 4. 8. 12:55

 

💡 오늘의 학습 목표

오늘은 머신러닝 기초 모델인 SVM, Logistic Regression, KNN을 실습하면서 모델 예측, 교차검증, 학습/테스트 분리, 혼동 행렬 분석 등을 공부했습니다. 추가로 OpenCV를 이용한 이미지 표시와 콜백 함수 연습도 해보았습니다.


📁 파일명 및 주요 구성

  • 파일명: ml_iris_opencv_callback.py
  • 변경 사항:
    • Iris 데이터셋 분류 실습
    • SVM, LogisticRegression, KNN 비교
    • OpenCV 이미지 표시
    • 콜백 함수 작성 및 호출

📌 전체 코드 + 주석 포함

import cv2 as cv
import sys
import numpy as np
from sklearn import datasets
from sklearn import svm
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split, cross_val_score

# 1. Iris dataset 불러오기 및 출력
d = datasets.load_iris()
print(d.DESCR)  # 데이터셋 설명 출력

# 데이터 전체 출력: 각 꽃의 특성과 정답(품종)
for i in range(len(d.data)):
    print(i + 1, d.data[i], d.target[i])  # 1번부터 150번까지

# 2. SVM 모델 생성 및 예측
s = svm.SVC(gamma=0.1, C=10)  # gamma: 커널 범위, C: 오류 허용 정도
s.fit(d.data, d.target)  # 전체 데이터로 학습

# 새로운 샘플 2개 예측
new_d = [[6.4, 3.2, 6.0, 2.5], [7.1, 3.1, 4.7, 1.35]]
res = s.predict(new_d)
print("새로운 2개 샘플의 부류는", res)

# 3. SVM 교차검증
accuracies = cross_val_score(s, d.data, d.target, cv=5)
print(accuracies)
print("정확률(평균)=%0.3f, 표준편차 =%0.3f" % (accuracies.mean() * 100, accuracies.std()))

# 4. SVM 학습/테스트 분리
x_train, x_test, y_train, y_test = train_test_split(d.data, d.target, train_size=0.6)
s.fit(x_train, y_train)
res = s.predict(x_test)

# 혼동행렬 생성 (3x3)
conf = np.zeros((3, 3))
for i in range(len(res)):
    conf[res[i]][y_test[i]] += 1
print(conf)

# 정확도 계산
no_correct = sum(conf[i][i] for i in range(3))
accuracy = no_correct / len(res)
print("테스트 집합에 대한 정확률은", accuracy * 100, "%입니다.")

# 5. 로지스틱 회귀 예측
logreg = LogisticRegression(max_iter=200)  # 반복 제한 설정
logreg.fit(d.data, d.target)
res = logreg.predict(new_d)
print("새로운 2개 샘플의 부류는", res)

# 6. 로지스틱 회귀 교차검증
accuracies = cross_val_score(logreg, d.data, d.target, cv=5)
print(accuracies)
print("정확률(평균)=%0.3f, 표준편차 =%0.3f" % (accuracies.mean() * 100, accuracies.std()))

# 7. 로지스틱 회귀 학습/테스트 분리
x_train, x_test, y_train, y_test = train_test_split(d.data, d.target, train_size=0.6)
logreg.fit(x_train, y_train)
res = logreg.predict(x_test)
conf = np.zeros((3, 3))
for i in range(len(res)):
    conf[res[i]][y_test[i]] += 1
print(conf)
no_correct = sum(conf[i][i] for i in range(3))
accuracy = no_correct / len(res)
print("테스트 집합에 대한 정확률은", accuracy * 100, "%입니다.")

# 8. KNN 예측
k = 3
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(d.data, d.target)
res = knn.predict(new_d)
print("새로운 2개 샘플의 부류는", res)

# 9. KNN 교차검증
accuracies = cross_val_score(knn, d.data, d.target, cv=5)
print(accuracies)
print("정확률(평균)=%0.3f, 표준편차 =%0.3f" % (accuracies.mean() * 100, accuracies.std()))

# 10. KNN 학습/테스트 분리
x_train, x_test, y_train, y_test = train_test_split(d.data, d.target, train_size=0.6)
knn.fit(x_train, y_train)
res = knn.predict(x_test)
conf = np.zeros((3, 3))
for i in range(len(res)):
    conf[res[i]][y_test[i]] += 1
print(conf)
no_correct = sum(conf[i][i] for i in range(3))
accuracy = no_correct / len(res)
print(no_correct)
print("테스트 집합에 대한 정확률은", accuracy * 100, "%입니다.")

# 11. OpenCV 이미지 표시
img_path = 'plant2_test1.jpg'
img = cv.imread(img_path)  # 이미지 읽기
if img is None:
    print(f"파일 '{img_path}'을 찾을 수 없습니다.")
else:
    cv.imshow('Image Display', img)  # 이미지 창 띄우기
    cv.waitKey()  # 키 입력 기다리기
    cv.destroyAllWindows()  # 창 닫기

# 12. 콜백 함수 예제
def callback_func(func):
    for i in range(5):
        func(i)

def print_hello(num):
    print("hello", num)

def print_python(num):
    print("python", num)

callback_func(print_hello)
callback_func(print_python)

🧠 오늘 배운 핵심 내용 요약

항목 설명

Iris 데이터셋 꽃의 특성 4가지와 품종 3가지로 구성된 분류용 데이터
SVM 결정 경계를 기반으로 분류, 하이퍼파라미터 gamma, C 사용
로지스틱 회귀 범주 예측용 회귀 모델, 반복 횟수 제한 필요
KNN 주변 이웃 기반 단순 분류 모델, n_neighbors로 이웃 수 조절
교차검증 (cross_val_score) 데이터 나눠서 평균 정확도 측정
학습/테스트 분리 성능 측정을 위해 train과 test로 나눠 학습 및 평가
혼동 행렬(confusion matrix) 분류 결과의 정확성과 오류 분석
OpenCV 이미지 읽기, 보여주기, 키 입력 처리
콜백 함수 함수 안에 함수를 전달하여 실행시키는 구조 학습

🙋‍♀️ 느낀 점

  • 각 분류기마다 정확도 차이가 있어서 직접 비교해보는 게 재미있었습니다.
  • conf[예측][정답] 순서가 처음엔 헷갈렸지만, 직접 적어보며 이해가 쉬워졌습니다.
  • cross_val_score로 평균 정확도와 편차를 쉽게 구할 수 있어 실무에도 유용하다고 느꼈습니다.

😅 부족했던 점

  • 하이퍼파라미터 (gamma, C) 값의 의미가 처음에는 잘 안 와닿았고,
    여러 값으로 바꿔보며 감을 잡아야겠다는 생각이 들었습니다.
  • OpenCV에서 이미지가 안 뜨는 이유가 경로 문제라는 걸 뒤늦게 알았습니다.

🔧 개선할 점

  • matplotlib을 이용한 시각화도 함께 적용해보면 훨씬 더 시각적으로 이해하기 쉬울 것 같습니다.
  • 다음에는 StandardScaler 같은 정규화 작업을 추가해서 성능 변화도 비교해보겠습니다.
  • 콜백 함수는 더 다양한 예제로 확장해 보고 싶습니다 (예: 조건부 실행 등).