나이브 베이즈(Naive Bayes) 실습(1) - 붓꽃 분류

2022. 1. 29. 01:00AI/ML

이 포스트는 허민석님의 유튜브 머신러닝 내용을 정리한 글입니다. 실습 코드는 도서 나의 첫 머신러닝/딥러닝에서 발췌해왔습니다. 실습 코드와 자료는 링크의 Github에서 볼 수 있습니다.

이번 포스트에서는 붓꽃(iris)의 꽃받침 특징을 데이터로 활용하여 붓꽃의 종류를 분류해보겠습니다. 학습 모델은 이전 포스트에서 알아본 나이브 베이즈 알고리즘 중 하나인 가우시안 나이브 베이즈 모델(Gaussian Naive Bayes)을 사용하겠습니다. 가우시안 나이브 베이즈 모델을 사용하는 이유는 붓꽃 데이터 특징들이 이산적이지 않은 연속적인 성질을 가지고 있기 때문이며, 자세한 내용은 이전 포스트를 참고해주시길 바랍니다. 붓꽃 분류는 연속적인 특징을 갖는 데이터 분류의 대표적인 예시로, 이미 사이킷런 내에 데이터가 있습니다. 우리는 사이킷런의 붓꽃(iris) 데이터를 로드하여 시각화한 다음 데이터를 다듬어 가우시안 나이브 베이즈 모델로 학습 후, 평가해보는 작업을 해보겠습니다.

 

우리는 이미 이전에 kNN, SVM, Decision Tree 실습에서 데이터를 불러와 학습 데이터와 테스트 데이터로 분리한 다음, 학습 데이터를 사용해 모델을 학습하고 테스트 데이터로 모델을 테스트 및 평가, 정확도 측정하는 실습을 많이 해봤습니다. 이번 Gaussian Naive Bayes 모델의 실습 코드도 이전과 별반 다르지 않습니다. 코드 또한 주석만으로도 해석할 수 있듯이 어렵지 않습니다. 붓꽃 꽃받침, 꽃잎의 높이와 너비에 대한 데이터는 sklearn에 이미 저장되어 있습니다. 따라서 로드하여 데이터를 부른 다음 상위 5개의 데이터를 확인합니다. 이때, 붓꽃(iris)의 종류(label)는 총 3가지로, setosa, versicolor, virginica가 있습니다. 하지만 원래의 데이터에는 이들이 0, 1, 2로 구분되어있으므로, 숫자로 되어있는 레이블을 실제 명칭에 매핑해줍니다. 현재까지 문제를 정의하고 데이터를 획득했으며 획득한 데이터를 사용하기 좋은 형태로 전처리했습니다. 이제 데이터를 시각화해보겠습니다. 데이터를 시각화하는 작업은 표나 그래프로 나타냈을 때 데이터의 특징 및 필요/불필요한 데이터를 알려주는 역할, 적절한 모델 선택 등 다양한 이점이 있습니다. 이번에는 붓꽃의 세 종류를 다시 데이터 프레임 형태로 만들어 각각 sepal length / width(꽃받침 높이 / 너비), petal length / width(꽃잎 높이 / 너비)의 데이터 분포를 확인해보겠습니다. 세 종류의 네 특징, 총 12개의 그래프가 그려지겠습니다. 잠시, 이전에 붓꽃이 어떻게 생겼는지 종류별로 직접 보고 가는 것도 좋을 것 같습니다. 코랩에서는 새 윈도우창을 띄워 사진을 보여주는 cv2.imshow()는 되지 않기 때문에 코랩에서 바로 출력하는 cv2_imshow()를 사용합니다. 사진 또한 깃허브의 data 디렉토리에 있으므로, 필요하시다면 다운로드하여 사용하시면 됩니다. 이 코드에 대한 설명은 추후 OpenCv()를 다룰 때 glob()와 한 번에 설명하겠습니다.

다시 돌아와 전체 데이터를 레이블 별로 나누어 세 데이터 프레임을 생성했으며, 특징마다 데이터 분포를 보고자 그래프로 그렸습니다.

물론 특징을 자세히 알아보고자 다양한 방법으로 데이터를 확인하기도 하지만, 이번에는 데이터의 분포만 확인하는 이유가 있습니다. 그 이유는 조금 있다 알아볼 것이며 데이터를 시각화하고 데이터의 특징을 알아보는 작업을 EDA(Exploratory Data Analysis, 탐색적 데이터 분석) 과정이라고 합니다. 자세한 EDA 과정은 다음의 "네이버 영화 리뷰 데이터 EDA"에서 볼 수 있습니다.

동일한 방법으로 versicolor와 virginica, 그리고 다른 특징들에 대해서도 그래프를 그려 확인해보겠습니다. plot()의 파라미터들을 간단히 짚고 넘어가겠습니다. 먼저 히스토그램 형식의 그래프를 그립니다(plot(kinds='hist')). 그 위에 데이터의 분포를 보기 위해 kde 형식의 그래프를 그리는데 이때 kde는 kernel density estimator, 커널 밀도 추정으로 쉽게는 히스토그램을 스무딩 하는 것을 말합니다. 실제 위의 그래프를 보면 파란색의 히스토그램 그래프와 궤를 같이하는 주황색 곡선을 볼 수 있는데, 이 선이 바로 kde로 그린 선입니다. 데이터의 분포와 밀집도에 의해 그려지는 것을 볼 수 있습니다. ax는 그래프의 축을, seconary_y는 2차 y축을 표시합니다. 리스트나 튜플 형태에서 한 그래프에 레이블을 둘 이상 표시하고 싶을 때, secondary_y를 True로 설정합니다. 디폴트는 False입니다.

세 종류의 붓꽃과 네 가지 특징을 모두 조합해 그래프를 모두 그려봤습니다. 이번 그래프 시각화에서 필요한 정보를 추출해보겠습니다. 주황색의 kde 형식의 그래프를 보면 12가지의 모든 그래프들이 가우시안 분포를 가깝게 따르고 있음을 알 수 있습니다. 이 점이 중요한데, 우리는 이때까지 모델을 설정한 다음 데이터를 시각화하고 데이터를 다듬었지만, 실제에서는 Raw 데이터를 시각화한 다음, 가우시안 분포를 따르고 있음을 바탕으로 가우시안 나이브 베이즈 분류기를 사용하는 것이 적절함을 추론하는 것이 중요합니다. 이제 전체 데이터를 테스트 데이터와 학습 데이터로 나눈 다음 모델을 학습하고 성능을 테스트해보겠습니다. 이 과정은 이전의 실습 포스트들에서 여러 번 다뤘기 때문에 더 자세히 다루지는 않겠습니다. 그렇다면 바로 다음 포스트로 넘어가 스팸 메일 분류 나이브 베이즈 모델을 보겠습니다. 나이브 베이즈 알고리즘은 문서 및 스팸 메일 분류 등 문서 분류에 굉장히 높은 정확도 및 실제에서도 많이 사용되고 있습니다. 이번 포스트를 읽어주셔 감사합니다.