Đị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 | |
## ---------------|-----------|-----------|-----------|
##
##