K 최근 방법(K-Nearest Neighbor) 분류 기초

K근방법 (K-Nearest Neighbor) 개요



k 근방법(이하 k-NN)은 가장 단순한 분류 알고리즘이며, 예측하고자 하는 데이터와 거리가 가까운 k개의 훈련 데이터의 정답 라벨로부터 예측값을 결정하는 알고리즘이다.

<이점>
- 모델의 과도한 조정 없이 어느 정도의 정밀도가 나온다
- 알고리즘의 이해가 용이

<단점>
- 데이터 전처리 필수
- 특징 량 (수백 이상)이 많은 데이터 세트에서는 잘 작동하지 않습니다.
- 희소한 데이터 세트에서는 정밀도가 나오지 않음
- 처리 속도가 느림

상기 단점으로부터 실무상 별로 사용되는 것은 없다.

K-NN의 다음 2가지 중 분류(Classification)에 대해 본 기사에서는 정리한다.
  • Nearest Neighbor Classification (분류)
  • Nearest Neighbor Regression (회귀)

  • 분류: Nearest Neighbor Classification



    예측을위한 Hyper Parameter는 다음과 같습니다.
    참고 => sklearn


    Parameters
    상세


    n_neighbors
    알고리즘 결정에 사용되는 이웃 점 수 (default = 5)

    weights
    예측 판단에 사용되는 가중치 설정 (default="uniform")"uniform": 균일한 가중치 "distance": 거리에 따른 가중치

    algorithm
    예측을 위한 알고리즘

    leaf_size
    KD Tree, Ball Tree 알고리즘을 사용할 때 리프 크기

    metric
    거리 측정 방법 (default="minkowski)

    p
    Minkowski metric의 Power Parameter

    n_jobs
    사용할 CPU 수 설정 (default=1)


    Cancer Dataset의 예측 분류



    실제로 sklearn의 cancer dataset에서 분류 예측을 실시한다.

    먼저 필요한 라이브러리를 읽습니다.
    classfication_report는 예측값을 평가하는 데 사용됩니다.
    #必要なライブラリの読み込み
    %matplotlib inline
    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import classification_report
    
    #sklean cancer dataの読み込み
    from sklearn.datasets import load_breast_cancer
    

    Cancer DataSet에 대해 자세히 알아보십시오.
    sklearn cancer dataset에는 설명 변수(특징량)가 30, 569인 데이터 포인트가 있다.
    목적 변수 (라벨) 중 "0"이 악성 종양 (malignant), "1"이 양성 종양 (benign)을 나타낸다.
    dataset = load_breast_cancer()
    
    # 特徴量 (説明変数)
    X = pd.DataFrame(dataset.data,
                     columns=dataset.feature_names)
    #ラベル(目的変数)
    y = pd.Series(dataset.target, name='y')
    
    # データ詳細確認
    print('X shape: (%i,%i)' %X.shape)
    print(y.value_counts())
    display(X.join(y).head())
    



    실제로 훈련 데이터/테스트 데이터로 분할한 후 예측 정밀도를 확인한다.
    하이퍼파라미터 중 근방 오브젝트수를 변수(1~10)로 하고, 예측 정밀도의 변화를 플롯한다.
    
    from sklearn.neighbors import KNeighborsClassifier
    
    #データセットをtest sampleを割合20%でホールドアウトする。
    X_train, X_test, y_train, y_test = train_test_split(X,y, random_state=0, test_size=0.2)
    
    #近傍オブジェクト数とその予測スコアを格納するリストを準備
    List_n_neighbors = []
    List_train_score = []
    List_test_score = []
    
    #近傍オブジェクト数を1-10で予測値を比較。訓練データに対してfitする。
    for n_neighbors in range(1,11):
        clf = KNeighborsClassifier(n_neighbors = n_neighbors).fit(X_train,y_train)
    
    #訓練スコアと予測スコアを算出してリストに格納
        List_n_neighbors.append(n_neighbors)
        List_train_score.append(clf.score(X_train,y_train))
        List_test_score.append(clf.score(X_test,y_test))
    
    #近傍オブジェクト数に対して訓練スコア、テストスコアをプロットする
    fig = plt.figure(figsize = (10,6))
    plt.plot(List_n_neighbors, List_train_score, label = "training accuracy")
    plt.plot(List_n_neighbors, List_test_score, label = "test accuracy")
    plt.ylabel("Accuracy")
    plt.xlabel("n_neighbors")
    plt.xticks(np.linspace(1,11,11))
    plt.legend()
    



    요약



    Cancer Dataset을 이용한 예측에 있어서는 근방 오브젝트수(k)가 k=6당이 최상의 성능인 것을 알 수 있다. 다만 K=2의 경우에서도 88% 정도의 정밀도가 담보되어 있어 특징량 30 정도의 Cancer Dataset에 관해서는 Nearest Neighbor Classification에 의한 분류는 충분히 기능하고 있다고 할 수 있다.

    이하 classification_report에 의한 결과를 확인해도 재현률(recall), 적합률(precision) 모두 큰 편향 없이 정밀도를 유지하고 있는 것을 확인할 수 있다.

    다만 실제로 실무상, 암의 진단에 사용할 수 있을까 하면 이하classification_report에 의한 결과를 확인하면 malignant 재현율(recall)의 정밀도로부터 악성 47건 중 3건 정도는 악성 종양(malignant)을 양성(benign)이라고 판단해 버리는 점에서 충분한 정밀도가 아니라고 생각된다.
    
    clf = KNeighborsClassifier(n_neighbors = 6).fit(X_train,y_train)
    predict_result = clf.predict(X_test)
    print(classification_report(y_test,predict_result, target_names=["malignant","benign" ]))
    

    좋은 웹페이지 즐겨찾기