[머신러닝] 지도학습의 분류 알고리즘 : K-최근접 이웃(KNN - K-Nearest Neighbors)
2020. 7. 1. 01:27ㆍBig Data/Machine Learing
반응형
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
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]:
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 [ ]:
반응형
'Big Data > Machine Learing' 카테고리의 다른 글
[머신러닝] 지도학습(Supervised Learing)/비지도 학습(Unsupervised Learing)/강화 학습(Reinforcement Learning) 정의 (0) | 2020.06.30 |
---|