Life Logs && *Timeline

  • Iris 데이터셋 분류를 위한 신경망 설계와 전처리 과정의 정석

    머신러닝과 딥러닝을 처음 접하는 이들에게 가장 널리 알려진 분류 문제 중 하나는 바로 ‘Iris 품종 분류’ 문제다. 이 문제는 1936년 통계학자 Ronald A. Fisher가 소개한 고전적인 데이터셋을 기반으로 하며, 간단하지만 모델의 학습 및 평가 전 과정에 필요한 요소를 고루 담고 있어 교육용 예제로 매우 적합하다.

    이번 글에서는 Keras 기반의 신경망 모델을 설계하고, Pandas와 Scikit-learn을 활용한 전처리 과정, 분류 모델 학습의 전체 파이프라인을 설명한다. 특히, 신경망 구조 설계와 표준화(standardization), 범주형 변수 인코딩을 실무적인 관점에서 재구성해본다.


    데이터 불러오기와 구조 지정

    Iris 데이터셋은 sepal_length, sepal_width, petal_length, petal_width의 네 개의 수치형 특성과, 세 가지 품종(setosa, versicolor, virginica)으로 구성되어 있다. 일반적인 CSV 파일로 저장된 데이터를 Pandas로 읽은 뒤, 컬럼 이름을 명시적으로 부여하여 데이터의 구조를 정리한다.

    df = pd.read_csv("./datasets/iris_datasets.data", header=None)
    df.columns = ["sepal_length", "sepal_width", "petal_length", "petal_width", "class"]
    

    클래스 인코딩: 문자열에서 숫자로, 숫자에서 원-핫 벡터로

    딥러닝 모델은 문자열 범주를 직접 다룰 수 없다. 따라서 먼저 라벨 인코딩(label encoding)을 통해 각 클래스명을 정수값으로 변환한 후, 다시 이를 원-핫 인코딩(one-hot encoding)하여 신경망이 다중 클래스 분류에 적합한 형태로 변환해준다.

    label_encode = {"class": {"Iris-setosa": 0, "Iris-versicolor": 1, "Iris-virginica": 2}}
    df.replace(label_encode, inplace=True)
    y_values = to_categorical(df["class"])
    

    원-핫 인코딩의 장점은 클래스 간에 존재하지 않는 서열 정보를 배제하고, 각 클래스를 독립된 차원으로 분리하여 softmax 기반 분류기에 적합한 입력을 만들어 준다는 점이다.


    입력 특성 정규화: 모델 수렴의 핵심

    특성 간의 단위(scale)가 서로 다르면, 경사하강법 기반의 최적화 알고리즘은 특정 특성에 과도하게 의존하거나 수렴 속도가 저하된다. 이를 방지하기 위해 StandardScaler를 통해 평균 0, 표준편차 1로 모든 입력 특성을 정규화한다.

    from sklearn.preprocessing import StandardScaler
    x_values = df[["sepal_length", "sepal_width", "petal_length", "petal_width"]]
    standardise = StandardScaler()
    x_values = standardise.fit_transform(x_values)
    

    정규화는 단순한 수치 조정 이상의 효과를 가져온다. ReLU 활성화 함수를 사용할 때에는 입력의 분포가 중심화되어야 활성 영역이 적절히 유지되며, 이는 학습 초기 안정성에 결정적인 영향을 미친다.


    모델 설계: 단순한 다층 퍼셉트론

    Iris 문제는 단순한 문제지만, 다층 퍼셉트론(MLP, Multi-layer Perceptron)을 구성하여 분류기를 학습할 수 있다. 입력층 다음 두 개의 은닉층(hidden layer)은 각각 6개의 뉴런을 가지며, ReLU 활성화를 통해 비선형성을 부여한다. 출력층은 3개의 노드와 softmax 함수를 사용하여 다중 클래스 확률을 출력한다.

    from keras.models import Sequential
    from keras.layers import Dense
    
    model = Sequential()
    model.add(Dense(6, input_dim=4, activation='relu'))
    model.add(Dense(6, activation='relu'))
    model.add(Dense(3, activation='softmax'))
    
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    

    출력층의 구조와 손실 함수는 반드시 일치해야 한다. 다중 클래스 분류에서 softmax는 각 클래스의 확률 분포를 출력하며, 그에 대응하는 손실 함수는 categorical_crossentropy이다.


    학습: 미니멀리즘 속 효율적인 반복

    모델 학습은 단순하게 이루어진다. 20 epoch 동안 데이터를 반복 학습하며, 각 epoch마다 데이터를 셔플하여 학습 순서의 편향을 방지한다.

    model.fit(x_values, y_values, epochs=20, shuffle=True)
    

    실제 학습 정확도나 손실 함수 그래프를 확인하면 학습의 진행 상태를 보다 명확히 파악할 수 있지만, 이 글에서는 간단한 모델 구조 설명에 집중한다.


    정리하며

    Iris 데이터셋은 문제의 구조가 간단하지만, 신경망 기반 분류기의 전 과정을 압축적으로 학습할 수 있는 훌륭한 실습 환경을 제공한다. 입력 특성의 표준화, 클래스 인코딩의 적절한 처리, 출력층과 손실 함수의 조화는 모든 분류 모델의 기본이 되며, 이를 명확히 이해하고 적용하는 것이 실전 모델 설계의 출발점이다.