機械学習基礎のK近隣


K近隣
K-NNアルゴリズムは最も簡単な機械学習アルゴリズムと言えるが,予測点に最も近い点の平均値を用いて予測を行った.k近隣アルゴリズムの入力は、特徴空間の点に対応するインスタンスの特徴ベクトルである.インスタンスのカテゴリとして出力され、複数のクラスを取得できます.k近隣アルゴリズムは、与えられたトレーニングデータセットを仮定し、そのインスタンスカテゴリが決定される.分類では,新しいインスタンスについて,そのk個の近隣の訓練インスタンスのカテゴリに基づいて多数決などにより予測する.従って,k近傍アルゴリズムは明示的な学習過程を有しない.
ジルコニウムk近隣アルゴリズムは,実際に訓練データセットを用いて特徴ベクトル空間を区分し,その分類の「モデル」とする.k値の選択,距離メトリックおよび分類決定規則はk近隣アルゴリズムの3つの基本要素である.
K-NN分類
K-NNカテゴリは、目標点に最も近いKポイントのカテゴリを用いて「投票」を行い、得票数の多いカテゴリは予測カテゴリとしてマークされる.
KNNアルゴリズムの疑似コード:
データセット内の各データポイントについて:
  • 計算対象のデータ点(分類が必要なデータ点)とそのデータ点との距離
  • 距離を並べ替えます:小さいから大きいまで
  • 前K個の最短距離
  • を選択する.
  • このKの中で最も多い分類カテゴリ
  • を選択する.
  • は、目標データ点の予測値
  • としてカテゴリを返す.
    #        
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    import mglearn
    import warnings
    warnings.filterwarnings('ignore')
    mglearn.plots.plot_knn_classification(n_neighbors=3)

      上図では、K-NNアルゴリズムの例を示し、五角星テストセットデータポイントは、それぞれに最も近い3つのトレーニングセットポイントに基づいて投票して分類され、以下、forgeデータを用いてK-NN分類を行う.
    #     
    from sklearn.model_selection import train_test_split
    X,y = mglearn.datasets.make_forge()
    print('      :
    {}'.format(X[:5])) print(' :{}'.format(y))
          :
    [[ 9.96346605  4.59676542]
     [11.0329545  -0.16816717]
     [11.54155807  5.21116083]
     [ 8.69289001  1.54322016]
     [ 8.1062269   4.28695977]]
       :[1 0 1 0 0 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 0 0 0 0 1 0]
    
    from sklearn.neighbors import KNeighborsClassifier
    X_train,X_test,y_train,y_test = train_test_split(X,y,stratify=y,random_state=42)
    KNC = KNeighborsClassifier(n_neighbors=5).fit(X_train,y_train)
    KNC.predict(X_test),y_test
    (array([1, 0, 1, 0, 0, 0, 0]), array([1, 0, 1, 1, 0, 0, 0]))
    print('     :{}'.format(KNC.score(X_train,y_train)))
    print('     :{}'.format(KNC.score(X_test,y_test)))
         :0.9473684210526315
         :0.8571428571428571
    

    ここにいるよtest_split関数は入力したX,yを4つの部分に分割し,X_train,y_train,X_test,y_test,パラメータstratify=yは,テストセットとトレーニングセットを区分する際に,各部分のデータ型がyの2つのカテゴリのデータと同じ割合であり,分配ムラがモデル性能に影響を及ぼすことを防止することを示す.だからrandom_stateパラメータは、分割関数を実行するたびに同じ結果を得ることを制限します.従って,最終モデル精度に影響する要因としては,  1)データ分割のたびに,異なるグループに分割されたデータが異なる.  2)モデルパラメータ,すなわち選択した最近接数が異なる. 第1項は、モデルを訓練する際に交差検証を用いて、モデルに及ぼすランダム性の影響をできるだけ低減し、パラメータn_を調整する.neigborsはモデル精度を調整する.
    #           KNN    
    from sklearn.datasets import load_breast_cancer
    cancer = load_breast_cancer()
    
    X_train,X_test,y_train,y_test = train_test_split(cancer.data,cancer.target,stratify = cancer.target,random_state = 66)
    training_accuracy=[]
    test_accuracy = []
    
    for i in range(1,11):
        KNC = KNeighborsClassifier(n_neighbors=i).fit(X_train,y_train)
        training_accuracy.append(KNC.score(X_train,y_train))
        test_accuracy.append(KNC.score(X_test,y_test))
    plt.plot(range(1,11),training_accuracy,label = 'training_accuracy')
    plt.plot(range(1,11),test_accuracy,label='test_accuracy')
    plt.xlabel('n_neighbors')
    plt.ylabel('Accuracy')
    plt.legend()

    上図から,近傍数が6の場合,モデルは最大汎化精度を有することが分かった.
    KNN回帰
    KNN       K             ,        ,   KNN    。
    

    まとめ:
    KNNアルゴリズムの3要素:K値の選択,距離メトリック方式,分類決定規則
      分類決定規則は、通常、少数の多数に従う方法を用い、ここでは説明しない.
    K値の選択
      以前に述べたように,交差検証法によりKの適切なK値を選択することができる.
      小さいk値を選択すると、小さい領域の訓練例で予測することに相当し、訓練誤差は減少し、入力例に近い訓練例や似たような訓練例だけが予測結果に作用し、同時に汎化誤差が増大するという問題があり、言い換えれば、K値の減少は全体モデルが複雑になり、フィッティングが発生しやすいことを意味する.
      大きなk値を選択することは,大きな領域における訓練例を用いて予測することに相当し,その利点は汎化誤差を低減できるが,訓練誤差が増大するという欠点である.このとき,入力インスタンスから遠い(似ていない)訓練インスタンスも予測器に作用し,予測を誤り,K値の増大は全体のモデルが簡単になることを意味する.
      一个极端是k等于样本数m,则完全没有分类,此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单.
    距離のメジャー
    距離メトリックには、次のような方法があります.
    ヨーロッパ式距離$$D(x,y)=sqrt{(x_1−y_1)^2+(x_2−y_2)2+…+(x_n−y_n)^2}=sqrt{displaystylesum_{i=1}^n(x_i−y_i)^2}$$マンハッタン距離$$D(x,y)=|x_1−y_1|+|x_2−y_2|+...+|x_n−y_n|=\displaystyle\sum_{i=1}^n|x_i−y_i|$$ミンコフスキー距離(Minkowski Distance)$$D(x,y)=sqrt[p]{(|x_1−y_1|)^p+(|x_2−y_2|)^p+…+(|x_n−y_n|)^p}=sqrt[p]{displaystylesum_{i=1}^n|x_i−y_i|^p}$$
      は,ヨーロッパ式距離とマンハッタン距離がそれぞれミンコフスキー距離におけるpが2,1の場合の特殊距離であることを示した.
    メリットとデメリットとパラメータ
    メリット:
  • 理論は成熟しており、思想は簡単で、分類にも回帰
  • にも使用できる.
  • は非線形分類
  • に用いることができる.
  • 訓練時間の複雑さはサポートベクトルマシンのようなアルゴリズムよりも低く,O(n)
  • のみである.
  • と素朴ベイズのようなアルゴリズムの比は,データに対して仮定がなく,精度が高く,異常点に敏感ではない
  • である.
  • KNN法は、クラスドメインを判別する方法によって属するカテゴリを決定するのではなく、主に周囲の限られた隣接するサンプルに依存するため、クラスドメインの交差や重複が多い被分割サンプルセットにとって、KNN法は他の方法よりも
  • に適している.
  • このアルゴリズムは、サンプル容量の比較的大きいクラスドメインの自動分類に比較的適しているが、それらのサンプル容量の小さいクラスドメインは、このアルゴリズムを採用すると、誤分
  • を生じやすい.
    欠点:
  • 計算量が大きく、特に特徴数が非常に多い場合
  • サンプルがアンバランスの場合、希少カテゴリの予測精度は
  • より低い.
  • KDツリー、ボールツリーなどのモデル構築には大量のメモリが必要
  • 怠惰な学習方法を用いる、基本的に学習しないため、予測時の速度が論理回帰のようなアルゴリズムよりも
  • 遅い.
  • 決定木モデルと比較して,KNNモデルは解釈性が強くない
  • である.
    パラメータ:KNeiborsClassifier(n_neighbors)、距離測定方法.