K-NN (K-Nearest Neighbors)

murphybread·2023년 8월 16일

ML

목록 보기
1/1

코드 참고
https://github.com/murphybread/Kaggle

계층구조 선정기준 (toggle, velog에서 미구현 ) 라이브러리: 특정 기능을 제공하거나 특정 작업을 수행하는 데 사용되는 코드의 모음
패키지: 모듈을 묶어 조직화한 물리적인 디렉토리 구조
모듈: 하나의 파일로 구성된 코드의 집합으로, 함수, 변수, 클래스 등을 포함
클래스: 객체 지향 프로그래밍의 기본 단위로, 특정 객체의 속성과 동작을 정의
from matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassfier
  • 라이브러리: matplotlib
    • 패키지: matplotlib
      • 모듈: pyplot (별칭: plt)
  • 라이브러리: sklearn
    • 패키지: sklearn
      • 모듈: neighbors
        • 클래스: KNeighborsClassifier

1. K-NN

2. Code


K-NN

K-Nearest Neighbors (K-NN)는 지도 학습 알고리즘이며, 분류와 회귀 두 가지 유형의 문제에 사용할 수 있습니다. 이 알고리즘은 특정 데이터 포인트 주변의 k개의 가장 가까운 이웃 데이터를 참조하여 예측을 수행합니다. 간단한 예로, 새로운 테스트 데이터가 주어졌을 때 K-NN은 해당 데이터의 근처에 있는 k개의 트레이닝 데이터를 찾아 그 중 다수결로 판단되는 클래스 또는 값을 예측 결과로 반환합니다.
이 알고리즘을 사용할 때는 다음과 같은 사항들을 고려해야할 필요가 있습니다.

차원의 저주: K-NN 알고리즘이 고차원 데이터에서 성능이 저하될 수 있는 이유는, 차원이 늘어남에 따라 각 데이터 포인트 간의 거리가 멀어지기 때문입니다. 이로 인해 가장 가까운 이웃들조차도 상대적으로 먼 거리에 있게 되어 판별이 어려워집니다.
ex) 꽃의 색깔을 5차원(예: 적색, 녹색, 파랑, 밝기, 채도)으로 표현한다면, 각 차원은 다른 색상 특성을 나타냅니다. 이로 인해 각 꽃의 색깔이 서로 다른 영역에 위치할 수 있으며, 새로운 꽃 샘플의 색깔을 분류하거나 예측하는 것이 더 복잡하고 어려워질 수 있습니다.

메모리 및 계산 복잡성 고려: K-NN 알고리즘은 게으른 학습 방식을 사용하므로 전체 훈련 데이터셋을 메모리에 저장해야 합니다. 따라서 큰 데이터셋의 경우 메모리 요구량이 상당히 높을 수 있습니다. 또한, 새로운 샘플을 분류하거나 예측할 때마다 훈련 데이터셋의 모든 샘플과의 거리를 계산해야 하므로, 데이터가 많아질수록 계산 시간이 길어질 수 있습니다. 이러한 문제를 해결하기 위해 효율적인 거리 계산 알고리즘의 사용, 적절한 데이터 샘플링, 또는 차원 축소와 같은 기법을 고려해야 할 수 있습니다.

K 값 선택: K 값의 선택이 K-NN 알고리즘의 성능에 영향을 미칩니다. K 값이 너무 작으면 노이즈에 민감해지고, 너무 크면 분류 경계가 불분명해질 수 있으므로, 적절한 K 값을 선택해야 합니다. 또한 일반적으로 K값은 클래스 구분이 힘든 동점 상황이 생길 수 있어 홀수로 설정합니다
ex) K값을 통해 비교했는데 절반은 빨간색, 절반은 노란색으로 나온 경우 판단에 어려움이 생김

Code

matplotlib은 Python에서 그래프를 그리기 위한 라이브러리로, 다양한 시각화를 표현할 수 있습니다. 또한 머신러닝 라이브러리인 sklearn을 통해 K-NN에 대한 클래스를 가져와 쉽게 구현할 수 있습니다.

사용 함수

plt

  • plt.scatter()
  • plt.xlabel()
  • ply.ylabel()
  • ply.show()

KNeighborsClassifier (default k값은 5입니다)

  • KNeighborsClassifier.fit()
  • KNeighborsClassifier.score()
  • KNeighborsClassifier.predcit()
#데이터를 가져오는 부분
bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]

# matplotlib에서 pyplot모듈을 가져옵니다
import matplotlib.pyplot as plt

smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

# 도미와 빙어를 산점도 형태의 그래프로 표현합니다
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel("length")
plt.ylabel("weight")
plt.show()


length = bream_length + smelt_length
weight = bream_weight + smelt_weight

# scikit-learn을 사용하기 위해 2차원 리스트 형태로 데이터를 가공합니다
fish_data = [[l,w] for l,w in zip(length, weight)]

# 정답 데이터셋을 준비합니다. 일반적으로 찾고자 하는 대상을 1로 표현합니다
fish_target = [1] *35 + [0] * 14
print(fish_target)

# K-NN을 사용하기 위한 패키지를 가져옵니다
from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier()

# fit함수는 훈련하는데 사용 되는 메서드입니다. 주어진 데이터 fish_data와 정답데이터 fish_target을 통해 훈련을 진행합니다
kn.fit(fish_data, fish_target)

# 모델을 평가하는 메서드로 score를 통해 0~1값을 반환합니다. 
# 정화도 = 정확하게 분류된 샘플의 수 / 전체 샘플 수
kn.score(fish_data, fish_target)

# 모델 테스트 데이터. 예상 출력값은 빙어인경우 0, 도미인 경우 1 반환
kn.predict([[30,600]])

# kn에 가지고 있는 데이터 속성 확인
print(kn._fit_X)
print(kn._y)

# K값을 기본값 5에서 49로 변경하였을 때
kn49 =KNeighborsClassifier(n_neighbors=49)
kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)
# print(35/49)

kn = KNeighborsClassifier()
kn.fit(fish_data, fish_target)


# k값의 변화를 통한 정확도 테스트
for n in range(5, 50):
    # 최근접 이웃 개수 설정
    kn.n_neighbors = n
    # 점수 계산
    score = kn.score(fish_data, fish_target)
    # 100% 정확도에 미치지 못하는 이웃 개수 출력
    print(n, score)
#mermaid
classDiagram
    Library -- Package: Contains
    Package -- Module: Contains
    Module -- Class: Contains
    class Library {
        +Provide functionalities
    }
    class Package {
        +Organize modules
    }
    class Module {
        +Contain functions, variables, classes
    }
    class Class {
        +Define attributes and behaviors
    }
profile
어제를 후회하지 않고, 오늘을 살며, 내일을 걱정하지 않는 삶이 되도록 노력중

0개의 댓글