관리 메뉴

JIHYUN JEONG

[1장-소개] 파이썬 라이브러를 활용한 머신러닝 - 붓꽃예제 본문

Data Science/Machine&Deep Learning

[1장-소개] 파이썬 라이브러를 활용한 머신러닝 - 붓꽃예제

StopHyun 2019. 9. 16. 10:35
ch1_Machine_Learning_with_Python

(개정판)파이썬 라이브러리를 활용한 머신러닝

In [0]:
# 첫 번쨰 애플리케이션: 붓꽃의 품종 분류

# 분류 문제
# 클래스: 출력될 수 있는 값(붓꽃의 종류) 
# 레이블(Label): 출력 Y, 품종
In [0]:
# 데이터 적재
from sklearn.datasets import load_iris
iris_dataset = load_iris()
In [3]:
# Bunch 클래스의 객체, iris_dataset
# 키와 값으로 구성

print("iris_dataset의 키:\n", iris_dataset.keys())
iris_dataset의 키:
 dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
In [4]:
# DESCR 키에는 데이터셋에 대한 간략한 설명이 들어 있습니다.

print(iris_dataset['DESCR'][:193]+"\n..")
.. _iris_dataset:

Iris plants dataset
--------------------

**Data Set Characteristics:**

    :Number of Instances: 150 (50 in each of three classes)
    :Number of Attributes: 4 numeric, pre
..
In [5]:
# traget_names의 값은 우리가 예측하려는 붓꽃 품종의 이름을 문자열 배열로 가지고 있습니다.

print('타깃의 이름', iris_dataset['target_names'])
타깃의 이름 ['setosa' 'versicolor' 'virginica']
In [6]:
# feater_names의 값은 각 특성을 설명하는 문자열 리스트 입니다.

print("특성의 이름:\n", iris_dataset['feature_names'])
특성의 이름:
 ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
In [7]:
# 실제 데이터는 target과 data 필드에 들어 있습니다.
# data는 꽃잎의 길이와 폭, 꽃받침의 길이와 폭을 수치고 값을 가지고 있는 NumPy배열

print("data의 타입:", type(iris_dataset['data']))
data의 타입: <class 'numpy.ndarray'>
In [8]:
# data배열의 행은 개개의 꽃이 되며 열은 각 꽃에서 구한 네 개의 측정치 입니다.

print("data의 크기:", iris_dataset['data'].shape)
data의 크기: (150, 4)
In [9]:
# 이 배열은 150개의 붓꽃 데이터를 가지고 있습니다.

iris_dataset['data']
Out[9]:
array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2],
       [4.7, 3.2, 1.3, 0.2],
       [4.6, 3.1, 1.5, 0.2],
       [5. , 3.6, 1.4, 0.2],
       [5.4, 3.9, 1.7, 0.4],
       [4.6, 3.4, 1.4, 0.3],
       [5. , 3.4, 1.5, 0.2],
       [4.4, 2.9, 1.4, 0.2],
       [4.9, 3.1, 1.5, 0.1],
       [5.4, 3.7, 1.5, 0.2],
       [4.8, 3.4, 1.6, 0.2],
       [4.8, 3. , 1.4, 0.1],
       [4.3, 3. , 1.1, 0.1],
       [5.8, 4. , 1.2, 0.2],
       [5.7, 4.4, 1.5, 0.4],
       [5.4, 3.9, 1.3, 0.4],
       [5.1, 3.5, 1.4, 0.3],
       [5.7, 3.8, 1.7, 0.3],
       [5.1, 3.8, 1.5, 0.3],
       [5.4, 3.4, 1.7, 0.2],
       [5.1, 3.7, 1.5, 0.4],
       [4.6, 3.6, 1. , 0.2],
       [5.1, 3.3, 1.7, 0.5],
       [4.8, 3.4, 1.9, 0.2],
       [5. , 3. , 1.6, 0.2],
       [5. , 3.4, 1.6, 0.4],
       [5.2, 3.5, 1.5, 0.2],
       [5.2, 3.4, 1.4, 0.2],
       [4.7, 3.2, 1.6, 0.2],
       [4.8, 3.1, 1.6, 0.2],
       [5.4, 3.4, 1.5, 0.4],
       [5.2, 4.1, 1.5, 0.1],
       [5.5, 4.2, 1.4, 0.2],
       [4.9, 3.1, 1.5, 0.2],
       [5. , 3.2, 1.2, 0.2],
       [5.5, 3.5, 1.3, 0.2],
       [4.9, 3.6, 1.4, 0.1],
       [4.4, 3. , 1.3, 0.2],
       [5.1, 3.4, 1.5, 0.2],
       [5. , 3.5, 1.3, 0.3],
       [4.5, 2.3, 1.3, 0.3],
       [4.4, 3.2, 1.3, 0.2],
       [5. , 3.5, 1.6, 0.6],
       [5.1, 3.8, 1.9, 0.4],
       [4.8, 3. , 1.4, 0.3],
       [5.1, 3.8, 1.6, 0.2],
       [4.6, 3.2, 1.4, 0.2],
       [5.3, 3.7, 1.5, 0.2],
       [5. , 3.3, 1.4, 0.2],
       [7. , 3.2, 4.7, 1.4],
       [6.4, 3.2, 4.5, 1.5],
       [6.9, 3.1, 4.9, 1.5],
       [5.5, 2.3, 4. , 1.3],
       [6.5, 2.8, 4.6, 1.5],
       [5.7, 2.8, 4.5, 1.3],
       [6.3, 3.3, 4.7, 1.6],
       [4.9, 2.4, 3.3, 1. ],
       [6.6, 2.9, 4.6, 1.3],
       [5.2, 2.7, 3.9, 1.4],
       [5. , 2. , 3.5, 1. ],
       [5.9, 3. , 4.2, 1.5],
       [6. , 2.2, 4. , 1. ],
       [6.1, 2.9, 4.7, 1.4],
       [5.6, 2.9, 3.6, 1.3],
       [6.7, 3.1, 4.4, 1.4],
       [5.6, 3. , 4.5, 1.5],
       [5.8, 2.7, 4.1, 1. ],
       [6.2, 2.2, 4.5, 1.5],
       [5.6, 2.5, 3.9, 1.1],
       [5.9, 3.2, 4.8, 1.8],
       [6.1, 2.8, 4. , 1.3],
       [6.3, 2.5, 4.9, 1.5],
       [6.1, 2.8, 4.7, 1.2],
       [6.4, 2.9, 4.3, 1.3],
       [6.6, 3. , 4.4, 1.4],
       [6.8, 2.8, 4.8, 1.4],
       [6.7, 3. , 5. , 1.7],
       [6. , 2.9, 4.5, 1.5],
       [5.7, 2.6, 3.5, 1. ],
       [5.5, 2.4, 3.8, 1.1],
       [5.5, 2.4, 3.7, 1. ],
       [5.8, 2.7, 3.9, 1.2],
       [6. , 2.7, 5.1, 1.6],
       [5.4, 3. , 4.5, 1.5],
       [6. , 3.4, 4.5, 1.6],
       [6.7, 3.1, 4.7, 1.5],
       [6.3, 2.3, 4.4, 1.3],
       [5.6, 3. , 4.1, 1.3],
       [5.5, 2.5, 4. , 1.3],
       [5.5, 2.6, 4.4, 1.2],
       [6.1, 3. , 4.6, 1.4],
       [5.8, 2.6, 4. , 1.2],
       [5. , 2.3, 3.3, 1. ],
       [5.6, 2.7, 4.2, 1.3],
       [5.7, 3. , 4.2, 1.2],
       [5.7, 2.9, 4.2, 1.3],
       [6.2, 2.9, 4.3, 1.3],
       [5.1, 2.5, 3. , 1.1],
       [5.7, 2.8, 4.1, 1.3],
       [6.3, 3.3, 6. , 2.5],
       [5.8, 2.7, 5.1, 1.9],
       [7.1, 3. , 5.9, 2.1],
       [6.3, 2.9, 5.6, 1.8],
       [6.5, 3. , 5.8, 2.2],
       [7.6, 3. , 6.6, 2.1],
       [4.9, 2.5, 4.5, 1.7],
       [7.3, 2.9, 6.3, 1.8],
       [6.7, 2.5, 5.8, 1.8],
       [7.2, 3.6, 6.1, 2.5],
       [6.5, 3.2, 5.1, 2. ],
       [6.4, 2.7, 5.3, 1.9],
       [6.8, 3. , 5.5, 2.1],
       [5.7, 2.5, 5. , 2. ],
       [5.8, 2.8, 5.1, 2.4],
       [6.4, 3.2, 5.3, 2.3],
       [6.5, 3. , 5.5, 1.8],
       [7.7, 3.8, 6.7, 2.2],
       [7.7, 2.6, 6.9, 2.3],
       [6. , 2.2, 5. , 1.5],
       [6.9, 3.2, 5.7, 2.3],
       [5.6, 2.8, 4.9, 2. ],
       [7.7, 2.8, 6.7, 2. ],
       [6.3, 2.7, 4.9, 1.8],
       [6.7, 3.3, 5.7, 2.1],
       [7.2, 3.2, 6. , 1.8],
       [6.2, 2.8, 4.8, 1.8],
       [6.1, 3. , 4.9, 1.8],
       [6.4, 2.8, 5.6, 2.1],
       [7.2, 3. , 5.8, 1.6],
       [7.4, 2.8, 6.1, 1.9],
       [7.9, 3.8, 6.4, 2. ],
       [6.4, 2.8, 5.6, 2.2],
       [6.3, 2.8, 5.1, 1.5],
       [6.1, 2.6, 5.6, 1.4],
       [7.7, 3. , 6.1, 2.3],
       [6.3, 3.4, 5.6, 2.4],
       [6.4, 3.1, 5.5, 1.8],
       [6. , 3. , 4.8, 1.8],
       [6.9, 3.1, 5.4, 2.1],
       [6.7, 3.1, 5.6, 2.4],
       [6.9, 3.1, 5.1, 2.3],
       [5.8, 2.7, 5.1, 1.9],
       [6.8, 3.2, 5.9, 2.3],
       [6.7, 3.3, 5.7, 2.5],
       [6.7, 3. , 5.2, 2.3],
       [6.3, 2.5, 5. , 1.9],
       [6.5, 3. , 5.2, 2. ],
       [6.2, 3.4, 5.4, 2.3],
       [5.9, 3. , 5.1, 1.8]])
