返回網站

KNN 資料預測和分類

利用 R 的 class 套件之 knn 函式做資料分類

· R

讓 R 來預測 iris 的花種

  鳶尾花是一種漂亮且多彩的花,其種類也非常豐富;iris 則是 R 裡面眾多預設資料集的其中一組,iris 的資料內容分別包含了三種鳶尾花,共一百五十朵的花萼及花瓣的長度與寬度,其中這 150 筆鳶尾花長與寬的數據資料包含 setosa、versicolor 和 virginica 各有 50 筆;接下來會把資料分成兩堆(各占總數的 75% 及 25%),再利用 KNN 演算法來計算預測其中 25% 的花,分別是屬於哪一種。

主要是根據花萼及花瓣的長寬數據來算出所有 25% 中要預測的那一朵花與 75% 每朵花之間的距離,並取最近的 K 個來多數決那一朵的花種;是分類技術中最簡單的一種,不須建立模型。

KNN 的演算過程;右方為儲存的變數資訊。

首先來看 iris 的資料內容,先使用 data 載入後再利用各種函式來觀察整個資料的型態,由此來了解 iris 的資料內容結構,然後再使用 sample 函式來亂數取樣本號碼。(取 3/4 作為訓練資料集)

不管任何時候,都要先觀察你的資料詳細內容,以便於後續操作。

下圖可看出 iris 資料集的詳細資訊。

iris 裡有 5 個欄位分別是:花萼長、花萼寬、花瓣長、花瓣寬和花種。

sample 所取出的 3/4 資料數為 112 筆。(這裡取出的是編號號碼)

亂數抽取不放回結果。

接著來設定 knn 所需要的訓練資料集和測試資料集,還有載入 class 套件才能使用 knn 函式,並設定變數將資料集的長寬數據和花種答案分開。(Y.test 是最後拿來和 knn 輸出的結果做準確率的計算)

"-"index 等同於 -112;這裡可以注意 iris 這個 data.fram 的行列資料如何取用。

開始 knn 計算,設定 k=3;可以另外做 k=1 到 10 的計算,並比較後面所計算的準確率。

語法執行中,可以只框選 KNN_prediction 執行看預測花種的結果。

單獨執行 KNN_prediction 的結果,knn 已經根據訓練資料集和 X.test 計算出預測的花種。(因為已經有 Y.test 這個答案,所以就可以來計算到底準確率有多高)

knn 計算預測的花種。

為了方便觀察,利用 table 把資料做成一個表格,並使用 print 輸出。

可以先單獨執行 mytable,會出現類似下一張圖片的表格。

最後則是把所有整理好的資訊,用 print 及 cat 執行輸出。

這裡可以容易看出準確率非常地高。

一開始我們是假裝不知道剩下 25% 的花的種類,而把花萼和花瓣的長寬數據,丟給 knn 來計算分類出花的種類;最後就準確率來看只要 112 筆 iris 的數據資料,就能夠把剩下 25% 共 38 筆未知花種的數據做一個準確率超過 94% 的分類預測!(KNN,k=3)