R語言實例——基於鄰近的分類預測(KNN演算法)
常用的數據挖掘方法包括關聯規則挖掘、數據分類、聚類分析、回歸分析和web數據挖掘等。
常見的數據分類方法包括:logistic回歸、決策樹、神經網路、貝葉斯、支持向量機(SVM)、KNN、隨機森林。#logistic回歸、KNN、隨機森林即可以用於回歸分析也可以用於數據分類。
本文主要介紹KNN演算法在數據分類中的應用。
KNN演算法即為k近鄰演算法,主要用於分類也可以用於回歸,是機器學習中最簡答的演算法之一,其主要思路是:如果一個樣本在空間中的k個最相似的樣本大多數屬於某一個類別,則該樣本也屬於這個類別。這個思想想恰好符合物以類聚,人以群分的思想。knn演算法主要對於樣本在特徵空間中有交叉或重疊的待分樣本,knn演算法比其他分類演算法更為合適。
KNN應用領域:
1.計算機視覺:包含字元和面部識別等
2.推薦系統:推薦受眾喜歡電影、美食和娛樂等3.基因工程:識別基因數據的模式,用於發現特定的蛋白質或疾病等參考鏈接:KNN演算法的R語言實現 - YukBrandes - 博客園
模型分為兩種類型:分類模型和回歸模型。(本文只說KNN分類模型的應用)
對於分類預測模型,輸出變數為分類型的預測模型,將待分類樣本的類別確定為k個近鄰的絕大多數類別;對於回歸問題,輸出變數為數值型的預測模型稱為回歸預測模型,預測樣本的響應變數值為k個近鄰響應變數的平均值。
KNN分類器中屬性變數選取:
基於KNN數據挖掘,屬性變數選取合適與否對分類器的準確率至關重要,KNN分類器屬性變數的選擇可以基於作圖分析,相關分析。這一步驟有助於了解數據分類指標的合理性,有助於減少分類指標中的雜訊。(雜訊:雜訊是一個測量變數中的隨機錯誤或偏差,包括錯誤值或偏離期望的孤立點值。詳情參見:5.2.2 雜訊數據處理 - 51CTO.COM)
K參數選取:
KNN 演算法中K值的選取對於分類器的準確率有較大的影響。為便於在最鄰近的子集中進行投票,K值的選取一般為奇數。若K值太小,則KNN分類結果容易受到雜訊的影響;反之,若K的取值過大,則分類器提取的最鄰近子集中容易因為包含過多的錯誤點而對分類準確率產生影響。
模型評價:
KNN演算法一般運用交叉驗證(Cross validation)俗稱循環估計法去驗證KNN分類器的準確率進行分析。其統計學上將數據樣本切割成較小子集進行驗證的實用方法。(參考文獻: 基於交叉驗證技術的KNN方法在降水預報中的試驗。)
模型評價的一般標準:(1)準確率
(2)速度
(3)穩健性
(4)可伸縮性
(5)可解釋性
參考文獻:碩士學位論文-基於數據挖掘的分類和聚類演算法研究及R語言實現
KNN演算法優缺點:
參考書籍:Brett Lantz等機器學習與R語言
R語言實現knn演算法的函數包:
1、class函數包中的knn、knn.cv函數;
2、caret函數包中的knn3函數;
3、kknn函數包中的kknn函數;
參考鏈接:R語言---knn演算法_追夢人_新浪博客
應用實例:
data(iris)str(iris)data.frame: 150 obs. of 5 variables: $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...table(iris$Species) setosa versicolor virginica 50 50 50 #基於KNN數據挖掘,屬性變數選取合適與否對分類器的準確率至關重要,KNN分類器屬性變數的選擇可以基於作圖分析with(iris,plot(Petal.Width,Petal.Length))見下圖:set.seed(9850)gp<-runif(nrow(iris))[1] 0.749575882 0.997086017 0.652001954 0.432928278 0.332312413 0.865406471 [7] 0.179331242 0.478493654 0.295795314 0.664406579 0.711770326 0.780119344 [13] 0.135679218 0.081918849 0.631659831 0.529684246 0.017083371 0.947442812 [19] 0.288261390 0.010243757 0.889722764 0.099838558 0.976578544 0.626311010 [25] 0.818966399 0.814217131 0.228938267 0.393345113 0.963064569 0.158522949 [31] 0.365362736 0.815672850 0.160475621 0.325075457 0.956077240 0.221829941 [37] 0.240358861 0.654842327 0.833372210 0.223317408 0.567319461 0.645643225 [43] 0.046593236 0.166861771 0.095600741 0.280708688 0.274372719 0.306021348 [49] 0.466236177 0.714833845 0.819010729 0.413965707 0.033480894 0.163171474 [55] 0.614522173 0.625591099 0.987969234 0.590955717 0.291943232 0.848013638 [61] 0.239626787 0.227112662 0.014037226 0.235208923 0.348486998 0.752009868 [67] 0.397804687 0.173633337 0.115410871 0.096681800 0.772989324 0.579852495 [73] 0.592361025 0.317120232 0.265488403 0.736040238 0.725467216 0.866390575 [79] 0.774121353 0.041318237 0.717216028 0.618082392 0.025139597 0.958615328 [85] 0.237069942 0.157850945 0.919268952 0.373450233 0.612524643 0.580367921 [91] 0.040488273 0.606024550 0.253320484 0.617464615 0.670980009 0.498678416 [97] 0.539632167 0.620603637 0.743601094 0.707388356 0.881044094 0.140365195[103] 0.009580307 0.641032226 0.919105340 0.968964117 0.157093387 0.494844032[109] 0.453633379 0.211360556 0.803511472 0.522870498 0.537666918 0.922744670[115] 0.975340607 0.223733670 0.371116180 0.035312952 0.322225733 0.157145070[121] 0.168501345 0.063806432 0.489302015 0.968255649 0.474587146 0.269455400[127] 0.451698734 0.220212331 0.986794680 0.775118793 0.658783297 0.088049627[133] 0.815227871 0.743987815 0.083619478 0.465915223 0.759169244 0.886477632[139] 0.603841368 0.155911440 0.747532928 0.689924665 0.986163957 0.512607964[145] 0.311356318 0.644091529 0.804400820 0.133151028 0.757746826 0.420075185iris<-iris[order(gp),]str(iris)data.frame: 150 obs. of 5 variables: $ Sepal.Length: num 7.1 5.1 6 5.4 5.8 6.9 7.7 5.5 5.7 4.4 ... $ Sepal.Width : num 3 3.8 2.2 3.9 2.7 3.1 3.8 2.6 2.6 3.2 ... $ Petal.Length: num 5.9 1.5 4 1.3 3.9 4.9 6.7 4.4 3.5 1.3 ... $ Petal.Width : num 2.1 0.3 1 0.4 1.2 1.5 2.2 1.2 1 0.2 ... $ Species : Factor w/ 3 levels "setosa","versicolor",..: 3 1 2 1 2 2 3 2 2 1 .head(iris,10) Sepal.Length Sepal.Width Petal.Length Petal.Width Species103 7.1 3.0 5.9 2.1 virginica20 5.1 3.8 1.5 0.3 setosa63 6.0 2.2 4.0 1.0 versicolor17 5.4 3.9 1.3 0.4 setosa83 5.8 2.7 3.9 1.2 versicolor53 6.9 3.1 4.9 1.5 versicolor118 7.7 3.8 6.7 2.2 virginica91 5.5 2.6 4.4 1.2 versicolor80 5.7 2.6 3.5 1.0 versicolor43 4.4 3.2 1.3 0.2 setosastr(iris)data.frame: 150 obs. of 5 variables: $ Sepal.Length: num 7.1 5.1 6 5.4 5.8 6.9 7.7 5.5 5.7 4.4 ... $ Sepal.Width : num 3 3.8 2.2 3.9 2.7 3.1 3.8 2.6 2.6 3.2 ... $ Petal.Length: num 5.9 1.5 4 1.3 3.9 4.9 6.7 4.4 3.5 1.3 ... $ Petal.Width : num 2.1 0.3 1 0.4 1.2 1.5 2.2 1.2 1 0.2 ... $ Species : Factor w/ 3 levels "setosa","versicolor",..: 3 1 2 1 2 2 3 2 2 1 .summary(iris[,c(1,2,3,4)])Sepal.Length Sepal.Width Petal.Length Petal.Width Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 Median :5.800 Median :3.000 Median :4.350 Median :1.300 Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800 Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500 normalize<-function(x){return((x-min(x))/(max(x)-min(x)))}iris_n<-as.data.frame(lapply(iris[,c(1,2,3,4)],normalize))str(iris_n)data.frame: 150 obs. of 4 variables: $ Sepal.Length: num 0.778 0.222 0.472 0.306 0.417 ... $ Sepal.Width : num 0.4167 0.75 0.0833 0.7917 0.2917 ... $ Petal.Length: num 0.8305 0.0847 0.5085 0.0508 0.4915 ... $ Petal.Width : num 0.8333 0.0833 0.375 0.125 0.4583 ...summary(iris_n) Sepal.Length Sepal.Width Petal.Length Petal.Width Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.00000 1st Qu.:0.2222 1st Qu.:0.3333 1st Qu.:0.1017 1st Qu.:0.08333 Median :0.4167 Median :0.4167 Median :0.5678 Median :0.50000 Mean :0.4287 Mean :0.4406 Mean :0.4675 Mean :0.45806 3rd Qu.:0.5833 3rd Qu.:0.5417 3rd Qu.:0.6949 3rd Qu.:0.70833 Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.00000 iris_train<-iris_n[1:129,]iris_test<-iris_n[130:150,]iris_train_target<-iris[1:129,5]iris_test_target<-iris[130:150,5]require(class)sqrt(150)12.24745ml<-knn(iris_train,iris_test,cl=iris_train_targrt,k=13)ml [1] versicolor setosa virginica virginica virginica [6] setosa virginica versicolor virginica setosa [11] setosa virginica setosa virginica virginica [16] virginica setosa virginica virginica versicolor[21] setosa Levels: setosa versicolor virginicatable(iris_test_target,ml)iris_test_target setosa versicolor virginica setosa 7 0 0 versicolor 0 3 2 virginica 0 0 9#分類正確率在90.48%
參考鏈接:R語言---knn演算法_追夢人_新浪博客
5.2.2 雜訊數據處理 - 51CTO.COM
參考文獻: 基於交叉驗證技術的KNN方法在降水預報中的試驗
KNN數據挖掘演算法在北京地區霾等級預報中的應用
碩士學位論文-基於數據挖掘的分類和聚類演算法研究及R語言實現.pdf
Brett Lantz等機器學習與R語言
推薦閱讀: