K近傍法 (K-nearest neighbor) のまとめ
What is K近傍法 (K-nearest neighbor) ?
Train Data を平面上に plot していき、あるテストデータ 't' をテストするときに、平面上で、その点t に近い K個の点の最頻値で テストデータ 't' のラベリングをする。というのが K近傍法です。(平面以外も使うのですが、ここでは、概念を説明するため、わかりやすい平面を使います。)
ちょっと難しいので、Wikipedia から図を拝借してきます。
Extracted from Wikipedia
というように緑の点を、最も近い K個の点を元にラベリングします。
ここで注意したいのが、K個の点とした、変数 K です。
例えば、上記の図で、
K = 3 とすると、赤2点、青1点で 緑の点は 赤にラベリングされます。
K = 5 とすると、赤2点、青3点で、緑の点は、青にラベリングされてしまいます。
K近傍法の注意事項
-
上記の場合であれば赤と青の点がある程度まとまって分かれているならば、K近傍法は、うまく機能するでしょう。しかし、逆に赤と青の点が特にまとまって分かれているわけでもなく、赤と青の点が混在しているデータであれば、K近傍法を使うのは得策とは言えません。
-
さらに、Kの個数を指定するときに偶数を指定すると、二つのラベルが同数になってしまって分類できなかったりするので、Kの個数は必ず奇数にしましょう。
-
そして、Kの数を多くした場合、例えば、赤の点が青の点に比べて異常に多ければ、赤に分類される確率も異常に大きくなってしまいます。なので、赤と青の点の比率にも注意が必要です。
default のコード
from sklearn.neighbors import KNeighborsClassifier
KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto',
leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=1, **kwargs)
K近傍法 (K-nearest neighbor) 内の Parameter の説明
- n_neighbors
これが上記で述べたように、考慮する最寄りの点の数です。 default であれば、n_neighbors = 5 になっているので、最寄りの点 5つから分類をします。ちなみに、n_neighborsの境界線の違いは下記の図のようになります。
Extracted from kevinzakka's blog
たぶん一番大切なパラメータが上記で説明した n_neighbors で、この考慮する K個の点を最適な数を下記のコードで求められるらしい。
# K個のKに入れる数字のリストを作る
myList = list(range(1,50))
# そのリストから偶数を引き、奇数だけのリストにする
neighbors = filter(lambda x: x % 2 != 0, myList)
# Cross Validation のスコアを入れる空のリストを作る
cv_scores = []
# cross validation をして、スコアを上記の空リストに append
for k in neighbors:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X_train, y_train, cv=10, scoring='accuracy')
cv_scores.append(scores.mean())
これも kevinzakka's blog より抜粋
-
weights
weights は重み付けのパラメータです。 'uniform' が default でこれを使用すると、すべての値が等しく考慮されます。'distance' にした場合、近くの点が遠い点よりも考慮される割合が高い(重み付け)です。また自分で関数などを作って指定することもできます。 -
algorithm
すいません、これに関してはユークリッド空間とか専門用語でてきて数学的教養のなさでわかりませんでした。でもそんな方向けに 'auto' という指定ができ、最適なのを選んでくれるそうです。ちなみに、他の種類は'ball_tree', 'kd_tree', 'brute'らしいので、興味ある方は調べてみてください。また、わかりやすい解説見つけた方、コメントで教えてください。
一応上記がメインのパラメータです。また、理解できたのが増え次第足していきます。わかる方は、編集リクエストも大歓迎です。よろしくお願いいいたします。
K近傍法 (K-nearest neighbor) の 良い点悪い点。
- 良い点
データの規模が大きければ、より正確な分類をすることができる確率が上がります。シンプルでわかりやすいモデル。
- 悪い点
What is K近傍法のところで2つ注意事項として悪い点を述べましたが、もう一度一文で簡単にまとめます。
複数のクラスが異常に混在していたり、比率が異常に偏っている場合などは、分類がうまくいかなかったりします。
まとめ
以上が現在筆者のわかる範囲での K近傍法 (K-nearest neighbor) の概要です。
日々更新していきますので、追加すべきところ、直すべきところありましたら、コメントいただけると幸いです。