본문 바로가기
머신러닝 (지도학습)/k최근접 이웃

[파이썬 머신러닝, k최근접 이웃] 4. 모델 학습과 평가

by 만다린망고 2022. 3. 24.
반응형

데이터를 불러와서 훈련데이터와 테스트데이터로 나누는 코드는 아래와 같습니다. 

 

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

#1.데이터 불러오기
md=load_iris() #key:value 형태의 bunch 클래스, 딕셔너리와 비슷함

#2.데이터 분리해서 변수에 넣기
data_train,data_test,target_train,target_test=train_test_split(md['data'],md['target'],random_state=0)

 

오늘은 k 최근접이웃 알고리즘을 사용하여 머신러닝 모델을 만들어봅시다. 

 

함수를 불러오고, 모델을 생성합니다. 

 

from sklearn.neighbors import KNeighborsClassifier

#3.모델 생성
my_model=KNeighborsClassifier(n_neighbors=3,weights='uniform',p=2)

 

아직 머신러닝을 하기 전입니다. '이러이러한 조건으로 모델을 만들 것이다' 라는 의미라고 생각하시면 됩니다. n_neighbors 는 이웃의 개수입니다. 데이터를 분류할 때 몇개의 이웃을 사용하여 분류할지 정해줍니다. 3개로 입력하겠습니다. weight 는 가중치인데 거리 별로 가중치를 같게 둘지 다르게 둘지를 결정합니다. 여기서는 uniform 으로 두겠습니다. p는 거리계산 방식인데 유클리드거리인 2를 입력하였습니다. 

 

자세한 옵션들은 아래 링크를 참고하세요. 

 

https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html

 

sklearn.neighbors.KNeighborsClassifier

Examples using sklearn.neighbors.KNeighborsClassifier: Release Highlights for scikit-learn 0.24 Release Highlights for scikit-learn 0.24, Classifier comparison Classifier comparison, Plot the decis...

scikit-learn.org

 

이제 데이터를 이용하여 모델을 학습시키겠습니다. fit 메소드를 사용합니다. 

 

#4.모델 훈련
my_model.fit(data_train,target_train)

 

학습된 모델로 테스트 데이터의 꽃 종류를 예측해봅시다. predict 메소드를 사용합니다.  

 

#5.테스트 데이터 입력
target_predict=my_model.predict(data_test)

 

결과는 아래와 같습니다. 

 

>>> target_predict
array([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])

 

맞게 분류한 것인지 평가해봅시다. 우리는 정답을 알고 있습니다. target_test와 비교해봅시다. 

 

>>> target_predict==target_test
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True, False])

 

상당히 정확합니다. 맞춘 비율을 계산하면 정량적 평가가 가능합니다. 0과 1로만 이루어진 데이터이므로 단순히 평균을 구하는 것이 비율이 됩니다. 

 

>>> import numpy as np
>>> np.mean(target_predict==target_test)
0.9736842105263158

 

정확도는 약 97%입니다. 전체 코드는 아래와 같습니다. 

 

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd
import matplotlib.pyplot as plt

#1.데이터 불러오기
md=load_iris() #key:value 형태의 bunch 클래스, 딕셔너리와 비슷함

#2.데이터 분리해서 변수에 넣기
data_train,data_test,target_train,target_test=train_test_split(md['data'],md['target'],random_state=0)

from sklearn.neighbors import KNeighborsClassifier

#3.모델 생성
my_model=KNeighborsClassifier(n_neighbors=3,weights='uniform',p=2)

#4.모델 훈련
my_model.fit(data_train,target_train)

#5.테스트 데이터 입력
target_predict=my_model.predict(data_test)

#6.테스트 데이터 평가
import numpy as np
accuracy=round(np.mean(target_predict==target_test),2)
반응형

댓글