In [10]:
# 머신러닝에서 각 아이템은 '샘플', 속성은 '특성' 이라고 부름
# data 배열의 크기는 샘플의 수에 특성의 수를 곱한 값

print("data의 처음 다섯 행:\n", iris_dataset['data'][:5])
data의 처음 다섯 행:
 [[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]
In [0]:
# 다섯 붓꽃의 꽃잎 폭은 모두 0.2cm 이고, 첫 번쨰 꽃이 가장 긴 5.1cm의 꽃받침을 가졌음.
In [12]:
# target 배열도 샘플 붓꽃의 품종을 담은 NumPy배열입니다.

print("target의 타입:", type(iris_dataset['target']))
target의 타입: <class 'numpy.ndarray'>
In [13]:
# target은 각 원소가 붓꽃 하나에 해당하는 1차원 배열

print("target의 크기:", iris_dataset['target'].shape)
target의 크기: (150,)
In [14]:
# 붗꽃의 종류는 0에서 2까지의 정수로 기록

print("타깃:\n", iris_dataset['target'])
타깃:
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
In [0]:
# 숫자의 의미는 iris_dataset[target_names] 배열에서 확인 할 수 있음.

# 0은 setosa
# 1은 versicolor
# 2는 virginica
In [0]:
# 성과 측정: 훈련 데이터와 테스트 데이터

# 레이블된 데이터(150개의 붓꽃 데이터)를 두 그룹으로 나눔.
# 하나는 머신러닝 모델을 만들 떄 사용, 훈련데이터 혹은 훈련 세트
# 나머지는 모델이 얼마나 잘 작동하는지 측정하는 데 사용, 이를 테스트 데이터, 테스트 세트 or 홀드아웃 세트

# 사이킷런은 데이터를 섞어서 나눠주는 train_test_split 함수를 제공
# 이 함수는 전체 행중 75%를 레이블 데이터와 함께 훈련 세트로 뽑음
# 나머지 25%는 레이블 데이터와 함께 테스트 세트

# 훈련/테스트 세트 나누는건 다 다르지만, 전체의 25%를 테스트 세트로 사용하는 것은 일반적으로 좋은 선택
In [0]:
# X: 데이터
# y: 레이블

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
  iris_dataset['data'], iris_dataset['target'], random_state=0)
