ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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%**로 성공적인 분류 모델 완성 🎯
Designed by Tistory.