R機器學習之一:kNN演算法案例
阿新 • • 發佈:2019-02-01
kNN演算法優劣
優點:
高度無偏且不需要對資料作任何假設。簡單有效易於實現
缺點:
由於沒有涉及抽象過程,kNN實際上並沒有建立一個模型,預測時間較長
case study:檢測前列腺癌
Step 1 :
100個觀測10個變數,其中8個數值變數,一個類別變數,一個ID:
1,Radius
2,Texture
3,Perimeter
4,Area
5,Smoothness
6,Compactness
7,Symmetry
8,Fractal dimension
Step 2 :資料準備
setwd('D:\\f\\機器學習\\AnalyticsVidhya\\kNN in R')
prc=read.csv("D:\\f\\機器學習\\AnalyticsVidhya\\kNN in R\\Prostate_Cancer.csv" )
> head(prc)
id diagnosis_result radius texture perimeter area smoothness compactness symmetry
1 1 M 23 12 151 954 0.143 0.278 0.242
2 2 B 9 13 133 1326 0.143 0.079 0.181
3 3 M 21 27 130 1203 0.125 0.160 0.207
4 4 M 14 16 78 386 0.070 0.284 0.260
5 5 M 9 19 135 1297 0.141 0.133 0.181
6 6 B 25 25 83 477 0.128 0.170 0.209
fractal_dimension
1 0.079
2 0.057
3 0.060
4 0.097
5 0.059
6 0.076
prc=prc[-1]#ID列沒有用
##資料集包括被診斷為惡性和良性的病人
table(prc$diagnosis_result)
prc$diagnosis <- factor(prc$diagnosis_result, levels = c("B", "M"),
labels = c("Benign", "Malignant"))
round(prop.table(table(prc$diagnosis)) * 100, digits = 1)
normalize <- function(x) {
return ((x - min(x)) / (max(x) - min(x))) }
prc_n <- as.data.frame(lapply(prc[2:9], normalize))#對數值變數標準化
prc_train <- prc_n[1:65,]
prc_test <- prc_n[66:100,]
prc_train_labels <- prc[1:65, 1]
prc_test_labels <- prc[66:100, 1]
#訓練模型install.packages("class")
library(class)
##用knn()函式分類測試資料,k選為樣本個數開方
prc_test_pred <- knn(train = prc_train, test = prc_test,cl = prc_train_labels, k=10)
##模型評估
install.packages("gmodels")
library(gmodels)
CrossTable(x=prc_test_labels,y=prc_test_pred,prop.chisq = FALSE)
> CrossTable(x=prc_test_labels,y=prc_test_pred,prop.chisq = FALSE)
Cell Contents
|-------------------------|
| N |
| N / Row Total |
| N / Col Total |
| N / Table Total |
|-------------------------|
Total Observations in Table: 35
| prc_test_pred
prc_test_labels | B | M | Row Total |
----------------|-----------|-----------|-----------|
B | 7 | 12 | 19 |
| 0.368 | 0.632 | 0.543 |
| 1.000 | 0.429 | |
| 0.200 | 0.343 | |
----------------|-----------|-----------|-----------|
M | 0 | 16 | 16 |
| 0.000 | 1.000 | 0.457 |
| 0.000 | 0.571 | |
| 0.000 | 0.457 | |
----------------|-----------|-----------|-----------|
Column Total | 7 | 28 | 35 |
| 0.200 | 0.800 | |
----------------|-----------|-----------|-----------|
#14個FP
#模型準確度為(TN+TP)/35=60% 有待改善
##########模型改進
##嘗試改變k值!!