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/