In [18]:
# train_test_split 함수로 데이터를 나누기 전에 유사 난수 생성기를 사용해
# 데이터셋을 무작위로 섞어야 함.

# 이 함수르 여러 번 실행해도 결과가 똑같이 나오도록 유사 난수 생성기에 넣을 난수
# 초깃값을 random_state에 매개변수로 전달합니다. 이렇게 하면 항상 같은 결과를 출력합니다.

# 난수를 사용할 때는 항상 이렇게 random_state를 고정할 것

# train_test_split 함수의 반환값은 X_train, X_test, y_train, y_test 이며 모두
# NumPy 배열 입니다.

# 전체 데이터셋의 75%를, X_test는 나머지 25%를 담고 있습니다.

print("X_train 크기:", X_train.shape)
print("y_train 크기:", y_train.shape)
X_train 크기: (112, 4)
y_train 크기: (112,)
In [19]:
print("X_test 크기:", X_test.shape)
print("y_test 크기:", y_test.shape)
X_test 크기: (38, 4)
y_test 크기: (38,)
In [0]:
# 가장 먼 저 할 일: 데이터 살펴보기

# 시각화는 데이터를 조사하는 아주 좋은 방법, 산점도가 그중 하나.
In [21]:
# X_train 데이터를 사용해서 데이터프레임을 만듭니다.
# 열의 이름은 iris_dataset.feture_names에 있는 문자열을 사용합니다.

!pip install mglearn

import pandas as pd
import mglearn
iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)

# 데이터 프레임을 사용해 y_train에 따라 색으로 구분된 산점도 행렬을 만듭니다.

pd.plotting.scatter_matrix(iris_dataframe, c=y_train, figsize=(12,12), marker='o',
                           hist_kwds={'bins':20}, s=60, alpha=.8, cmap=mglearn.cm3)
Collecting mglearn
  Downloading https://files.pythonhosted.org/packages/fb/01/8d3630ecc767c9de96a9c46e055f2a3a5f9e14a47d3d0348a36a5005fe67/mglearn-0.1.7.tar.gz (540kB)
     |████████████████████████████████| 542kB 976kB/s 
Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from mglearn) (1.16.5)
Requirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from mglearn) (3.0.3)
Requirement already satisfied: scikit-learn in /usr/local/lib/python3.6/dist-packages (from mglearn) (0.21.3)
Requirement already satisfied: pandas in /usr/local/lib/python3.6/dist-packages (from mglearn) (0.24.2)
Requirement already satisfied: pillow in /usr/local/lib/python3.6/dist-packages (from mglearn) (4.3.0)
Requirement already satisfied: cycler in /usr/local/lib/python3.6/dist-packages (from mglearn) (0.10.0)
Requirement already satisfied: imageio in /usr/local/lib/python3.6/dist-packages (from mglearn) (2.4.1)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->mglearn) (1.1.0)
Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->mglearn) (2.5.3)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->mglearn) (2.4.2)
Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.6/dist-packages (from scikit-learn->mglearn) (0.13.2)
Requirement already satisfied: scipy>=0.17.0 in /usr/local/lib/python3.6/dist-packages (from scikit-learn->mglearn) (1.3.1)
Requirement already satisfied: pytz>=2011k in /usr/local/lib/python3.6/dist-packages (from pandas->mglearn) (2018.9)
Requirement already satisfied: olefile in /usr/local/lib/python3.6/dist-packages (from pillow->mglearn) (0.46)
Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from cycler->mglearn) (1.12.0)
Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from kiwisolver>=1.0.1->matplotlib->mglearn) (41.2.0)
Building wheels for collected packages: mglearn
  Building wheel for mglearn (setup.py) ... done
  Created wheel for mglearn: filename=mglearn-0.1.7-py2.py3-none-any.whl size=582705 sha256=66689aedc9fb2e050d8240b6b4004d196ada8dd353562e1a8a025cc3e51304e0
  Stored in directory: /root/.cache/pip/wheels/74/cf/8d/04f4932d15854a36726c6210763c7127e62de28f5c8ddfcf3b
