1 目的
利用机器学习根据样本特征自动识别癌细胞,提高检测过程的效率,并尝试改进算法提高模型性能。
2 数据来源
该演示数据来源于: 机器学习和智能系统中心
3 案例演示
3.1 数据读取及预处理
1. 读取数据并查看数据类型
运行代码:
1. data<-read.csv("G:\\wisc_bc_data.csv",stringsAsFactors = FALSE) #读取数据 2. str(data) #查看数据类型
部分结果展示:
'data.frame': 569 obs. of 32 variables: $ id : int 87139402 8910251 905520 868871 9012568 906539 925291 87880 862989 89827 ... $ diagnosis : chr "B" "B" "B" "B" ... $ radius_mean : num 12.3 10.6 11 11.3 15.2 ... $ texture_mean : num 12.4 18.9 16.8 13.4 13.2 ... $ perimeter_mean : num 78.8 69.3 70.9 73 97.7 ... $ area_mean : num 464 346 373 385 712 ... $ smoothness_mean : num 0.1028 0.0969 0.1077 0.1164 0.0796 ... $ compactness_mean : num 0.0698 0.1147 0.078 0.1136 0.0693 ... $ concavity_mean : num 0.0399 0.0639 0.0305 0.0464 0.0339 ... $ points_mean : num 0.037 0.0264 0.0248 0.048 0.0266 ... $ symmetry_mean : num 0.196 0.192 0.171 0.177 0.172 ... $ dimension_mean : num 0.0595 0.0649 0.0634 0.0607 0.0554 ... $ radius_se : num 0.236 0.451 0.197 0.338 0.178 ... $ texture_se : num 0.666 1.197 1.387 1.343 0.412 ... $ perimeter_se : num 1.67 3.43 1.34 1.85 1.34 ... $ area_se : num 17.4 27.1 13.5 26.3 17.7 ... $ smoothness_se : num 0.00805 0.00747 0.00516 0.01127 0.00501 ... $ compactness_se : num 0.0118 0.03581 0.00936 0.03498 0.01485 ... $ concavity_se : num 0.0168 0.0335 0.0106 0.0219 0.0155 ... $ points_se : num 0.01241 0.01365 0.00748 0.01965 0.00915 ... $ symmetry_se : num 0.0192 0.035 0.0172 0.0158 0.0165 ... $ dimension_se : num 0.00225 0.00332 0.0022 0.00344 0.00177 ... $ radius_worst : num 13.5 11.9 12.4 11.9 16.2 ... $ texture_worst : num 15.6 22.9 26.4 15.8 15.7 ... $ perimeter_worst : num 87 78.3 79.9 76.5 104.5 ... $ area_worst : num 549 425 471 434 819 ... $ smoothness_worst : num 0.139 0.121 0.137 0.137 0.113 ... $ compactness_worst: num 0.127 0.252 0.148 0.182 0.174 ... $ concavity_worst : num 0.1242 0.1916 0.1067 0.0867 0.1362 ... $ points_worst : num 0.0939 0.0793 0.0743 0.0861 0.0818 ... $ symmetry_worst : num 0.283 0.294 0.3 0.21 0.249 ... $ dimension_worst : num 0.0677 0.0759 0.0788 0.0678 0.0677 ...
通过运行结果我们可以较为明晰地观察到各列数据数据类型,为数据处理需要,利用stringsAsFactors= FALSE防止字符串string的列被辨认成factor。
2 .查看数据基本特征
1)良性、恶性肿块数字特征
运行代码:
1. data1<-data[-1] #剔除id特征数据 2. table(data1$diagnosis) #输出良性、恶性肿块数量特征
结果展示:
B M 357 212
由运行结果我们可以观察到,案例中良性、恶性肿块数量分别为357,212。
2)良性、恶性肿块数量占比
1. summary(data1[c("radius_mean","area_mean","smoothness_mean")]) #输出部分案例特征信息
结果展示:
radius_mean area_mean smoothness_mean Min. : 6.981 Min. : 143.5 Min. :0.05263 1st Qu.:11.700 1st Qu.: 420.3 1st Qu.:0.08637 Median :13.370 Median : 551.1 Median :0.09587 Mean :14.127 Mean : 654.9 Mean :0.09636 3rd Qu.:15.780 3rd Qu.: 782.7 3rd Qu.:0.10530 Max. :28.110 Max. :2501.0 Max. :0.16340
通过运行结果显示。我们可以发现案例样本半径、面积、光滑度的样本特征分布情况,其中样本面积范围为143.5-2501.0;样本光滑度范围为0.05-0.16。
3.2 工具函数编写
1.标准化函数编写
运行代码:
1. normalize<-function(x){ 2. return((x-min(x))/(max(x)-min(x))) 3. } #创建极大极小标准化函数 4. normalize(c(1,2,3,4,5)) #测试函数效果
2.工具函数性能测试
运行代码:
> normalize(c(1,2,3,4,5)) #测试函数效果
结果展示:
[1] 0.00 0.25 0.50 0.75 1.00
通过函数测试效果,可以看出,标准化函数编写成功。
3.3 原始数据标准化
运行代码:
1. data2<-as.data.frame(lapply(data1[2:31],normalize)) #标准化数据,并转化为数据框格式 2. summary(data2$area_mean) #输出area_mean特征
结果展示:
Min. 1st Qu. Median Mean 3rd Qu. Max. 0.0000 0.1174 0.1729 0.2169 0.2711 1.0000
4 模型建立及优化
4.1 训练集测试集划分
由于样本数据本身为随机化数据,故以前469个样本作为训练集,后100个样本作为测试集,并将这些类的标签分别存储在相应因子向量中。
运行代码:
1. data2_train<-data2[1:469,] #创建训练集 2. data2_test<-data2[470:569,] #创建测试集 3. data2_train_lables<-data1[1:469,1] #存储因子向量型训练集类标签 4. data2_test_lables<-data1[470:569,1] #存储因子向量型测试集类标签
4.2 基于数据训练模型
运行代码:
1. library("class") #加载包 2. data2_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=21) #将k值设置为21 3. library("gmodels") #加载包 4. CrossTable(x=data2_test_lables,y=data2_test_pred,prop.chisq = F)
结果展示:
data2_test_pred | |||
data2_test_lables | Benigen | Malignant | Row Total |
Benigen | 61 | 0 | 61 |
1.000 | 0 | 0.610 | |
0.968 | 0.000 | ||
0.610 | 0.000 | ||
Malignant | 2 | 37 | 39 |
0.051 | 0.949 | 0.390 | |
0.032 | 1.000 | ||
0.020 | 0.370 | ||
Column Total | 63 | 37 | 100 |
0.630 | 0.370 |
由运行结果显示:模型判断准确率达(37+61)/100=98%,其中共存在37个真阳性、2个假阴性案例。
4.3 改进模型,提高模型性能
1. 利用Z-分数标准化数据
运行代码:
1. data4<-as.data.frame(scale(data1[-1])) 2. summary(data4$area_mean) 3. data4_train<-data4[1:469,] 4. data4_test<-data4[470:569,] 5. data4_train_lables<-data1[1:469,1] 6. data4_test_lables<-data1[470:569,1] 7. data4_test_pred<-knn(train = data4_train,test = data4_test,cl<-data4_train_lables,k=21) 8. CrossTable(x=data4_test_lables,y=data4_test_pred,prop.chisq = F)
结果展示:
data4_test_pred | |||
data4_test_lables | Benigen | Malignant | Row Total |
Benigen | 61 | 0 | 61 |
1.000 | 0 | 0.610 | |
0.968 | 0.000 | ||
0.610 | 0.000 | ||
Malignant | 5 | 34 | 39 |
0.128 | 0.872 | 0.390 | |
0.076 | 1.000 | ||
0.050 | 0.340 | ||
Column Total | 66 | 34 | 100 |
0.660 | 0.340 |
由运行结果显示:模型判断准确率达(61+34)/100=95%,其中共存在34个真阳性、5个假阴性案例,相比于极大极小标准化法,模型效能相对较低。
2.测试其他k值
运行代码:
1. data5_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=1) 2. CrossTable(x=data2_test_lables,y=data5_test_pred,prop.chisq = F) #测试性能 3. data6_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=5) 4. CrossTable(x=data2_test_lables,y=data6_test_pred,prop.chisq = F) #测试性能 5. data7_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=11) 6. CrossTable(x=data2_test_lables,y=data7_test_pred,prop.chisq = F) #测试性能 7. data8_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=15) 8. CrossTable(x=data2_test_lables,y=data8_test_pred,prop.chisq = F) #测试性能 9. data9_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=21) 10. CrossTable(x=data2_test_lables,y=data9_test_pred,prop.chisq = F) #测试性能 11. data10_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=27) 12. CrossTable(x=data2_test_lables,y=data10_test_pred,prop.chisq = F) #测试性能
结果展示:
K值 | 假阴性 | 假阳性 | 错误分类的百分比(%) |
1 | 1 | 3 | 4 |
5 | 2 | 0 | 2 |
11 | 3 | 0 | 3 |
15 | 3 | 0 | 3 |
21 | 2 | 0 | 2 |
27 | 4 | 0 | 4 |
由运行结果显示,K分别取1、5、11、15、21、27,当k,取21时,模型测试得出的准确率最高,达到了98%。