입문자를 위한 머신러닝 분류 튜토리얼 - IRIS 분류

Page content

개요

  • 사이킷런(scikit-learn)은 파이썬 머신러닝 라이브러리이다.
  • 파이썬에서 나오는 최신 알고리즘들도 이제는 사이킷런에 통합하는 형태로 취하고 있다.
  • 구글 코랩은 기본적으로 사이킷런까지 설치가 완료되기에 별도의 설치가 필요없는 장점이 있다.
  • Note: 본 포스트는 머신러닝 자체를 처음 접하는 분들을 위한 것이기 때문에, 어느정도 경험이 있으신 분들은 필자의 다른 포스트를 읽어주시기를 바랍니다.

패키지 불러오기

  • 패키지는 시간에 지남에 따라 계속 업그레이드가 되기 때문에 꼭 버전 체크를 하는 것을 권장한다.
    • 필자가 글을 남겼을 때는 2020년 8월 16일에 작성했음을 기억하자.
import sklearn
print(sklearn.__version__)
0.22.2.post1

머신러닝 워크플로우

  • 가장 간단한 데이터인 iris 데이터의 종 분류를 진행하도록 한다.
  • 사실, 이 예제는 매우 간단하기 때문에, 전체적인 프로세스를 익히는 관점에서 확인하기를 바란다.

(1) 지도학습의 정의

  • 지도학습(Supervised Learning)의 가장 큰 특징 중의 하나는 위와 같이 분류 결정값이 사전에 정의가 되어야 한다.
    • 만약, 사전에 분류가 된 것이 없다면 어떻게 할 수 있을까? 당연한 말이지만, 머신러닝 수행하기 전 데이터 수집이 필수가 된다.
  • 위 꽃을 분류하는 것 같이, 명확한 정답이 주어진 데이터를 먼저 학습 한 뒤, 미지의 정답을 예측하는 것을 지도학습이라 부른다.

(2) Iris(붓꽃)이란

  • IRIS 붓꽃의 종류는 아래와 같이 3가지로 구성되어 있다.

    • Versicolor, Setosa, Virginica
  • 위 이미지에서 보는 것처럼, 종에 따라 잎의 크기가 다른 것을 확인할 수 있다. 이제 예제 데이터를 불러오는 것부터 시작해보자.

(3) 데이터 불러오기

  • 기본적으로 sklearn 패키지내에는 내장 데이터가 있다.
    • sklearn 패키지내의 데이터셋은 조금 다르다 (참고: load_iris¶)
from sklearn.datasets import load_iris # 패키지 불러오기

# Bunch 형태의 데이터셋으로 구성되어 있음
iris = load_iris()

# 독립변수로만 구성된 데이터를 NumPy 형태로 가지고 있음
iris_data = iris.data

# iris.target은 붓꽃 데이터 세트에서 레이블을 NumPy로 가지고 있다. 
iris_label = iris.target
print('iris target값:', iris_label[[0, 50, 100]])
print('iris target명:', iris.target_names)
iris target값: [0 1 2]
iris target명: ['setosa' 'versicolor' 'virginica']
  • 위와 같이 데이터 세트를 확인하였다면 이제 하나의 데이터프레임으로 만들어봅니다.
import pandas as pd


iris_df = pd.DataFrame(data = iris_data, columns = iris.feature_names)
iris_df['label'] = iris.target
print(iris_df.head(3).to_markdown())
|    |   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   |                 1.4 |                0.2 |       0 |
|  2 |                 4.7 |                3.2 |                 1.3 |                0.2 |       0 |
  • 이 때, column명을 모두 바꾼다.
    • sepal_length, sepal_width, petal_length, petal_width, species
  • 또한, 시각화를 위해 species의 0, 1, 2를 [‘setosa’ ‘versicolor’ ‘virginica’] 형태로 바꾼다.
    • 이 때, map() 함수를 사용한다.
temp_data = iris_df.copy()

replace_fct = {0: 'setosa', 1: 'versicolor', 2: "virginica"}
temp_data.columns = ["sepal_length", "sepal_width", "petal_length", "petal_width", "species"] 
temp_data['species'] = temp_data['species'].map(replace_fct)

temp_data.head(3).to_markdown()
'|    |   sepal_length |   sepal_width |   petal_length |   petal_width | species   |\n|---:|---------------:|--------------:|---------------:|--------------:|:----------|\n|  0 |            5.1 |           3.5 |            1.4 |           0.2 | setosa    |\n|  1 |            4.9 |           3   |            1.4 |           0.2 | setosa    |\n|  2 |            4.7 |           3.2 |            1.3 |           0.2 | setosa    |'

