1. 程式人生 > >R語言使用k值近鄰分類演算法

R語言使用k值近鄰分類演算法

說明

k近鄰(knn)演算法屬於一種無參惰性演算法,無參類演算法不會對資料的分佈做任何假設,而惰性學習方法則不要求演算法具備顯性學習過程。
本節將介紹如何應用k近鄰演算法對churn資料集進行處理。

操作

載入class包

library(class)

將訓練和測試資料中的voice_mail_plan,international_plan屬性原來的值yes和no分別用1和0代替。


levels(trainset$international_plan) = list("0"="no","1"="yes")
levels(trainset$voice_mail_plan)
= list("0"="no","1"="yes") levels(testset$international_plan) = list("0"="no","1"="yes") levels(testset$voice_mail_plan) = list("0"="no","1"="yes")

使用KNN分類演算法處理訓練和測試資料集

churn.knn = knn(trainset[,! names(trainset) %in% c("churn")],testset[,!names(testset) %in% c("churn")],trainset$churn,k=3)
 summary(churn.knn)
yes  no
77 941

呼叫table函式得到分類矩陣

table(testset$churn,churn.knn)
     churn.knn
      yes  no
  yes  44  97
  no   33 844

呼叫confusionMatrix函式得到混淆矩陣:

 confusionMatrix(testset$churn,churn.knn)
Confusion Matrix and Statistics

          Reference
Prediction yes  no
       yes  44  97
       no   33 844
Accuracy : 0.8723 95% CI : (0.8502, 0.8922) No Information Rate : 0.9244 P-Value [Acc > NIR] : 1 Kappa : 0.339 Mcnemar's Test P-Value : 3.286e-08 Sensitivity : 0.57143 Specificity : 0.89692 Pos Pred Value : 0.31206 Neg Pred Value : 0.96237 Prevalence : 0.07564 Detection Rate : 0.04322 Detection Prevalence : 0.13851 Balanced Accuracy : 0.73417 'Positive' Class : yes

正確率有0.8723
####說明
knn演算法採用相似性(距離)測量來訓練所有樣例並對新到達樣例進行分類標記,相似性測量可以採用以下公式:歐式距離與曼哈頓距離。
下圖中,綠色圓要被決定賦予哪個類,是紅色三角形還是藍色四方形?如果K=3,由於紅色三角形所佔比例為2/3,綠色圓將被賦予紅色三角形那個類,如果K=5,由於藍色四方形比例為3/5,因此綠色圓被賦予藍色四方形類。
knn圖
K最近鄰(k-Nearest Neighbor,KNN)分類演算法,是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。KNN演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 KNN方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。

KNN演算法不僅可以用於分類,還可以用於迴歸。通過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成反比。

優點
1.簡單,易於理解,易於實現,無需估計引數,無需訓練;
2. 適合對稀有事件進行分類;
3.特別適合於多分類問題(multi-modal,物件具有多個類別標籤), kNN比SVM的表現要好。
4.無參意味著使用者不需要假設資料的分佈模型。
5.只要對給定的樣例選擇合適的距離測量方法,演算法就可以處理任何型別的資料。
缺點
1.可理解性差,無法給出像決策樹那樣的規則。
2.該方法的另一個不足之處是計算量較大,因為對每一個待分類的文字都要計算它到全體已知樣本的距離,才能求得它的K個最近鄰點。
3.演算法的效能依賴於資料集維度的大小,如果要處理高維的資料,應該先對資料進行降維操作以提高演算法的過程效能。
4.該演算法在分類時有個主要的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本佔多數。 該演算法只計算“最近的”鄰居樣本,某一類的樣本數量很大,那麼或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響執行結果。

knn演算法的呼叫與前述基於樹的分類方法沒有明顯差別,基於樹的演算法能夠向用戶展示一顆決策樹模型,而knn演算法的輸出僅包括分類資訊因素。使用knn演算法構建模型之前,應該首先將資料集中的字元型別屬性預處理成整形,因為k近鄰演算法要計算樣例之間有距離。通過指定k = 3,意味樣例可能被分配到距離最近的三個相鄰簇中。分類模型建好後,就可以藉助測試資料集和預測因子作為輸入來生成分類表,並基於分類表得到混淆矩陣,精度比之前差一點,僅憑精度還不能區分模型優勢,使用者還應該進一步比較演算法的特異性和靈敏度。