입문자를 위한 머신러닝 분류 튜토리얼 - 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);
- 이번에는 산점도를 작성한다.
import seaborn as sns
sns.pairplot(temp_data, hue="species", height = 2, palette = 'colorblind');
- 위 그래프에서 볼 수 있는 것처럼, 각 수치형 데이터의 크기에 따라 종의 구분이 되는 것을 볼 수 있다.
- 그러나, 몇몇 부분에서는 완벽하게 구분이 되지 않기 때문에, 다양한 변수의 조합을 통해 구분하는 작업이 필요하다.
(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');
소결
- 지금까지 배운 것을 종합해보면 다음과 같이 머신러닝 프로세스를 정리할 수 있다.
- 데이터 수집: 머신러닝 수행에 앞서 필수적인 데이터를 수집한다.
- 데이터 처리: 시각화를 위해 간단하게 데이터를 정리한다.
- 데이터 시각화: 주어진 데이터를 가지고 시각화를 작성한다.
- 데이터 세트 분리: 데이터를 학습 데이터와 테스트 데이터로 분리한다.
- 모델 학습: 학습 데이터를 기반으로
ML 알고리즘
을 활용한다. - 예측 수행: 학습된 모델을 테스트 데이터로 확인 후 정확도를 확인한다.
- 평가: 이렇게 예측된 결과값과 테스트 데이터의 실제 결과값을 비교해 ML 모델 성능을 평가한다.