by museonghwang

Scikit-Learn을 이용한 붓꽃 품종 예측

|

사이킷런을 통해 붓꽃 데이터 세트로 붓꽃의 품종을 분류(Classification) 하는 간단한 머신러닝 모델을 만들어 보겠습니다. 붓꽃 데이터 세트는 꽃잎의 길이너비, 꽃받침의 길이너비 피처(Feature)를 기반 으로 꽃의 품종을 예측 하기 위한 것입니다.

image


분류(Classification) 는 대표적인 지도학습(Supervised Learning) 방법의 하나로, 지도학습은 학습을 위한 다양한 피처와 분류 결정값인 레이블(Label) 데이터로 모델을 학습한 뒤, 별도의 테스트 데이터 세트에서 미지의 레이블을 예측합니다. 즉 지도학습은 명확한 정답이 주어진 데이터를 먼저 학습한 뒤 미지의 정답을 예측하는 방식 입니다.


우선 사이킷런에서 사용할 모듈을 임포트합니다.

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split


load_iris() 함수를 이용해 붓꽃 데이터 세트를 로딩한 후, 피처들과 데이터 값이 어떻게 구성돼 있는지 확인하기 위해 DataFrame으로 변환하겠습니다.

import pandas as pd

# 붓꽃 데이터 세트를 로딩
iris = load_iris()

iris_data = iris.data # 피처(feature)
iris_label = iris.target # 레이블(결정 값)
print('iris target값:', iris_label)
print('iris target명:', iris.target_names)

# 붓꽃 데이터 세트를 자세히 보기 위해 DataFrame으로 변환
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
iris_df['label'] = iris.target
iris_df.head(3)
[output]
iris target값: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
iris target명: ['setosa' 'versicolor' 'virginica']

image


학습용 데이터와 테스트용 데이터를 분리하겠습니다. 학습용 데이터와 테스트용 데이터는 반드시 분리해야 합니다. 학습 데이터로 학습된 모델이 얼마나 뛰어난 성능을 가지는지 평가하려면 테스트 데이터 세트가 필요하기 때문 입니다. 이를 위해 사이킷런은 train_test_split() API를 제공합니다.

  • train_test_split()
    • iris_data : 피처(Feature) 데이터 세트
    • iris_label : 레이블(Label) 데이터 세트
    • test_size : 전체 데이터 세트 중 테스트 데이터 세트의 비율
    • random_state : 호출할 때마다 같은 학습/테스트용 데이터 세트를 생성하기 위한 난수 발생 값
X_train, X_test, y_train, y_test = train_test_split(
    iris_data,
    iris_label,
    test_size=0.2,
    random_state=11
)


train_test_split() 은 학습용 피처 데이터 세트를 X_train 으로, 테스트용 피처 데이터 세트를 X_test 로, 학습용 레이블 데이터 세트를 y_train 으로, 테스트용 레이블 데이터 세트를 y_test 로 반환합니다.

이제 데이터를 기반으로 머신러닝 분류 알고리즘의 하나인 의사 결정 트리를 이용해 학습과 예측을 수행해 보겠습니다. 먼저 사이킷런의 의사 결정 트리 클래스인 DecisionTreeClassifier 를 객체로 생성합니다. 생성된 DecisionTreeClassifier 객체의 fit() 메서드에 학습용 피처 데이터 속성과 결정값 데이터 세트를 입력해 호출하면 학습을 수행 합니다.

# DecisionTreeClassifier 객체 생성
dt_clf = DecisionTreeClassifier(random_state=11)

# 학습 수행
dt_clf.fit(X_train, y_train)


학습 데이터를 기반으로 학습이 완료됐습니다. 이렇게 학습된 DecisionTreeClassifier 객체를 이용해 예측을 수행 하겠습니다. 예측은 반드시 학습 데이터가 아닌 다른 데이터를 이용해야 하며, 일반적으로 테스트 데이터 세트를 이용합니다.

DecisionTreeClassifier 객체의 predict() 메서드에 테스트용 피처 데이터 세트를 입력해 호출하면 학습된 모델 기반에서 테스트 데이터 세트에 대한 예측값을 반환하게 됩니다.

# 학습이 완료된 DecisionTreeClassifier 객체에서 테스트 데이터 세트로 예측 수행. 
pred = dt_clf.predict(X_test)


예측 결과를 기반으로 의사 결정 트리 기반의 DecisionTreeClassifier예측 성능을 평가 하여, 예측한 붓꽃 품종과 실제 테스트 데이터 세트의 붓꽃 품종이 얼마나 일치하는지 확인해 보겠습니다. 사이킷런은 정확도 측정을 위해 accuracy_score() 함수를 제공하며, 첫 번째 파라미터로 실제 레이블 데이터 세트, 두 번째 파라미터로 예측 레이블 데이터 세트 를 입력하면 됩니다.

from sklearn.metrics import accuracy_score
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test, pred)))
[output]
예측 정확도: 0.9333


붓꽃 데이터 세트로 분류를 예측한 프로세스

  1. 데이터 세트 분리: 데이터를 학습 데이터와 테스트 데이터로 분리
  2. 모델 학습: 학습 데이터를 기반으로 ML 알고리즘을 적용해 모델을 학습
  3. 예측 수행: 학습된 ML 모델을 이용해 테스트 데이터의 분류(즉, 붓꽃 종류)를 예측
  4. 평가: 이렇게 예측된 결과값과 테스트 데이터의 실제 결과값을 비교해 ML 모델 성능을 평가


image