Successfully built mglearn
Installing collected packages: mglearn
Successfully installed mglearn-0.1.7
/usr/local/lib/python3.6/dist-packages/sklearn/externals/six.py:31: DeprecationWarning: The module is deprecated in version 0.21 and will be removed in version 0.23 since we've dropped support for Python 2.7. Please rely on the official version of six (https://pypi.org/project/six/).
  "(https://pypi.org/project/six/).", DeprecationWarning)
/usr/local/lib/python3.6/dist-packages/sklearn/externals/joblib/__init__.py:15: DeprecationWarning: sklearn.externals.joblib is deprecated in 0.21 and will be removed in 0.23. Please import this functionality directly from joblib, which can be installed with: pip install joblib. If this warning is raised when loading pickled models, you may need to re-serialize those models with scikit-learn 0.21+.
  warnings.warn(msg, category=DeprecationWarning)
Out[21]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f66098ab2b0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f6609875518>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f660989ea90>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f6609851048>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7f66097f65c0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f660981fb38>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f66097cf0f0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f66097766a0>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7f66097766d8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f660974e198>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f66096f5710>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f660971cc88>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7f66096cf240>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f66096767b8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f660969ed30>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f660964d2e8>]],
      dtype=object)
In [0]:
# 그래프를 보면 세 클래스가 꽃잎과 꽃받침의 측정값에 따라 비교적 잘 구분되는 것을 알 수 있음.
# 이것으로 보아 클래스를 잘 구분하도록 머신런닝 모델을 학습시킬 수 있을 것
In [0]:
# 첫 번째 머신러닝 모델: k-최근접 이웃 알고리즘

# k-최근접 이웃 분류기 사용
# 이 모델은 단순히 훈련 데이터를 저장하여 만들어짐. 
# k-최근접 이웃 알고리즘에서 k는 가장 가까운 이웃 '하나'가 아니라 훈련 데이터에서 새로운 데이터 포인트에
# 가장 가까운 'k개'의 이웃을 찾는다는 뜻(예를 들면 가장 가까운 세 개 혹은 다섯 개의 이웃)
# 그런 다음 이 이웃들의 클래스 중 빈도가 가장 높은 클래스를 예측값으로 사용합니다.

# 지금은 하나의 이웃만 사용하겠습니다.
# scikit-learn의 모든 머신러닝 모델은 Estimator라는 파이썬 클래스로 각각 구현 되어 있습니다.
# k-최근접 이웃 분류 알고리즘은 neighbors 모듈 아래 KNeighborsClassifier 클래스에 구현 되어 있습니다.