(4) 데이터 시각화

  • 데이터 시각화는 매우 중요하다.
  • 시각화를 통해서 데이터의 패턴을 찾을 수 있기 때문이다.
  • 여기에서는 우선 각 수치형 데이터에 관한 산점도를 작성한다.
  • 또한 수치형 산점도를 종별로 그룹화하는 시각화를 작성해본다.
import matplotlib.pyplot as plt

n_bins = 10
fig, axs = plt.subplots(2, 2) # 그래프를 그리기 위해 일종의 레이아웃을 작성한다. 
axs[0, 0].hist(temp_data['sepal_length'], bins = n_bins);
axs[0, 0].set_title('Sepal Length');
axs[0, 1].hist(temp_data['sepal_width'], bins = n_bins);
axs[0, 1].set_title('Sepal Width');
axs[1, 0].hist(temp_data['petal_width'], bins = n_bins);
axs[1, 0].set_title('Pepal Width');
axs[1, 1].hist(temp_data['petal_length'], bins = n_bins);
axs[1, 1].set_title('Pepal Length');

fig.tight_layout(pad=1.0);

png

  • 이번에는 산점도를 작성한다.
import seaborn as sns
sns.pairplot(temp_data, hue="species", height = 2, palette = 'colorblind');

png

  • 위 그래프에서 볼 수 있는 것처럼, 각 수치형 데이터의 크기에 따라 종의 구분이 되는 것을 볼 수 있다.
  • 그러나, 몇몇 부분에서는 완벽하게 구분이 되지 않기 때문에, 다양한 변수의 조합을 통해 구분하는 작업이 필요하다.

(5) 데이터셋 분리

  • 이제 학습용 데이터와 테스트용 데이터를 분리해보도록 한다.
  • 학습 데이터로 모형을 만들었으면 실제 이 모형이 어느정도의 성능을 가지는지 평가할 필요가 있다.
  • 사이킷런은 train_test_split() API를 제공한다.
  • 소스코드를 통해서 한번 확인해보자.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(iris_data, # 독립변수 
                                                    iris_label, # 종속변수 
                                                    test_size = 0.2, 
                                                    random_state = 1)
  • 위 코드에서 test_size는 훈련데이터와 테스트데이터로 나누는 비율이다.
  • 이제 본격적으로 분류기를 만들어본다.

(6) 머신러닝 모형 학습

  • 이제 머신러닝 모형을 생성 합니다.
from sklearn.tree import DecisionTreeClassifier

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

# 학습 수행
dt_clf.fit(X_train, y_train)
DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini',
                       max_depth=None, max_features=None, max_leaf_nodes=None,
                       min_impurity_decrease=0.0, min_impurity_split=None,
                       min_samples_leaf=1, min_samples_split=2,
                       min_weight_fraction_leaf=0.0, presort='deprecated',
                       random_state=11, splitter='best')
  • 이제 의사 결정 트리 기반의 DecisionTreeClassifier 객체는 학습 데이터를 기반으로 학습이 완료가 되었다.

(7) 모형 테스트

  • 이제 모형을 예측해보자
from sklearn.metrics import accuracy_score
pred = dt_clf.predict(X_test)
print('The accuracy of the Decision Tree is: {:.3f}'.format(accuracy_score(pred,y_test)))
The accuracy of the Decision Tree is: 0.967
  • 최종적인 정확도는 0.967인 것으로 확인되었다.

(8) 모형 결과 시각화 (Reporting)

  • 모형 결과에 대해 혼동행렬로 시각화 본다.
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.metrics import plot_confusion_matrix

labels = ['setosa', 'versicolor', 'virginica']
disp = plot_confusion_matrix(dt_clf, 
                             X_test, y_test, 
                             display_labels=labels, 
                             cmap=plt.cm.Reds, 
                             normalize=None)
disp.ax_.set_title('Confusion Matrix');

png

소결

  • 지금까지 배운 것을 종합해보면 다음과 같이 머신러닝 프로세스를 정리할 수 있다.
    • 데이터 수집: 머신러닝 수행에 앞서 필수적인 데이터를 수집한다.
    • 데이터 처리: 시각화를 위해 간단하게 데이터를 정리한다.
    • 데이터 시각화: 주어진 데이터를 가지고 시각화를 작성한다.
    • 데이터 세트 분리: 데이터를 학습 데이터와 테스트 데이터로 분리한다.
    • 모델 학습: 학습 데이터를 기반으로 ML 알고리즘을 활용한다.
    • 예측 수행: 학습된 모델을 테스트 데이터로 확인 후 정확도를 확인한다.
    • 평가: 이렇게 예측된 결과값과 테스트 데이터의 실제 결과값을 비교해 ML 모델 성능을 평가한다.