💡 오늘의 학습 목표
오늘은 머신러닝 기초 모델인 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 같은 정규화 작업을 추가해서 성능 변화도 비교해보겠습니다.
- 콜백 함수는 더 다양한 예제로 확장해 보고 싶습니다 (예: 조건부 실행 등).
'이미지와 영상처리' 카테고리의 다른 글
| 📚 OpenCV 실습: 이미지 자르기, 사각형 표시, 다양한 확대 방법 비교 (2025-04-28) (0) | 2025.04.29 |
|---|---|
| 🎨 마우스로 영상 위에 그림 그리기 – OpenCV 마우스 이벤트 실습 정리 (2-6 ~ 2-9)📅 작성일: 2025년 4월 20일 (0) | 2025.04.20 |
| 🎓 FastText 활용 영화 리뷰 감성 분석 (2024-04-16) (0) | 2025.04.16 |
| 📅 2025년 4월 7일 - 머신러닝 모델 비교와 OpenCV 이미지 처리 실습 (0) | 2025.04.07 |