# KNN分類演算法(K-nearest neighbors algorithm)
[TOC]
###### tags: `data_mining` `ml`
---
### 演算法定義
* 假設欲預測點是 i
找出離 i最近的 k 筆資料多數是哪一類,預測 i 的類型
* Given a test instance i, find the k closest neighbors and their labels
Predict i’s label as the majority of the labels of the k nearest neighbors

* KNN屬於機器學習中的監督式學習(Supervised learning),不過一般來說監督式學習是透過資料訓練(training)出一個model,但是在KNN其實並沒有做training的動作。
* KNN一般用來做資料的分類,如果你已經有一群分好類別的資料,後來加進去點就可以透過KNN的方式指定新增加資料的分類。K表示一個常數,簡單的來說就是KNN就是看離你最近的K的點,然後看哪個類別的點最多就把自己也當成那個類別。你如果只看3個點,就是3NN囉。
---
### How to select k?

* 選擇一個好的k會讓training出來的model有足夠的彈性
* k=1--->overfitting
* ==參數過多==導致過度符合Training set的資料特性
---
#### What if k is an even number?
* 有可能碰到無法直接決定類別的時候
需要再去針對該情況作==exception handling==
----
#### What if k equals the number of the training instances?
* k=n的話,預測結果一定是資料數量最多的那一類
等於喪失kNN預測的效果
* underfitting
----
### 實作
* 如何用==sklearn==完成KNN
* 資料切分
* KNN分類
* KNN預測
#### 程式碼說明
* sklearn
``` python=
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
```
* dataset--->
* load_iris
``` python=
iris = datasets.load_iris()
```
* 可以得到安德森鳶尾花卉數據集

* 定義特徵資料
iris_data = iris.data
iris_label = iris.target
* 可以印出前三筆資料檢查
``` python=
iris_data[0:3]
```
* 可以看到結果
``` python=
array([[ 5.1, 3.5, 1.4, 0.2],
[ 4.9, 3. , 1.4, 0.2],
[ 4.7, 3.2, 1.3, 0.2]])
```
##### train_test_split
``` python=
train_data , test_data , train_label , test_label = train_test_split(iris_data,iris_label,test_size=0.2)
```
* training set:0.8
* testing set:0.2
##### sklearn KNeighborsClassifier()
``` python=
knn = KNeighborsClassifier()
```
* 將資料做訓練
``` python=
knn.fit(train_data,train_label)
```
* 預測我們剛剛切分出來的test_data資料
``` python=
print(knn.predict(test_data))
```
``` python=
print(test_label)
```

##### 結果
預測結果--->
test_data和test_label 只有差一筆
---
### 參考資料
[colab連結](https://colab.research.google.com/drive/1qkVQp4s--XzjwEqIYgd_vz25Tgia-Duc?usp=sharing)
[colab參考他人code](https://colab.research.google.com/github/teliofm/Minerando/blob/master/Scikit_Learn_KNN_Best_Practices.ipynb#scrollTo=lvSqHS1nKZJJ)