Định nghĩa K - nearest neighbour: đây là một thuật toán lấy các điểm lân cận của nó làm thành chính nó, K=1 là lấy 1 điểm nào gần nó nhất, trong KNN thường là xác định Label (nhãn) cho đầu ra dựa vào “đầu vào”,

Đầu vào trong KNN không tính toán gì cả, phần tính toán là tính khoảng cách của “cái cần dự đoán” so với các mẫu traing set.

Trong một bài viết https://machinelearningcoban.com/2017/01/08/knn/ sử dụng ngôn ngữ Python, đã nói về việc tách data thành traning set và test set

#install.packages("tidyverse")
#install.packages("XML")
#install.packages("rvest")
#install.packages("class")
#install.packages("gmodels")

library("tidyverse")
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.3     ✓ purrr   0.3.4
## ✓ tibble  3.0.5     ✓ dplyr   1.0.3
## ✓ tidyr   1.1.2     ✓ stringr 1.4.0
## ✓ readr   1.4.0     ✓ forcats 0.5.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library("XML")
library("rvest")
## Loading required package: xml2
## 
## Attaching package: 'rvest'
## The following object is masked from 'package:XML':
## 
##     xml
## The following object is masked from 'package:purrr':
## 
##     pluck
## The following object is masked from 'package:readr':
## 
##     guess_encoding
library(class)
library("gmodels")
#breast_cancer_wisconsi<-read_html("https://github.com/stedy/Machine-Learning-with-R-datasets/blob/master/wisc_bc_data.csv") # load từ URL nhưng phải có package #install.packages("tidyverse") #install.packages("XML") #install.packages("rvest")

#tables <-breast_cancer_wisconsi %>% html_table(fill = T) # sau khi load từ URL thì thêm cái này 

#tables<-tables[-1] # bỏ cột 1

#ABC = data.frame(tables)
#print(ABC[1:10,1:5]) # in hàng 1:10. cột 1:10
#ABC = ABC[-1] # bỏ một cột đầu tien

#ABC[1:10,1:5] # in hàng 1:10. cột 1:10

#ABC1 = ABC[c(1:33,2:7)]

#view(ABC) # xem bằng bảng

#dim(ABC) # xem bao nhiêu hàng, bao nhiêu cột

#ABC1 = data.frame(ABC)

## viết lại data frame khác với hàng đầu tiên là biến
#table(ABC[1:10,1:5]) # xem các hàng và cột tương ứng

#ABC_new <- data.frame(ABC,Variable_ABC) #kết hợp 2 data frame lai voi nhau nhung phải cùng số cột

#ncol(Variable_ABC_1) xem độ dài hàng nrow tương ứng

#ncol(ABC) # tương tự bên trên

#view(Variable_ABC_1)

#Variable_ABC_1 <- as.data.frame(t(Variable_ABC)) # đổi từ hàng thành cột trong một data frame **** cực quan trọng

LOAD data từ cột bên phải R markdown -> copy code từ console lên RMD nó mới hiểu, đặt data vừa load lên như một data.frame

breast.cancer.wisconsin <- read.csv("/cloud/project/Data/breast-cancer-wisconsin.txt")
ABC <- data.frame(breast.cancer.wisconsin)
#variable.names(ABC) # xem các biến trong ABC 
#str(ABC) # tóm tắt các biến, loại, trong ABC 

#ABC$diagnosis # xem biến diagnosis trong ABC 

#ABC <- ABC[-1] # SAI id tự động bỏ trong df ABC rồi

#ABC[1:5,]
#xem lại df ABC lúc này đã bỏ variable ID

ABC <- ABC[-1]
ncol(ABC)
## [1] 31
variable.names(ABC)
##  [1] "diagnosis"               "radius_mean"            
##  [3] "texture_mean"            "perimeter_mean"         
##  [5] "area_mean"               "smoothness_mean"        
##  [7] "compactness_mean"        "concavity_mean"         
##  [9] "concave.points_mean"     "symmetry_mean"          
## [11] "fractal_dimension_mean"  "radius_se"              
## [13] "texture_se"              "perimeter_se"           
## [15] "area_se"                 "smoothness_se"          
## [17] "compactness_se"          "concavity_se"           
## [19] "concave.points_se"       "symmetry_se"            
## [21] "fractal_dimension_se"    "radius_worst"           
## [23] "texture_worst"           "perimeter_worst"        
## [25] "area_worst"              "smoothness_worst"       
## [27] "compactness_worst"       "concavity_worst"        
## [29] "concave.points_worst"    "symmetry_worst"         
## [31] "fractal_dimension_worst"
view(ABC)
table(ABC$diagnosis)[1:10]
## 
##    B    M <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 
##  357  212

