機械学習(一):K-近隣アルゴリズム(KNN)分類と回帰

3719 ワード

文書ディレクトリ
  • K近隣アルゴリズム(KNN)
  • 紹介
  • 原理
  • を実現
  • Pythonコード実装
  • scikit-learnを使用して
  • を実現
  • KNNを分類する
  • KNN回帰
  • まとめ
  • K-近隣アルゴリズム(KNN)
    紹介する
    K−近隣アルゴリズムは不活性学習モデル(lazy learning)であり、インスタンスベース学習モデルとも呼ばれ、勤勉学習モデル(eager learning)とは異なる.例えば線形回帰モデルは勤勉学習モデルに属する.勤勉学習モデルは訓練モデルの時に資源を消費し、訓練データに基づいてモデルを生成し、予測段階で直接データを持ち込むと予測データを生成できるので、予測段階では資源をほとんど消費しない不活性学習モデルは訓練モデルの時にモデルから生成されたパラメータを推定しない.彼はすぐに予測できるが、多くの資源を消費する.たとえばKNNモデルでは,1つのインスタンスを予測するには,すべてのインスタンスとの距離を求める必要がある.K-近隣アルゴリズムは非パラメータモデルであり、パラメータモデルは一定の数のパラメータまたは係数を用いてモデルを定義するが、非パラメータモデルはパラメータを必要としないことを意味するのではなく、パラメータの数が不確定であり、訓練例の数の増加に伴って増加する可能性があり、データ量が大きい場合、解釈変数と応答変数の関係が見えない場合、非パラメータモデルを使用すると大きな利点があり,データ量が少ないと両者の関係が観察され,対応するモデルを使用すると大きな利点がある.
    げんり
    サンプルセット、すなわちトレーニングセットが存在し、各データにラベルがある.つまり、サンプル中の各データと所属分類の関係を知っている.ラベルのない新しいデータを入力すると、新しいデータの各特徴はサンプルセットのすべてのデータに対応する特徴と比較し、新しいデータとサンプルセットの他のデータのユークリッド距離を算出する.ここではK値を与える必要があり、ここでは新しいデータと最も距離の近いK個のデータを選択し、その中で最も出現回数の多い分類が新しいデータの分類であり、一般的にkは20を超えない.
    インプリメンテーション
    Pythonコード実装
    import operator
    def class_KNN(X,dataset,y,K):
        datasize = dataset.shape[0] #   dataset   
        diff = np.tile(X,(datasize,1))-dataset  # tile   1      datasize X
        distances = ((diff**2).sum(axis=1))**0.5 # 
        sort_distance = distances.argsort()
        class_count = {}
        for i in range(K):
            votelabel = y[sort_distance[i]]
            class_count[votelabel] = class_count.get(votelabel,0) + 1
            sort_class_count = sorted(class_count.items(),key=operator.itemgetter(1),reverse=True)
            return sort_class_count[0][0]
    data = np.array([[158,64],[170,86],[183,84],[191,80],[155,49],[163,59],[180,67],[158,54],[170,67]])
    y = ['m','m','m','m','fm','fm','fm','fm','fm']
    x = [150,50]
    print(class_KNN(x,data,y,3))
    

    scikit-learnによる実装
    KNNを分類する
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.preprocessing import LabelBinarizer
    from sklearn.neighbors import KNeighborsClassifier
    X_train = np.array([[158,64],[170,86],[183,84],[191,80],[155,49],[163,59],[180,67],[158,54],[170,67]])
    y_train = ['m','m','m','m','fm','fm','fm','fm','fm']
    lb = LabelBinarizer()   #  y_train     
    y_train_transform = lb.fit_transform(y_train)
    k = 3 #   K 
    KNN = KNeighborsClassifier(n_neighbors=k)
    KNN.fit(X_train,y_train_transform)
    y_predict = KNN.predict(np.array([155,70]).reshape(1,-1))[0]
    y_predict_transform = lb.inverse_transform(y_predict) #                 
    y_predict_transform
    
    # output
    array(['fm'], dtype='

    KNNが復帰する
    from sklearn.neighbors import KNeighborsRegressor 
    from sklearn.metrics import mean_squared_error,mean_absolute_error
    from sklearn.preprocessing import StandardScaler  #      
    X_train = np.array([[158,1],[170,1],[183,1],[191,1],[155,0],[163,0],[180,0],[158,0],[170,0]])
    y_train = [64,86,84,80,49,59,67,54,67]
    X_test = np.array([[168,1],[180,1],[160,0],[169,0]])
    y_test = [65,96,52,67]
    ss = StandardScaler()
    X_train_scaled = ss.fit_transform(X_train)
    X_test_scaled = ss.transform(X_test)
    K = 3
    KN = KNeighborsRegressor(n_neighbors=K)
    KN.fit(X_train_scaled,y_train)
    predictions = KN.predict(X_test_scaled)
    print('     :',predictions)
    print('MAE ',mean_absolute_error(y_test,predictions))  #       
    print('MSE ',mean_squared_error(y_test,predictions))  #     
    
    
    # output:
         : [78.         83.33333333 54.         64.33333333]
    MAE  7.583333333333336
    MSE  85.13888888888893
    

    まとめ
    KNNモデルは分類も回帰もできるモデルである.シンプルだが強力なモデルです.
    利点:精度が高く、異常値に敏感ではなく、データ入力がないと仮定する欠点:計算複雑度が高く、空間複雑度が高い