[머신러닝] 지도학습의 분류 알고리즘 : K-최근접 이웃(KNN - K-Nearest Neighbors)

2020. 7. 1. 01:27Big Data/Machine Learing

반응형
K-Nearest Neighbors

KNN(K-Nearest Neighbors)

  • 중요 : 이웃의 갯수에 의해 판단된다

    1) 특징

        - 이해하기 쉽고 직관적인 모델
        - 더 복잡한 알고리즘을 적응하기 전에 시도해 볼 수 있는 모델
        - 훈련셋이 너무 크면 예측이 느려진다.
    
    

    2) (하이퍼)파라미터

        - n_neighbors : 이웃의 갯수(k갯수)
        - 데이터 사이의 거리를 재는 방법 : L2 norm 사용

import 작업

In [1]:
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

from sklearn.neighbors import KNeighborsClassifier
from sklearn.neighbors import KNeighborsRegressor

import matplotlib
import matplotlib.pyplot as plt
import mglearn
import warnings
import numpy as np

warnings.filterwarnings(action='ignore')

# 그래프에 한글 출력시 폰트 변경 (기본폰트 : sans-serif)
matplotlib.rcParams['font.family'] = 'Malgun Gothic'
# 그래프에서 마이너스(-)폰트 깨짐 방지
matplotlib.rcParams['axes.unicode_minus'] = False

1. KNeighborsClassifier 알고리즘

mglearn 모듈을 이용한 KNN 알고리즘 시각화

In [2]:
# 이웃의 갯수가 5개로 설정된 KNN 알고리즘 시각화
mglearn.plots.plot_knn_classification(n_neighbors=5)

1) 데이터셋 준비

  • sklearn.datasets 에 있는 유방암 데이터셋 활용
In [3]:
cancer = load_breast_cancer()

2) 1번에서 생성된 데이터셋을 훈련데이터와 테스트데이터로 구별

train_test_split(data, data2, test_size, train_size, random_state) 함수 설명

* data : 독립 변수 데이터 배열 또는 pandas 데이터프레임
* data2 : 종속 변수 데이터. data 인수에 종속 변수 데이터가 같이 있으면 생략할 수 있다.
* test_size : 검증용 데이터 개수. 1보다 작은 실수이면 비율을 나타낸다.
* train_size : 학습용 데이터의 개수. 1보다 작은 실수이면 비율을 나타낸다. 
               test_size와 train_size 중 하나만 있어도 된다.
* stratify : 지정한 Data의 비율을 유지한다.
* random_state: 난수 시드
In [4]:
X_train, X_test, y_train, y_test = train_test_split(cancer.data, 
                                                    cancer.target, 
                                                    random_state=66,
                                                    stratify=cancer.target)

3) KNN 알고리즘을 활용하여 이웃 갯수(0~10)에 따른 훈련데이터, 테스트데이터 성능을 시각화

In [5]:
train_acc = []
test_acc=[]

for n in range(1,11):
    clf = KNeighborsClassifier(n_neighbors=n)
    clf.fit(X_train, y_train)
    
    # 훈련데이터 성능확인     
    train_acc.append(clf.score(X_train, y_train))
    # 테스트데이터 성능확인     
    test_acc.append(clf.score(X_test, y_test))
    
plt.plot(range(1,11), train_acc, label="훈련 정확도")
plt.plot(range(1,11), test_acc, label="테스트 정확도")
plt.xlabel("이웃의 갯수")
plt.ylabel("정확도")
plt.legend()
Out[5]:
<matplotlib.legend.Legend at 0x2492e5d1c48>

2. KNeighborsRegressor 알고리즘

mglearn 모듈을 이용한 KNN 알고리즘 시각화

In [6]:
# 이웃의 갯수가 5개로 설정된 KNN 알고리즘 시각화
mglearn.plots.plot_knn_regression(n_neighbors=5)

1) 데이터셋 준비

  • mglearn.datasets에 있는 데이터셋 활용
In [7]:
# 40개 샘플 데이터
X, y = mglearn.datasets.make_wave(n_samples=40)

2) 1번에서 생성된 데이터셋을 훈련데이터와 테스트데이터로 구별

In [8]:
X_train,X_test,y_train,y_test = train_test_split(X,
                                                 y, 
                                                 random_state=0)

3) KNN 알고리즘을 활용하여 이웃 갯수(1,3,9)에 따른 훈련데이터, 테스트데이터 성능을 시각화

In [9]:
fig, axes = plt.subplots(1, 3, figsize=(15, 4))

line = np.linspace(-3, 3, 1000).reshape(-1, 1)

for n_neigh, ax in zip([1, 3, 9], axes):
    reg = KNeighborsRegressor(n_neighbors=n_neigh).fit(X_train, y_train)
    
    ax.plot(line, reg.predict(line))
    # 훈련데이터로 그래프 플롯     
    ax.plot(X_train, y_train, "^", c=mglearn.cm2(0), markersize=8)
    # 테스트데이터로 그래프 플롯     
    ax.plot(X_test, y_test, "v", c=mglearn.cm2(1), markersize=8)
    
    ax.set_title("{0} 이웃의 훈련 스코어:{1:.2f}, 테스트 스코어:{2:.2f}".format(n_neigh, 
                                                         reg.score(X_train, y_train),
                                                         reg.score(X_test, y_test)))
In [ ]:
 
반응형