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/

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值