더북(TheBook)

3.7.1 학습 성능

잠시 후에 k-NN과 나이브 베이즈 모델을 비교하는 간단한 파이썬 프로그램을 살펴볼 것입니다. 이 장 서두에서 from mlwpy import *로 불렀던 이름들을 사용하는 대신, 이 프로그램은 imports를 사용합니다. 이 코드는 편리한 설정을 불러오지 않고, 독립적인 스크립트나 노트북에서 작성합니다. 코드에서 train_test_split 부분을 새로 작성했고 테스트 크기를 확연히 키운 것이 보이나요? 왜 그랬을까요? 더 적은 데이터로 학습하는 것은 문제를 더욱 어렵게 만듭니다. train_test_splitrandom_state=42를 추가 인자로 입력하면 이 함수의 무작위성을 컨트롤해서 재현 가능한 결과를 얻을 수 있습니다. 이것을 사용하지 않으면 매번 셀을 실행할 때마다 다른 평가 결과를 얻습니다. 보통은 다른 결과를 얻는 것이 필요하지만, 여기에서는 결과를 고정해 놓고 설명을 진행하겠습니다.

 

In [11]:

# 독립적인 코드로 묶어 보았습니다
from sklearn import (datasets, metrics, model_selection as skms, naive_bayes, neighbors)

# random_state를 설정하여 모델의 결과를 재현 가능하게 만듭니다
# 그렇지 않으면 실행할 때마다 다른 결과가 출력됩니다
# 더 자세한 내용은 5장에서 확인하세요
iris = datasets.load_iris()
(iris_train_ftrs, iris_test_ftrs, iris_train_tgt, iris_test_tgt) = skms.train_test_split(iris.data, iris.target, test_size=.90, random_state=42)

models = {'kNN': neighbors.KNeighborsClassifier(n_neighbors=3), 'NB' : naive_bayes.GaussianNB()}

for name, model in models.items():
    fit = model.fit(iris_train_ftrs, iris_train_tgt)
    predictions = fit.predict(iris_test_ftrs)
   
    score = metrics.accuracy_score(iris_test_tgt, predictions)
    print("{:>3s}: {:0.2f}".format(name,score))
kNN: 0.96 
NB: 0.81

 

전체 데이터의 90%를 테스트로 사용하면, k-NN은 어느 정도 잘 동작하지만 나이브 베이즈의 성능은 별로입니다. random_state를 사용하지 않고 이 코드를 계속 실행하면, 모델이 더 많은 테스트 데이터를 학습에 사용하게 됩니다. 꽤 많이 반복적으로 코드를 실행하면 두 모델 모두 97% 이상의 정확도를 얻습니다. 그래서 학습 성능의 관점에서 붓꽃 데이터는 상당히 쉬운 문제입니다. 우리가 가진 측정값과 아주 간단한 분류 모델을 사용해서 서로 다른 종류의 꽃을 구분하는 것은 꽤 쉽습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.