일공이의 IT노트

[Machine Learning] 범주 예측: 분류 모델 생성 과정 본문

Data Science/Machine Learning

[Machine Learning] 범주 예측: 분류 모델 생성 과정

일공ILGONG 2020. 10. 21. 16:57

 

 

분류 문제

 

출력하는 타깃 클래스가 두 개뿐인 학습 작업을 이진 분류(binary classification)라고 한다. {예, 아니요}, {빨강, 검정}, {진실, 거짓} 같은 타깃을 가진 문제들은 수학적으로 {-1, +1} 혹은 {0, 1}로 표현된다.

 

세 가지 이상의 타깃 클래스가 있는 문제를 다중 범주(multiclass) 문제라고 한다.

 

 


분류 모델 생성 과정

 

1. 데이터셋 준비

 

sklearn에 내장된 iris(붓꽃) 데이터셋은 대표적인 간단한 분류 데이터셋이다. 20세기 중반 통계학자인 로널드 피셔 경(Sir Ronald Fisher)이 우리가 현재 '분류'라고 하는 내용을 다룬 초기 학술 논문에 등장하여 가끔 피셔의 iris 데이터셋이라고도 한다. 데이터의 각 행은 붓꽃 하나를 꽃받침과 꽃잎의 길이와 너비로 표현한다. 붓꽃 별로 총 네 개의 측정치를 가지고 있으며, 마지막 컬럼은 우리가 예측할 대상인 붓꽃의 종류 세토사(setosa), 버시컬러(versicolor), 버지니카(virginica) 이다.

 

다음은 iris 데이터셋을 불러와서 행 몇 개를 살펴보기 위한 파이썬 코드이다.

import pandas as pd
from sklearn import datasets

# 분꽃(iris) 데이터를 불러옵니다.
iris = datasets.load_iris()

# pandas 데이터프레임에 분꽃 데이터를 넣어 테이블로 시각화합니다.
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df['target'] = iris.target
display(pd.concat([iris_df.head(3), iris_df.tail(3)]))

 

import seaborn as sns

sns.pairplot(iris_df, hue='target', size=1.5)

sns.pairplot 함수를 이용하면 붓꽃 종류별로 다른 색으로 칠한 히스토그램이 좌상단부터 우하단까지 대각선을 따라 그려진다. 대각선 밖에 있는 그래프는 특성 페어의 산포도이다.

 

 

2. 학습과 테스트 데이터 분리

 

머신 러닝의 목표는 주어진 데이터를 학습하여 새로운 사례에 대한 모델 성능을 일반화(generalization)하는 것이다.

 

sklearn의 train_test_split 함수를 이용해서 features와 target이라는 두 가지 컴포넌트를 가지고 있는 데이터셋을 각각 훈련 데이터 뭉치와 테스트 데이터 뭉치로 나눌 수 있다. 보통 데이터를 무작위로 섞은 후 훈련과 시험 데이터로 나누는데, 훈련 데이터셋은 전체의 50%을 넘어가고 시험 데이터셋은 50%보다 적도록 한다.

 

from sklearn import model_selection as skms

# 간단하게 훈련 데이터와 테스트 데이터를 분리합니다.
(iris_train_ftrs, iris_test_ftrs,
 iris_train_tgt, iris_test_tgt) = skms.train_test_split(iris.data,
                                                       iris.target,
                                                       test_size=.25)

# 분리한 훈련 데이터와 테스트 데이터의 특성 형태를 출력합니다.
print("Train features shape:", iris_train_ftrs.shape)
print("Test features shape:", iris_test_ftrs.shape)

 

3. 평가: 정확도 측정

 

시험 데이터에 모델을 적용하고 나서 최종적으로 정답이 전체 몇 퍼센트인지 알고 싶으므로, 얻은 점수를 모두 더한 후에 전체 문제의 숫자로 나누는 형태의 평가를 정확도(accuracy)라고 한다. sklearn의 metrics.accuracy_score로 정확도를 계산할 수 있다.

 

answer_key = np.array([True, True, False, True])
student_answers = np.array([True, True, True, True])

print("sklearn accuracy:",
     metrics.accuracy_score(answer_key,
                           student_answers))


지금까지 분류 모델을 생성하는 과정을 간단히 정리해보았다. K-NN, 나이브 베이즈 등 간단한 분류 모델 구현은 이후 포스팅에서 다루기로 하겠다.

 


Reference

마크 페너, <머신러닝을 다루는 기술 with 파이썬, 사이킷런> (길벗, 2020)