Liz's Blog

就是要學R #14:機器學習之K Nearest Neighbor(KNN)實作篇

| Comments

不得不說,終於對機器學習的輪廓,有了更多的了解。K Nearest Neighbor (KNN)相對比較好理解,好操作,可以先複習邏輯迴歸實作篇線性迴歸實作篇R programming 基礎篇,再進入這篇。

網路資料很多,但還是很推薦大家可以在特價的時候,買下這門課。
Udemy
課程名稱:Data Science and Machine Learning Bootcamp with R
講師:Jose Portilla

網路上看到這篇把kNN分類演算法概念解釋的很清楚的文章。

1.使用ISLR中的Caravan資料集,總計5822個樣本數,評估85個特徵。本來只有約6%的人會購買Caravan保險,他們希望能找出哪一類人比較會買保險。

install.packages('ISLR')
library(ISLR)
str(Caravan)
summary(Caravan$Purchase)

2.確認是否有無NA資料。

any(is.na(Caravan))

3.因為KNN分類法是藉由觀察最鄰近的值作為分類依據,所以各變數比例相對重要。所以這邊目的就是為了要將變數標準化。Caravan第86個變數是有沒有購買,所以會先隔離成獨立的變數,再將其他85個變數比例標準化。

var(Caravan[,1])
var(Caravan[,2])
purchase <- Caravan[,86]
standardized.Caravan <- scale(Caravan[,-86])
var(standardized.Caravan[,1])

#把前1000橫排作為測試資料
test.index <- 1:1000
test.data <- standardized.Caravan[test.index,]
test.purchase <- purchase[test.index]

#剩餘則作為訓練組
train.data <- standardized.Caravan[-test.index,]
train.purchase <- purchase[-test.index]

4.使用KNN()是預測是否有某些特質的人會買Caravan的保險。使用到argument依序為train.data(訓練組資料不含purchase)、test.data(測試組資料不含purchase)、train.purchase(訓練組purchase)、k值(多少鄰居,可先從1開始)。

library(class)
set.seed(101)
predicted.purchase <- knn(train.data,test.data,train.purchase,k=1)

#錯誤率
mean(test.purchase != predicted.purchase)

5.選擇k值(手動改變k值當然也可以,但因為搞工,所以使用for() loop交給電腦就好)。關於NA和Null的討論,可以看這篇解釋或參考這篇NULL 空值

predicted.purchase <- knn(train.data,test.data,train.purchase,k=3)
mean(test.purchase != predicted.purchase)
predicted.purchase <- knn(train.data,test.data,train.purchase,k=5)
mean(test.purchase != predicted.purchase)

predicted.purchase = NULL
error.rate = NULL

for(i in 1:20){
    set.seed(101)
    predicted.purchase = knn(train.data,test.data,train.purchase,k=i)
    error.rate[i] = mean(test.purchase != predicted.purchase)
}
print(error.rate)

6.利用Elbow Method來選擇最適合的k值。

library(ggplot2)
k.values <- 1:20
error.df <- data.frame(error.rate,k.values)
error.df
ggplot(error.df,aes(x=k.values,y=error.rate)) + geom_point()+ geom_line(lty="dotted",color='red')

同樣資料集其他跑法可以參考這篇文章,特別是針對正確及錯誤率來做改善的說明。

1.另一個練習使用ISLR套件中的iris鳶尾花資料集,可參考這篇文章。共有150個樣本,五個資料欄位分別是Sepal.Length(花萼長度)、Sepal.Width(花萼寬度)、Petal.Length(花瓣長度)、Petal.Width(花瓣寬度)及Species(品種)。

library(ISLR)
head(iris)
str(iris)

2.比例標準化

stand.features <- scale(iris[1:4])
var(stand.features[,1])
final.data <- cbind(stand.features,iris[5])
head(final.data)

3.將樣本分成訓練組及測試組

library(caTools)
set.seed(101)
sample <- sample.split(final.data$Species, SplitRatio = .70)
train <- subset(final.data, sample == TRUE)
test <- subset(final.data, sample == FALSE)

4.建立KNN模型(從k=1開始試跑)

library(class)
predicted.species <- knn(train[1:4],test[1:4],train$Species,k=1)
predicted.species
mean(test$Species != predicted.species)

5.選擇適合的K值

predicted.species <- NULL
error.rate <- NULL

for(i in 1:10){
    set.seed(101)
    predicted.species <- knn(train[1:4],test[1:4],train$Species,k=i)
    error.rate[i] <- mean(test$Species != predicted.species)
}

library(ggplot2)
k.values <- 1:10
error.df <- data.frame(error.rate,k.values)
pl <- ggplot(error.df,aes(x=k.values,y=error.rate)) + geom_point()
pl + geom_line(lty="dotted",color='red')

【延伸閱讀】
1.就是要學R #1:Basic 基礎篇
2.就是要學R #2:Matrix 矩陣篇
3.就是要學R #3:Data Frame 資料框架篇
4.就是要學R #4:List 列表篇
5.就是要學R #5:Import & Export 匯入匯出篇(csv & excel)
6.就是要學R #6:Import & Export 匯入匯出篇(SQL & web scraping)
7.就是要學R #7:R programming 基礎篇
8.就是要學R #8:R Programming 進階篇
9.就是要學R #9:資料前處理篇(dplyr、tidyr)
10.就是要學R #10:ggplot2幫你搞定資料視覺化
11.就是要學R #11:資料視覺化應用篇(ggplot2、Plotly)
12.就是要學R #12:機器學習之線性迴歸實作篇
13.就是要學R #13:機器學習之邏輯迴歸實作篇
14.就是要學R #14:機器學習之K Nearest Neighbor(KNN)實作篇
15.就是要學R #15:機器學習之決策樹、隨機森林實作篇
16.就是要學R #16:機器學習之Support Vector Machine(SVM)實作篇
17.就是要學R #17:機器學習之K Means Clustering實作篇
18.就是要學R #18:機器學習之自然語言處理(NLP)實作篇
19.就是要學R #19:機器學習之類神經網路(Neural Net)實作篇

Comments

comments powered by Disqus