[Python] 파이썬으로 나이브베이즈 구현하기
- 인공지능 및 데이터과학/머신러닝 및 딥러닝
- 2020. 12. 20.
파이썬은 데이터 분석에 매우 강력한 기능을 제공하고 있고, 나이브베이즈와 같은 머신러닝은 sklearn(sk런 혹은 사이킷 런이라고 말함)에서 다양한 라이브러리를 제공한다. 나이브베이즈에 대해서 제대로 모르는 분들이 계시다면, 우선 필자가 작성했던 나이브베이즈 포스팅을 보면 이해가 될 것이다.
쉽고 강력한 머신러닝, 나이브 베이즈 분류 (Naive Bayes Classification)
파이썬으로 구현하는 나이브베이즈
본 포스팅은 sklearn에서 제공하는 샘플코드를 사용하였고, 대신 주석으로 이해를 돕고자 한다. 우선 본인 파이썬에 sklearn 패키지가 없을 경우 당연히 sklearn을 설치해야 한다.
패키지 설치과정
(venv) C:\project\steel\python>pip install sklearn
Collecting sklearn
Downloading sklearn-0.0.tar.gz (1.1 kB)
Collecting scikit-learn
Downloading scikit_learn-0.23.2-cp38-cp38-win_amd64.whl (6.8 MB)
|████████████████████████████████| 6.8 MB 6.4 MB/s
Collecting joblib>=0.11
Downloading joblib-1.0.0-py3-none-any.whl (302 kB)
|████████████████████████████████| 302 kB 6.4 MB/s
Collecting numpy>=1.13.3
Downloading numpy-1.19.4-cp38-cp38-win_amd64.whl (13.0 MB)
|████████████████████████████████| 13.0 MB 6.4 MB/s
Collecting scipy>=0.19.1
Downloading scipy-1.5.4-cp38-cp38-win_amd64.whl (31.4 MB)
|████████████████████████████████| 31.4 MB 6.4 MB/s
Collecting threadpoolctl>=2.0.0
Downloading threadpoolctl-2.1.0-py3-none-any.whl (12 kB)
Using legacy 'setup.py install' for sklearn, since package 'wheel' is not installed.
Installing collected packages: numpy, threadpoolctl, scipy, joblib, scikit-learn, sklearn
Running setup.py install for sklearn ... done
Successfully installed joblib-1.0.0 numpy-1.19.4 scikit-learn-0.23.2 scipy-1.5.4 sklearn-0.0 threadpoolctl-2.1.0
선언 부분
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
첫번째 import는 나이브베이즈를 테스트하기 위해서는 당연히 데이터셋(dataset)이 필요한데 여기서는 아이리스(iris) 데이터셋으로 테스트를 진행하였다. 아이리스는 부채꽃으로 150가지의 데이터가 있고 각각 3가지의 아이리스의 품종에 관련된 특징들이 들어있는 데이터를 가져온다.
두번째 train_test_split은 가져온 아이리스 데이터를 train(학습)과 test(결과 도출)을 위해서 분리를 시켜주는 메소드이다.
세번째 GaussianNB는 나이브베이즈중 가우시안 나이브베이즈라는 것을 사용한다는 것이다. 나이브베이즈는 하나만 있는 것이 아니라 다양한 종류가 존재하는데 가우시안 나이브베이즈는 연속된 숫자형태에 성능이 좋다고 알려져 있다.
데이터셋을 가져오는 부분
X,y = load_iris(return_X_y=True)
아이리스 데이터를 불러 온 후, X y 형태로 리턴을 한다. 이때 X가 대문자인 이유는 단일값이 아니라 x값들의 집합이기 때문에 대문자로 표현하며 y의 값은 결과 즉 아이리스의 품종이 있는 값으로 이는 단일이기 때문에 y(소문자) 형태로 표현하는 것이다.
데이터를 나눈다
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
특징(Feature)값들의 집합과 결과값들의 집합을 각각 X, y 변수에 대입했다면 이 값을 기반으로 학습용과 테스트용으로 나눈다. 이때 test_size=0.5는 테스트 데이터를 50% 사용하겠다는 의미이다. 즉 아이리스 데이터가 150개이기 때문에 75개는 학습 75개는 데이터용으로 사용된다는 것이다.
random_state는 테스트와 학습용을 나눌 때의 랜덤을 어떻게 할 것인지를 설정하며, 알아서 난수로 지정하고 싶으면 None을 입력하면 된다. None으로 할 경우 시스템 시간을 이용해서 랜덤을 형성하기 때문에 랜덤값을 지정하지 않게 된다. 정수 값을 입력하면 0의 값에 해당하는 Seed를 선택하는 것으로 고정된 학습결과를 알게 된다.
가우시안 나이브베이즈 객체 생성
nb = GaussianNB()
가우시안 나이브베이즈를 nb 변수로 생성한다
데이터 학습 후, 예측결과 도출
y_pred = nb.fit(X_train, y_train).predict(X_test)
X_train, y_train 데이터를 이용하여 모델을 학습하며, 결과의 예상값은 X_test를 이용한다. X_test의 예측결과를 y_pred 변수에 담는다. 즉 75개의 예측 결과값들이 y_pred에 담겨져 있다.
틀린 결과 출력
print("Number of mislabeled points out of a total %d proints : %d"
% (X_test.shape[0], (y_test != y_pred).sum()))
y_test와 y_pred값을 비교하여, 틀린 개수를 찾아서 결과값을 출력한다. 만약 4개가 나왔다면 75개중 4개가 틀렸다는 의미이다. 즉 정확도(accuracy)는 0.946666... 약 95%가 된다.
최종결과
Number of mislabeled points out of a total 75 proints : 4
위 결과는 어디까지나 순
포스팅에 사용된 최종코드
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
X,y = load_iris(return_X_y=True) # 아이리스를 불러오고, X(Feature)와 y(결과)의 값을 각각 세팅
# Feature 조합인 X의 값을 Train, test로 나누고, 결과 조합인 y의 값을 Train, test로 나눈다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
# 나이브베이즈는 가우시안 나이브베이즈
nb = GaussianNB()
# train 데이터로 학습을 진행하며, X_test 데이터로 결과를 예측하여 y_pred에 넣는다
y_pred = nb.fit(X_train, y_train).predict(X_test)
print(y_pred)
# 실제 값과 y의 예측값을 비교하여 틀린 개수를 출력
print("Number of mislabeled points out of a total %d proints : %d"
% (X_test.shape[0], (y_test != y_pred).sum()))
연관포스팅
'인공지능 및 데이터과학 > 머신러닝 및 딥러닝' 카테고리의 다른 글
[Java] 직접 구현해본 나이브 베이즈 분류기 #2 (코드포함) (0) | 2020.12.24 |
---|---|
[Java] 직접 구현해본 나이브 베이즈 분류기 #1 (0) | 2020.12.22 |
쉽고 강력한 머신러닝, 나이브 베이즈 분류 (Naive Bayes Classification) (0) | 2020.12.13 |
[딥러닝] 과적합(Over-fitting, 오버피팅) 문제 (0) | 2020.08.05 |
[딥러닝] 척도(Metrics)의 설명 및 종류 (1) | 2020.08.03 |