R机器学习之一:kNN算法案例

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值!!

参考文献

http://www.analyticsvidhya.com/blog/2015/08/learning-concept-knn-algorithms-programming/

你可能感兴趣的:(机器学习,knn)