2 분 소요

첫 번째 머신러닝 만들어 보기 - 붓꽃 품종 예측하기

사이킷런을 이용한 붓꽃(Iris) 데이터 분류

  • 사이킷런을 통해 첫 번째로 만들어볼 머신러닝 모델은 붓꽃 데이터 세트로 붓꽃의 품종을 분류(Classification)하는 것이다.
    붓꽃 데이터 세트는 꽃잎의 길이와 너비, 꽃받침의 길이와 너비 피처(Feature)를 기반으로 꽃의 품종을 예측하기 위한 것이다.
    • 붓꽃 데이터 피처
      • Sepal length
      • Sepal width
      • Petal length
      • Petal width
    • 붓꽃 데이터 품종(레이블)
      • Setosa
      • Vesicolor
      • Virginica

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

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

사이킷런을 이용하여 붓꽃(iris) 데이터 품종 예측하기

# 사이킷런 버전 확인
import sklearn
print(sklearn.__version__)
1.0.2

붓꽃 예측을 위한 사이킷런 필요 모듈 로딩

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

-> 결정트리 분류 모델 사용

데이터 세트를 로딩

import pandas as pd

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

# iris.data는 Iris 데이터 세트에서 피처(feature)만으로 된 데이터를 numpy로 가지고 있습니다. 
iris_data = iris.data

# iris.target은 붓꽃 데이터 세트에서 레이블(결정 값) 데이터를 numpy로 가지고 있습니다. 
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)
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']
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) label
0 5.1 3.5 1.4 0.2 0
1 4.9 3.0 1.4 0.2 0
2 4.7 3.2 1.3 0.2 0

-> label: 타겟값

학습 데이터와 테스트 데이터 세트로 분리

X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label, 
                                                    test_size=0.2, random_state=11)

-> X_train: 학습용 피처 데이터, X_test: 테스트용 피처 데이터, y_train: 학습용 타겟 데이터, y_test: 테스트용 타겟 데이터,
iris-_data: 피처 데이터, iris_label: 타겟 데이터, test_size=0.2: 전체 데이터의 20%를 테스트 데이터로 사용,
random_state=11: 실행할 때마다 동일한 결과를 얻기 위해 random seed값 고정

학습 데이터 세트로 학습(Train)수행

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

# 학습 수행 
dt_clf.fit(X_train, y_train)
DecisionTreeClassifier(random_state=11)

테스트 데이터 세트로 예측(Predict) 수행

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

-> 예측을 수행할 때는 타겟값을 넣으면 안 됨

예측 정확도 평가

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

-> y_test: 실제값, pred: 예측값