https://www.kaggle.com/datasets/zalando-research/fashionmnist
Fashion MNIST
An MNIST-like dataset of 70,000 28x28 labeled fashion images
www.kaggle.com
실습 주제 : 의류 이미지 속성 분류 (패션 MNIST / Fashion MNIST)
실습 설명 : Kaggle의 Fashion MNIST 데이터 셋 흑백 옷 이미지 (28x28 픽셀)를 바탕으로 옷의 종류 (티셔츠, 바지, 신발 등)를 분류
코드의 목적과 역할 분석
패션 이미지 데이터를 기반으로 KNN 분류 모델 구축
분류 모델의 성능을 정확도 및 다양한 분류 지표로 평가
모델의 예측 결과를 실제 이미지와 함께 시각적으로 표현
필수 라이브러리
pandas : 데이터 읽기, 처리, 분석
numpy : 수치 연산 처리
matplotlib : 데이터 시각화 (이미지 출력 등)
sklearn.model_selection : 데이터분할 (train_test_split)
sklearn.neighbors : KNN알고리즘 구현
sklearn.metrics : 모델 성능 평가 지표
주요 기능 (분석 파이프 라인)
1. 데이터 셋 로딩
2. x(독립변수), y(종속변수) 분리
3. 전체 데이터 중에서 5000개만 사용
4. 훈련 / 테스트 데이터 분리
5. KNN 모델 생성 / 학습
6. 테스트 데이터 예측
7. 정확도, 정밀도, 재현율, F1-score, support(해당 클래스에 몇 개가 포함되는지)
8. 예측 시각화 (9개만 해보기)
코드 한 줄씩 뜯어먹기
0. 필요한 라이브러리 불러오기
# 필요한 라이브러리 불러오기
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
import matplotlib.pyplot as plt
1. 데이터 셋 로딩
df = pd.read_csv('assets/fashion-mnist_train.csv')
df.info()
===== 출력 =====
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 60000 entries, 0 to 59999
Columns: 785 entries, label to pixel784
dtypes: int64(785)
memory usage: 359.3 MB
=> 데이터 프레임 형태로 되어있음, 데이터는 6만개(이미지가 6만 장), 컬럼은 785개
=> label to pixel 784 : 첫 번째 컬럼 : label(정답), 나머지 컬럼 (pixel 0 ~ pixel 784) (28*28 = 784) 이미지 데이터임을 알 수 있음
2. x(독립변수), y(종속변수) 분리
X = df.drop('label', axis=1)
y = df['label']
# 클래스 번호를 실제 의미로 매핑하기 위한 딕셔너리
label_names = {
0: 'T-shirt/top',
1: 'Trouser',
2: 'Pullover',
3: 'Dress',
4: 'Coat',
5: 'Sandal',
6: 'Shirt',
7: 'Sneaker',
8: 'Bag',
9: 'Ankle boot'
}
3. 전체 데이터 중에서 5000개만 사용
X = X[:5000]
y = y[:5000]
4. 훈련/ 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.2,
random_state=42
)
5. KNN 모델 생성 및 학습
model = KNeighborsClassifier(n_neighbors=3) # 이웃 수 K=3
model.fit(X_train, y_train) # 훈련데이터로 모델 학습
# X_train의 shape?
# print(X_train.shape) # (4000, 784)
# y_train의 shape?
# print(y_train.shape) # (4000,)
주변 3개의 이웃을 보고 데이터를 분류하는 KNN 모델을 생성 및 학습
6. 테스트 데이터 예측
y_pred = model.predict(X_test)
# X_test의 shape?
#print(X_test.shape) # (1000, 784)
# y_pred의 shape?
#print(y_pred.shape) # (1000,)
7. 정확도 및 정밀도, 재현율, f1-score, support 출력
print('정확도:', accuracy_score(y_test, y_pred))
print('\n분류레포트:', \
classification_report(
y_test,
y_pred,
target_names=[label_names[i] for i in sorted(label_names)]
)
)
====== 출력 ======
정확도: 0.816
분류레포트: precision recall f1-score support
T-shirt/top 0.70 0.87 0.78 102
Trouser 1.00 0.96 0.98 103
Pullover 0.63 0.72 0.67 86
Dress 0.88 0.89 0.88 106
Coat 0.73 0.70 0.71 100
Sandal 0.97 0.69 0.80 102
Shirt 0.65 0.56 0.60 108
Sneaker 0.84 0.93 0.88 104
Bag 0.99 0.86 0.92 95
Ankle boot 0.85 0.99 0.92 94
accuracy 0.82 1000
macro avg 0.82 0.82 0.81 1000
weighted avg 0.82 0.82 0.82 1000
8. 예측 시각화
plt.figure(figsize=(10, 5))
plt.rc('font', family='Malgun Gothic') # 그래프내의 한글 처리
for i in range(9):
plt.subplot(3, 3, i+1)
image = X_test.iloc[i].values.reshape(28, 28) # 1차원 → 28x28 이미지
plt.imshow(image, cmap='gray') # 이미지 출력
plt.title(f"실제: {label_names[y_test.iloc[i]]}\n예측: {label_names[y_pred[i]]}")
plt.axis('off')
plt.suptitle('KNN 분류 결과 예시 (예측 클래스)')
plt.tight_layout()
plt.show()
분석적 인사이트
전체 정확도가 약 81.6%로 비교적 양호한 성능을 보임. 그러나 각 의류 클래스별 성능에는 명확한 차이가 있음
높은 성능을 보인 클래스 :
Trouser, Bag, Ankle boot, Sneaker는 정밀도 및 재현율 모두 우수함. (형태적 특징이 명확하고 구분이 쉬워 높은 분류 성능이 나타난 것으로 판단됨.
상대적으로 낮은 성능을 보인 클래스 :
Pullover, Shirt 등 옷 형태가 서류 유사한 클래스에서 성능이 떨어짐 (형태적 유사성으로 인해 KNN이 분류하기 어려운 것으로 판단)
특히 Shirt의 정밀도와 재현율이 낮은 점은 다른 옷 (coat, pullover)과 혼동이 많다는 뜻으로, 형태적 유사한 품목 간에 명확한 경계가 부족함을 나타냄
배운 점
(1) 클래스 별 성능 분석
실무에서는 정확도 뿐만 아니라 정밀도, 재현율, f1-score를 종합하여 분석해야함.
정밀도가 낮은 클래스는 다른 클래스로 잘못 분류될 가능성이 높음 -> 실제 서비스에서 고객이 제품을 찾을 때 다른 품목을 추천하게 되면 사용자 경험에 부정적 영향 O
재현율이 낮은 클래스는 실제 품목임에도 불구하고 해당 클래스로 인식하지 못하는 비율이 높은 것. 재현율을 높이기 위한 특성공학이 필요함
(2) 이미지 분류시 CNN 활용 해보기
실제 이미지 데이터는 픽셀 간 공간적 정보가 매우 중요함
KNN은 공간적 구조를 고려하지 않고 픽셀 간 단순 거리로만 계산하므로 CNN 같은 심층 신경망을 활용하는 것이 더욱 효과적
+) CNN은 공간적 특성을 자동으로 학습하며, 일반적으로 이미지 분류에서 월등히 높은 성능
'Data Analysis' 카테고리의 다른 글
회귀모델 평가 지표, 회귀 vs 분류 비교, 알고리즘 선택 가이드 (0) | 2025.06.17 |
---|---|
Regression 회귀 알고리즘, 선형회귀, 릿지회귀, 라쏘회귀, 다항회귀, SVR, 랜덤포레스트 (1) | 2025.06.17 |
KNN 분류 예제 (Iris 데이터 셋) (0) | 2025.06.08 |
Classification (분류 알고리즘) 개념 (5) | 2025.06.08 |
Linear Regression (선형 회귀) (1) | 2025.06.08 |