機械学習(一):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コード実装
scikit-learnによる実装
KNNを分類する
KNNが復帰する
まとめ
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モデルは分類も回帰もできるモデルである.シンプルだが強力なモデルです.
利点:精度が高く、異常値に敏感ではなく、データ入力がないと仮定する欠点:計算複雑度が高く、空間複雑度が高い