# 모델을 사용하려면 클래스로부터 객체를 만들어야 합니다.
# 이때 모델에 필요한 매개변수를 넣습니다. KNeighborsClassifier에서 가장 중요한 매개변수는 이웃의 개수 입니다.
# 우리는 1로 지정하겠습니다.

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
In [0]:
# knn 객체는 훈련 데이터로 모델을 만들고 새로운 데이터 포인트에 대해 예측하는 알고리즘을 캡슐화한것
# 또한 알고리즘이 훈련 데이터로부터 추출한 정보를 담고 있음.
# KNeighborsClassifier의 경우는 훈련 데이터 자체를 저장하고 있음.
In [25]:
# 훈련 데이터셋으로부터 모델을 만들려면 knn 객체의 fit 메서를 사용
# 이 메서드는 훈련 데이터인 NumPy 배열 X_train과 훈련 데이터의 레이블을 담고 있는 y_train을 매개변수로 받음

knn.fit(X_train, y_train)
Out[25]:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
                     metric_params=None, n_jobs=None, n_neighbors=1, p=2,
                     weights='uniform')
In [0]:
# fit 메서드는 knn 객체 자체를 반환 합니다.(그리고 knn 객체 자체를 변경 시킵니다)
# 그래서 knn객체가 문자열 행태로 출력됩니다.
In [27]:
# 1.7.5 예측하기

# 이제 이 모델을 사용해서 정확한 레이블을 모르는 새 데이터에 대해 예측을 만들 수 있습니다.
# 꽃받침의 길이가 5cm, 폭이 2.9cm, 꽃임의 길이 1cm, 폭이 0.2cm 인 붓꽃을 보았다고 합시다.
# 이 붓꽃의 품종은 무엇일까요?

import numpy as np

X_new = np.array([[5, 2.9, 1, 0.2]])
print("X_nex.shape:", X_new.shape)
X_nex.shape: (1, 4)
In [28]:
# 붓꽃 하나의 측정값은 2차원 NumPy배열에 행으로 들어갑니다. 
# scikit-learn은 항상 데이터가 2차원 배열일 것으로 예상합니다.

# 예측에는 knn 객체의 predict 메서드를 사용합니다.

prediction = knn.predict(X_new)
print("예측:", prediction)
print("예측한 타깃의 이름:",
      iris_dataset['target_names'][prediction])
예측: [0]
예측한 타깃의 이름: ['setosa']
In [0]:
# 우리가 만든 모델이 새로운 붓꽃을 setosa 품종을 의미하는 클래스 0으로 예측함.
# 그런데 어떻게 이 모델의 결과를 신뢰할 수 있을까요?
# 이 샘플의 정확한 품종을 모른다는 사실이 모델을 구축하는 데 있어서 중요한 의미를 가집니다.
In [30]:
# 1.7.6 모델 평가하기
# 앞서 만든 테스트 세트를 사용할 떄 가 왔음.
# 테스트 데이터 있는 붓꽃의 품종을 예측하고 실제 레이블(품종)과 비교할 수 있습니다.
# 얼마나 많은 붓꽃 품종이 정확히 맞았는지 '정확도'를 계산하여 모델의 성능을 평가합니다.

y_pred = knn.predict(X_test)
print("테스트 세트에 대한 예측값:\n", y_pred)
테스트 세트에 대한 예측값:
 [2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
 2]
In [31]:
print("테스트 세트의 정확도: {:.2f}".format(np.mean(y_pred == y_test)))
테스트 세트의 정확도: 0.97
In [32]:
print(y_pred)
print(y_test)
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
 2]
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
 1]
In [33]:
# 또 knn 객체의 socre 메서드로도 테스트 세트의 정확도를 계산 할 수 있습니다.

print("테스트 세트의 정확도: {:.2f}".format(knn.score(X_test, y_test)))
테스트 세트의 정확도: 0.97
In [0]:
# 이 모델의 테스트 세트에 대한 정확도는 약 0.97 입니다.
# 97%의 품종을 정확히 맞혔다는 뜻.
In [0]:
# 1.8 요약 및 정리

# 품종을 구분해놓은 데이터셋을 사용 -> 지도학습
# 품종이 세 개이므로 세개의 클래스를 분류하는 문제
Comments