Many R machine learning classifiers require that the target feature is coded as a factor, so we will need to re-code the diagnosis variable. We will also take this opportunity to give the B and M values more informative labels using the labels parameter:

ABC$diagnosis <- factor(ABC$diagnosis, levels = c("B","M"),
                        labels = c("Benign","Malignant"))

##Tính % của các giá trị trong variable “diagnosis”

x<-prop.table(table(ABC$diagnosis))*100 # function prop.table tính % cho hàm table() của ABC$diagnosis * 100 ra % 

round(x,digits = 1) # hàm làm tròn
## 
##    Benign Malignant 
##      62.7      37.3

##hàm Summary() cho nhiều biến trong một df

#summary(ABC[c("radius_mean","area_mean","smoothness_mean")])

To normalize these features, we need to create a normalize() function in R. This function takes a vector x of numeric values, and for each value in x, subtract the minimum value in x and divide by the range of values in x. Finally, the resulting vector is returned. The code for the function is as follows:

 normalize <- function(x) {
 return ((x - min(x)) / (max(x) - min(x)))
 }
?knn()

chuyển về số prob (phần trăm)

ABC_n <-as.data.frame(lapply(ABC[2:31],normalize))
summary(ABC_n$area_mean)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.1174  0.1729  0.2169  0.2711  1.0000

tách ABC thành train set và test set + đặt label cho avariable diagnosis

ABC_training_set <- ABC_n[1:469,]
ABC_test_set <- ABC_n[470:569,]
ABC_training_label <-ABC[1:469,1]
ABC_test_label <- ABC[470:569,1]

train thử theo kNN mới đã chuyển toàn bộ sang prob

ABC_test_pred <-knn(ABC_training_set, ABC_test_set, cl = ABC_training_label , k=21)

xem kết quả

ABC_test_pred
##   [1] Benign    Benign    Benign    Benign    Benign    Benign    Benign   
##   [8] Benign    Benign    Benign    Malignant Benign    Benign    Benign   
##  [15] Benign    Benign    Benign    Benign    Malignant Benign    Benign   
##  [22] Benign    Benign    Malignant Benign    Benign    Benign    Benign   
##  [29] Benign    Malignant Malignant Benign    Malignant Benign    Malignant
##  [36] Benign    Benign    Benign    Benign    Benign    Malignant Benign   
##  [43] Benign    Malignant Benign    Benign    Benign    Malignant Malignant
##  [50] Benign    Benign    Benign    Malignant Benign    Benign    Benign   
##  [57] Benign    Benign    Benign    Benign    Benign    Benign    Benign   
##  [64] Benign    Malignant Benign    Malignant Malignant Benign    Benign   
##  [71] Benign    Benign    Benign    Benign    Benign    Benign    Benign   
##  [78] Benign    Benign    Benign    Benign    Benign    Benign    Benign   
##  [85] Benign    Benign    Benign    Benign    Benign    Benign    Benign   
##  [92] Benign    Benign    Malignant Malignant Malignant Malignant Malignant
##  [99] Malignant Benign   
## Levels: Benign Malignant

kiểm tra – ô số (1,1) tỷ lệ âm tính thật True Negative, (1,2) là tỷ lệ âm tính giả False Negative, (2,0) tỷ lệ dương tính giả False Positive, (2,2) tỷ lệ dương tính thật True Positive

CrossTable(x=ABC_test_label, y= ABC_test_pred, prop.chisq = F)
## 
##  
##    Cell Contents
## |-------------------------|
## |                       N |
## |           N / Row Total |
## |           N / Col Total |
## |         N / Table Total |
## |-------------------------|
## 
##  
## Total Observations in Table:  100 
## 
##  
##                | ABC_test_pred 
## ABC_test_label |    Benign | Malignant | Row Total | 
## ---------------|-----------|-----------|-----------|
##         Benign |        77 |         0 |        77 | 
##                |     1.000 |     0.000 |     0.770 | 
##                |     0.975 |     0.000 |           | 
##                |     0.770 |     0.000 |           | 
## ---------------|-----------|-----------|-----------|
##      Malignant |         2 |        21 |        23 | 
##                |     0.087 |     0.913 |     0.230 | 
##                |     0.025 |     1.000 |           | 
##                |     0.020 |     0.210 |           | 
## ---------------|-----------|-----------|-----------|
##   Column Total |        79 |        21 |       100 | 
##                |     0.790 |     0.210 |           | 
## ---------------|-----------|-----------|-----------|
## 
##