«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Recent Posts
Today
Total
관리 메뉴

짜리몽땅 매거진

[ML] KNN 알고리즘 본문

Data/Machine Learning

[ML] KNN 알고리즘

쿡국 2024. 6. 22. 11:14

KNN 알고리즘은 대표적인 거리기반 분류 모델로 거리를 기반으로 분류하는 알고리즘이며 따라서 상대적으로 거리가 더 짧은 이웃이 더 가까운 이웃으로 취급된다. 즉, KNN 알고리즘은 어떤 새로운 데이터로부터 거리가 가까운 K개의 다른 데이터의 레이블(속성)을 참고하여 K개의 데이터 중 가장 빈도 수가 높게 나온 데이터의 레이블로 분류하는 알고리즘이다.

KNN 모델 성능의 주요 이슈

1) 데이터 간의 거리는 어떻게 측정하는가 (거리 측정 방법)

2) K 값의 크기는 어떻게 설정할 것인가 (탐색할 이웃의 개수)

1) 데이터 간의 거리는 어떻게 측정하는가

어떤 계산법을 사용하느냐에 따라서 이웃의 선택기준이 달라진다.



2) 적절한 K 값의 크기는 어떻게 설정할 것인가

  • K 값이 너무 작으면, 민감도가 높아서 잘못 예측할 확률이 높아진다. (overfitting)
  • K 값이 너무 크면, 분류나 예측 자체가 둔감해지기 때문에 결과가 좋지 않다. (underfitting)
  • 최적의 K 값은 찾기 어렵기 때문에, 보통 3으로 지정하고 변경해가며 찾는다.

Raisin_Dataset을 활용해 실습을 진행해보자.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler

# 데이터 불러오기
df= pd.read_excel('Raisin_Dataset.xlsx')

#독립변수, 종속변수 나누기
x = df.drop(['Area','Class'],axis='columns')
y = df[['Class']]

# KNN 알고리즘은 거리기반으로 진행하기 때문에 스케일링 표준화 작업이 정말 꼭 필요하다
StandardScaler = StandardScaler()
df_mm = StandardScaler.fit_transform(x)

#스케일링된 값으로 데이터프레임 다시 만들기
x_mm = pd.DataFrame(data= df_mm, columns=x.columns)

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(x_mm,y, train_size=0.7, random_state=111)

# KNN 모델을 생성
#주요 파라미터 : n_neighbors , weights, metrics
cls = KNeighborsClassifier(n_neighbors= 3, weights= 'uniform', metric='minkowski')

# 모델 학습
cls.fit(X_train, y_train)

# 정확도 출력
print(cls.score(X_train, y_train), 'train의 정확도')
print(cls.score(X_test, y_test),'test의 정확도')

 

위의 실습 코드는 3개의 최근접 이웃을 사용하고, 가중치는 균일하며(uniform), 거리 측정 기준으로 Minkowski 거리를 사용하는 KNN 분류기를 설정했다.

 

KNN 알고리즘은 매우 단순하고 직관적인 알고리즘으로 노이즈 영향도 없지만, 고비용 연산 과정이 필요하며 최적의 K값을 찾고 스케일링 작업이 필요하다는 점에서 이슈가 있다.

'Data > Machine Learning' 카테고리의 다른 글

[ML] 평가 지표  (0) 2024.06.23
[ML] Kmeans 알고리즘 + DBSCAN  (0) 2024.06.23
[ML] Feature Selection  (0) 2024.06.22
[ML] 데이터 스케일링  (0) 2024.06.05
[ML] train_test_validation 데이터와 교차검증(CV)  (0) 2024.05.14