k-최근접 이웃 (K-Nearest Neighbor)
- k 최근접 이웃 (K-Nearest-Neighbor, KNN)은 이름에서 알수 있듯, 비교 대상이 되는 데이터 포인트 주변에 가장 가까이 존재하는 k개의 데이터와 비교해 가장 가까운 데이터 종류로 판별한다.
- 예를 들어, 과일 데이터를 구분할 때, 데이터 포인트 주변의 3개의 값을 비교한다고 가정하면, 데이터 주변의 반경 (circle)으로 표시하고 원 내부의 데이터와 비교해 분류하는 것이다. 데이터 주변의 가장 가까운 데이터를 판별하게 되며, 가장 많이 존재하는 것을분류하는 것이다.
- k 최근접 이웃은 k의 값에 다라서 분류가 달라진다
- 만일, 타깃이 연속형 숫자라면 kNN은 k개의 데이터의 평균 값으로 에측하는 방법을 사용한다. 에를 들어 타깃 변수가 과일 당도이고, 주변의 3개의 데이터 값이 8,10,12 라면 KNN을 이용한 에측값으 3개의 데이터 평균값이 10이다.
- k 최근접 이웃 알고리즘은 학습과정에서 게으른 학습(lazy learning)방법을 사용한다. 게으른 학습은 트레이닝 데이터 전체를 메모리상에 보관하면서 테스트 데이터가 새로 들어왔을 대 바로 학습하는 것을 의미한다. 게으른 학습은 트레이닝 데이터 전체를 메모리에 보관하므로 추가적인 학습 시간이 없이, 곧바로 학습 결과를 얻을 수 있다는 장점을 가지고 있다. 그러나 예측시 메모리상에 학습용 데이터를 항상 보관하고 있어야 하므로 메모리 용랴보다 데이터가 지나치게 커서 메모리에 보관할 수 없을 경우에는 사용할 수 없다는 단점을 가지고 있다
- 게으른 학습의 반대말은 열정적 학습이다 (eager learning). 이는 우리가 흔히 알고 있는 학습과정으로, 트레이닝 데이터로 일정 기간 학습시킨후 학습시킨 모형을 기반으로 데스트 데이터를 적용하는 방법이다.
# 데이터 불러오기
from sklearn import datasets
raw_iris = datasets.load_iris()
# 피쳐/타겟
X = raw_iris.data
y = raw_iris.target
# 트레이닝/테스트 데이터 분할
from sklearn.model_selection import train_test_split
X_tn, X_te, y_tn, y_te=train_test_split(X,y,random_state=0)
#데이터 표준화
from sklearn.preprocessing import StandardScaler
std_scale = StandardScaler()
std_scale.fit(X_tn)
X_tn_std = std_scale.transform(X_tn)
X_te_std = std_scale.transform(X_te)
# 데이터 학습
from sklearn.neighbors import KNeighborsClassifier
clf_knn = KNeighborsClassifier(n_neighbors=2)
clf_knn.fit(X_tn_std, y_tn)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=2, p=2,
weights='uniform')
- KNeighborsClassifier 함수를 이용해 사용할 모형을 지정, 가장 근접한 데이터 2개(n_neighbors=2)를 이용
# 데이터 예측
knn_pred = clf_knn.predict(X_te_std)
print(knn_pred)
[2 1 0 2 0 2 0 1 1 1 1 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]
# 정확도 평가
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_te, knn_pred)
print(accuracy)
0.9473684210526315
# confusion matrix 확인
from sklearn.metrics import confusion_matrix
conf_matrix = confusion_matrix(y_te, knn_pred)
print(conf_matrix)
[[13 0 0]
[ 0 15 1]
[ 0 1 8]]
# 분류 레포트 확인
from sklearn.metrics import classification_report
class_report = classification_report(y_te, knn_pred)
print(class_report)
precision recall f1-score support
0 1.00 1.00 1.00 13
1 0.94 0.94 0.94 16
2 0.89 0.89 0.89 9
accuracy 0.95 38
macro avg 0.94 0.94 0.94 38
weighted avg 0.95 0.95 0.95 38
'Machine-Learning > Basic' 카테고리의 다른 글
[ML] 군집 평가 (Cluster Evaluation) - 실루엣 분석 (Silhouette Analysis) (0) | 2022.12.08 |
---|---|
[ML] GirdSearchCV (0) | 2022.11.30 |
[ML] SVM(Support Vertor Machine) (0) | 2022.09.26 |
[ML] 활성화 함수 (Activation function) (0) | 2021.09.05 |
[ML] 손실함수(Loss function) (0) | 2021.09.05 |
댓글