-
[3월 2주차-3/12(3)]다중 클래스 분류 - 아이리스 품종 분류Why Not SW CAMP 5기/수업 기록 2025. 3. 12. 16:50
머신러닝에서는 단순한 이진 분류(Binary Classification)뿐만 아니라 세 개 이상의 선택지 중 하나를 고르는 다중 클래스 분류(Multi-class Classification) 문제를 해결해야 하는 경우가 많습니다. 이번 포스트에서는 아이리스(Iris) 데이터셋을 활용하여 다중 클래스 분류 모델을 구현하는 과정을 정리하겠습니다.
1. 아이리스 데이터셋 개요
아이리스 데이터셋은 붓꽃(Iris)의 세 가지 품종을 꽃받침과 꽃잎의 길이/너비를 기준으로 분류하는 유명한 데이터셋입니다.
🔹 데이터 구성
- 150개 샘플 (각 품종별 50개 샘플)
- 4가지 특성 (연속형 변수)
- SepalLengthCm (꽃받침 길이)
- SepalWidthCm (꽃받침 너비)
- PetalLengthCm (꽃잎 길이)
- PetalWidthCm (꽃잎 너비)
- 3가지 품종 (Label)
- Iris-setosa
- Iris-versicolor
- Iris-virginica
🔹 데이터 불러오기 및 확인
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import urllib.request # 데이터 다운로드 및 로드 urllib.request.urlretrieve('https://raw.githubusercontent.com/ukairia777/tensorflow-nlp-tutorial/main/06.%20Machine%20Learning/dataset/Iris.csv', filename='Iris.csv') data = pd.read_csv('Iris.csv', encoding='Latin1') # 데이터 크기 및 일부 샘플 확인 print(len(data)) # 150 print(data.head())
🔹 클래스 분포 확인
print(data['Species'].value_counts())
Iris-setosa 50 Iris-versicolor 50 Iris-virginica 50
각 품종이 동일한 개수(50개)로 균형 있게 분포되어 있음을 확인할 수 있습니다.
2. 데이터 시각화
🔹 특성 간 관계 분석 (Pairplot)
sns.set(style='ticks', color_codes=True) sns.pairplot(data, hue='Species', palette='husl') plt.show()
이렇게 하면 각 특성 간의 산점도 및 분포를 확인할 수 있으며, 특정 특성이 품종 간의 구분에 중요한 역할을 하는지 시각적으로 판단할 수 있습니다.
🔹 품종별 특정 특성의 차이
sns.barplot(x=data['Species'], y=data['SepalWidthCm'], errorbar=('ci',95)) plt.show()
3. 데이터 전처리
🔹 레이블(Label) 숫자로 변환
신경망 모델은 문자열(Label)을 처리할 수 없으므로 숫자로 변환해야 합니다.
data['Species'] = data['Species'].replace(['Iris-virginica', 'Iris-setosa', 'Iris-versicolor'], [0, 1, 2])
🔹 입력 데이터와 출력 데이터 분리
data_X = data[['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']].values data_y = data['Species'].values
🔹 훈련 데이터와 테스트 데이터 분리 (8:2 비율)
from sklearn.model_selection import train_test_split from tensorflow.keras.utils import to_categorical X_train, X_test, y_train, y_test = train_test_split(data_X, data_y, train_size=0.8, random_state=1) # 원-핫 인코딩 수행 y_train = to_categorical(y_train) y_test = to_categorical(y_test)
4. 다중 클래스 분류 모델 구현
🔹 모델 구성
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras import optimizers model = Sequential() model.add(Dense(3, input_dim=4, activation='softmax'))
- 입력 뉴런 수: 4 (꽃받침 및 꽃잎의 길이/너비)
- 출력 뉴런 수: 3 (세 가지 품종을 분류)
- 활성화 함수: softmax (다중 클래스 분류에서 확률값을 출력하는 함수)
🔹 모델 컴파일 및 학습
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) history = model.fit(X_train, y_train, epochs=200, batch_size=1, validation_data=(X_test, y_test))
- 옵티마이저: Adam (경사하강법의 일종)
- 손실 함수: categorical_crossentropy (다중 클래스 분류에 적합)
- 배치 크기: 1 (각 샘플을 개별적으로 업데이트)
- 에포크 수: 200
5. 학습 과정 시각화
🔹 손실 함수 변화 그래프
epochs = range(1, len(history.history['accuracy'])+1) plt.plot(epochs, history.history['loss']) plt.plot(epochs, history.history['val_loss']) plt.title('Model Loss') plt.ylabel('Loss') plt.xlabel('Epoch') plt.legend(['Train', 'Validation'], loc='upper left') plt.show()
📌 그래프 해석
- 훈련 데이터(train)와 검증 데이터(val)의 손실 값이 지속적으로 감소 → 모델이 점점 데이터를 학습하고 있음.
- 100 Epoch 이후에는 손실 값이 수렴(약 0.3 이하) → 모델이 적절하게 최적화됨.
- 훈련 데이터와 검증 데이터의 손실 값 차이가 거의 없음 → 과적합 없이 학습이 잘 진행됨.
🔹 정확도 변화 그래프
plt.plot(epochs, history.history['accuracy']) plt.plot(epochs, history.history['val_accuracy']) plt.title('Model Accuracy') plt.ylabel('Accuracy') plt.xlabel('Epoch') plt.legend(['Train', 'Validation'], loc='upper left') plt.show()
📌 그래프 해석
- 초기 정확도가 낮지만 Epoch이 진행될수록 증가 → 모델이 점점 학습을 잘하고 있음.
- 약 50 Epoch 이후부터 90% 이상의 정확도를 달성 → 빠르게 학습됨.
- 훈련 데이터(train)와 검증 데이터(val) 정확도가 거의 유사함 → 과적합 없이 모델이 일반화됨.
- 100 Epoch 이후 거의 100% 정확도를 유지 → 최적화가 잘 이루어짐.
6. 모델 평가
🔹 최종 테스트 정확도
print('\n 테스트 정확도: %.4f' % (model.evaluate(X_test, y_test)[1]))
출력 예시:
테스트 정확도: 1.0000
즉, 모델이 100% 정확도로 붓꽃 품종을 분류함을 의미합니다.
7. 결론
- 아이리스 데이터셋을 활용하여 다중 클래스 분류 모델을 구현
- 신경망 모델(Sequential API)을 사용해 Softmax 기반 분류 모델을 설계
- 데이터 시각화, 전처리, 학습, 평가까지 진행하여 모델을 최적화
- **테스트 정확도 100%**로 성공적인 분류 모델 완성 🎯
'Why Not SW CAMP 5기 > 수업 기록' 카테고리의 다른 글
[3월 3주차-3/17(1)]인공 신경망 학습과 과적합 방지 방법 정리 (0) 2025.03.17 [3월 2주차-3/13]딥러닝 기초 개념 정리 (0) 2025.03.13 [3월 2주차-3/12(2)]머신러닝 개념 총정리 - 지도학습, 선형 회귀, 로지스틱 회귀 (0) 2025.03.12 [3월 2주차-3/12(1)]코사인 유사도, 유클리드 거리, 자카드 유사도 - 차이점과 활용법 (0) 2025.03.12 [3월 2주차-3/11(4)]🏙️ 블로거들이 추천하는 서울 명소 분석하기! (WordCloud 시각화) (1) 2025.03.11