R与数据挖掘(学习决策树和随机森林的R语句)
更新时间:2023-03-11 15:51:01 阅读量: 教育文库 文档下载
- 数据挖掘决策树实验报告推荐度:
- 相关推荐
数据挖掘报告
1
乳腺癌的分析
摘要
此次实验的目的主要是研究分类,对乳腺癌的类型良性的还是恶性的进行分类。比较一下什么方法更好。数据共包括699个观测值,每个观测有11个变量。有缺失值。主要是运用了R和SAS两个软件进行分析的。R中用的方法都是数据挖掘中的一些典型方法。SAS中是采用了判别与聚类的方法。原始数据已经将类别分好了,对于分类研究使用不同的方法看一下哪种方法的精度更高。
关键词:数据挖掘方法、判别、聚类
2
一 数据的描述:
a)一共有699个观测,11个变量。
b)变量解释:
\
\肿块的密度 取值1-10 \细胞的大小均匀度 取值1-10 \细胞的形状的均匀度 取值1-10
\边缘部分的黏着度 取值1-10 \单一的上皮细胞的大小 取值1-10 \裸露细胞核 取值1-10 \染色质 取值1-10
\正常的细胞核 取值1-10
\有丝分裂 取值1-10 \类型 2-良性,4-恶性 c)数据是共有16个缺失值的,在\这个变量中
d)对缺失值的处理共采用了三种方法:直接删除、利用均值进行插补、利用中 位数进行插补。
e)后面采用的方法最基本的数据是采用了中位数的方法进行差补以后的。
二 R语言采用的方法介绍共5种方法
(决策树,神经网络,支持向量机,随机森林,最近邻方法) A) 数据的基本处理
1)读入txt格式数据,将btype设为分类变量 breast_cancer <- read.delim(\ breast_cancer$btype <- factor(breast_cancer$btype);
2) 显示16个缺失值所在的行数
which(complete.cases(breast_cancer) == F);
[1] 24 41 140 146 159 165 236 250 276 293 295 298 316 322 412 618
3)缺失值的处理方法 a)直接删除
breast_cancer_delete <- na.omit(breast_cancer); b)均值进行差补
breast_cancer_mean <- breast_cancer;
for (r in which(!complete.cases(breast_cancer))) {
breast_cancer_mean[r, which(is.na(breast_cancer[r, ]))] <-
apply(data.frame(breast_cancer[, which(is.na(breast_cancer[r, ]))]), 2, mean, na.rm = T); }
c)中位数进行插补
breast_cancer_median <- breast_cancer;
for (r in which(!complete.cases(breast_cancer)))
3
breast_cancer_median[r, which(is.na(breast_cancer[r, ]))] <-
apply(data.frame(breast_cancer[, which(is.na(breast_cancer[r, ]))]), 2, median, na.rm = T);
B)方法介绍
1)分类树 使用的包rpart 、rpart.plot
a)使用中位数填补后的数据进行建模分析以及分析判错率
#分类树,请先安装rpart程序包 library(rpart); set.seed(100);
breast.part <- rpart(factor(btype) ~ ., data = breast_cancer_median, method=\table = table(predict(breast.part,breast_cancer_median,type=\breast_cancer_median$btype); # 计算错判率
pError=1 - sum(diag(table))/nrow(breast_cancer_median); cat(\分类的错判率pError为:\
分类的错判率pError为: 0.03576538
# 画图,请先安装rpart.plot程序包 library(rpart.plot);
rpart.plot(breast.part); # 画出分类树结果
4
plotcp(breast.part,minline = TRUE); # 交叉验证错误率与分类树节点数的
关系
(??)
plot(breast.part,uniform=T,branch=0.4,compress=T); text(breast.part,use.n=T);
# 带频数的结果图
5
printcp(breast.part); # 查看这棵树的复杂性参量表
CP nsplit rel error xerror
交叉验证错误率 叶节点数减一
预测误差
xstd 0.052142
0.031415 0.026924 0.026071 0.026071
1 2 3 4 5 0.780083 0.053942 0.024896 0.012448 0.010000 0 1 2 3 6 1.00000 0.21992 0.16598 0.14108 0.10373 1.00000 0.26141 0.18672 0.17427 0.17427
误差原则:
参考文献
6
# 剪枝
breast.part2 <- prune(breast.part, cp = 0.016);
rpart.plot(breast.part2); # 剪枝以后的分类树图
b)进行交叉验证:由于数据的观测并不是太大(699)采取3折交叉验证 n = 699; zz1 = 1:n;
zz2 = rep(1:3, ceiling(699/3))[1:n]; set.seed(100); zz2 = sample(zz2, n); nmse = list(NULL, NULL); c <- breast_cancer_median; for (i in 1:3) {
data.train = c[-c(which(zz2 == i)), ]; data.test = c[c(zz2 == i), ];
d.train <- rpart(factor(btype) ~ ., data = data.train, method=\
table1 = table(predict(d.train, data.train, type = \ table2 = table(predict(d.train, data.test , type = \ nmse[[1]][i] = 1 - sum(diag(table1))/nrow(data.train); nmse[[2]][i] = 1 - sum(diag(table2))/sum(table2); cat(\第\折:\ cat(\训练集错误率:\
cat(\测试集错误率:\}
NMSE = array();
NMSE[1] = sum(nmse[[1]])/3; NMSE[2] = sum(nmse[[2]])/3;
cat(\训练集上的平均错误率为:\cat(\测试集上的平均错误率为:\
7
结果:
rpart method第 1 折:
训练集错误率: 0.04935622 测试集错误率: 0.05579399
rpart method第 2 折:
训练集错误率: 0.03433476 测试集错误率: 0.05150215
rpart method第 3 折:
训练集错误率: 0.04077253 测试集错误率: 0.04291845
rpart method训练集上的平均错误率为: 0.04148784
rpart method测试集上的平均错误率为: 0.05007153
2)神经网络 使用的包有nnet
a)使用中位数填补后的数据进行建模分析以及分析判错率 # 请先安装nnet程序包 library(nnet);
a <- nnet(factor(btype) ~ ., data = breast_cancer_median, size = 6, rang = 0.1, decay = 5e-4, maxit = 1000);
a.predict <- predict(a, data = breast_cancer_median, type = 'class'); table=table(a.predict, breast_cancer_median$btype);
# 计算错判率
pError=1 - sum(diag(table))/nrow(breast_cancer_median); cat(\分类的错判率pError为:\
结果显示全部判断正确 a.predict 2 4 2 458 0 4 0 241
nnet分类的错判率pError为: 0
b)使用三折交叉验证
n = 699; zz1 = 1:n;
zz2 = rep(1:3, ceiling(699/3))[1:n]; set.seed(100); zz2 = sample(zz2, n); nmse = list(NULL, NULL); c <- breast_cancer_median; for (i in 1:3) {
data.train = c[-c(which(zz2 == i)), ]; data.test = c[c(zz2 == i), ];
8
d.train <- nnet(factor(btype)~., data = data.train, size = 6, rang = 0.1, decay = 5e-4, maxit = 1000);
table1 = table(predict(d.train, data.train, type = \ table2 = table(predict(d.train, data.test, type = \ nmse[[1]][i] = 1 - sum(diag(table1))/nrow(data.train); nmse[[2]][i] = 1 - sum(diag(table2))/sum(table2); cat(\第\折:\
cat(\第\折训练集的错误率为:\
cat(\第\折测试集的错误率为:\}
NMSE = array();
NMSE[1] = sum(nmse[[1]])/3; NMSE[2] = sum(nmse[[2]])/3;
cat(\训练集上的平均错误率为:\cat(\测试集上的平均错误率为:\
结果:
nnet method第 1 折:
第 1 折训练集的错误率为: 0
第 1 折测试集的错误率为: 0.05150215
nnet method第 2 折:
第 2 折训练集的错误率为: 0.002145923 第 2 折测试集的错误率为: 0.08583691
nnet method第 3 折:
第 3 折训练集的错误率为: 0
第 3 折测试集的错误率为: 0.03862661
nnet method训练集上的平均错误率为: 0.0007153076 nnet method测试集上的平均错误率为: 0.05865522
3)支持向量机 使用的包有e1071,ggplot
a)ggplot这个包画图的功能很强大,就是可以使图输出到pdf,等好多形式的输出
可以拿出任意两个变量来画图给个直观的印象那个变量对分类影响较明显,例如使用一下两个变量来看,这里之举一个看。
# 绘制以bare_nuclei为横轴频数为中轴的直方图,请先安装ggplot2程序包 library(ggplot2); # 载入绘图函数报
c6 <- qplot(bare_nuclei, data = breast_cancer_median, colour = factor(btype)); ggsave(\ # 将图保存为PDF格式
9
b)使用中位数填补后的数据进行建模分析以及分析判错率
#请先安装e1071程序包 library(e1071);
s <- svm(factor(btype)~., data = breast_cancer_median); pre = predict(s, breast_cancer_median, type = 'class'); plot(pre ~ breast_cancer_median$btype);
table = table(pre, breast_cancer_median$btype); table; # 计算错判率
error <- 1 - sum(diag(table))/nrow(breast_cancer_median); cat(\分类的错判率error为:\
结果:
pre 2 4 2 446 5 4 12 236
SVM分类的错判率error为: 0.02432046
10
c)3折交叉验证的结果
n = 699; zz1 = 1:n;
zz2 = rep(1:3, ceiling(699/3))[1:n]; set.seed(100); zz2 = sample(zz2, n); nmse = list(NULL, NULL); c <- breast_cancer_median; for (i in 1:3) {
data.train = c[-c(which(zz2 == i)), ]; data.test = c[c(zz2 == i), ];
d.train <- svm(factor(btype)~., data = data.train);
table1 = table(predict(d.train, data.train, type = \ table2 = table(predict(d.train, data.test, type = \ nmse[[1]][i] = 1 - sum(diag(table1))/nrow(data.train); nmse[[2]][i] = 1 - sum(diag(table2))/sum(table2); cat(\第\折:\
11
cat(\训练集的错误率为:\
cat(\测试集的错误率为:\}
NMSE = array();
NMSE[1] = sum(nmse[[1]])/3; NMSE[2] = sum(nmse[[2]])/3;
cat(\训练集上的平均错误率为:\cat(\测试集上的平均错误率为:\
结果:
svm method第 1 折:
训练集的错误率为: 0.02575107 测试集的错误率为: 0.03433476
svm method第 2 折:
训练集的错误率为: 0.027897 测试集的错误率为: 0.04291845
svm method第 3 折:
训练集的错误率为: 0.02145923 测试集的错误率为: 0.03862661
svm method训练集上的平均错误率为: 0.02503577 svm method测试集上的平均错误率为: 0.03862661
4)随机森林方法 使用的包randomForest
a) 使用中位数填补后的数据进行建模分析并输出变量的重要性
#请先安装randomForest程序包 library(randomForest);
r.breast <- randomForest(factor(btype) ~ ., data = breast_cancer_median, ntree = 2000, importance = T, replace = TRUE, keep.inbag = TRUE, norm.votes=FALSE, oob.times=TRUE, proximity=T); r.breast;
summary(r.breast);
imp <- importance(r.breast); imp;
impvar <- imp[order(imp[, 3], decreasing = TRUE), ]; impvar; varImpPlot(r.breast);
getTree(r.breast, k = 1, labelVar = FALSE);
12
结果:
Confusion matrix: 2 4 class.error 2 446 12 0.02620087 4 9 232 0.03734440
2 4
MeanDecreaseAccuracy 重要性 bare_nuclei 2.3098674 3.9670653 2.2676480 uniformity_cell_size 1.8742531 2.7070189 1.9318088 clump_thickness 1.8751611 3.5029239 1.9280315 bland_chromatin 1.1095789 3.0180401 1.8088237 uniformity_cell_shape 1.2252772 2.8570378 1.7930345 normal_nucleoli 1.6026017 1.8652728 1.4735789 marginal_adhesion 0.9889558 2.0822943 1.3521871 single_epithelialcell_size 1.1464565 1.0688383 1.0714372 mitoses 1.0574280
0.9529673 0.9765416
以图示显示变量的重要性
13
b)使用三折交叉验证的结果
n = 699; zz1 = 1:n;
zz2 = rep(1:3, ceiling(699/3))[1:n]; set.seed(100); zz2 = sample(zz2, n); nmse = list(NULL, NULL); c <- breast_cancer_median; for (i in 1:3) {
data.train = c[-c(which(zz2 == i)), ]; data.test = c[c(zz2 == i), ];
d.train <- randomForest(factor(btype) ~ ., data = data.train, ntree = 2000, importance = T, replace = TRUE, keep.inbag = TRUE, norm.votes=FALSE, oob.times=TRUE, proximity=T);
table1 = table(predict(d.train, data.train, type = \ table2 = table(predict(d.train, data.test, type = \ nmse[[1]][i] = 1 - sum(diag(table1))/nrow(data.train); nmse[[2]][i] = 1 - sum(diag(table2))/sum(table2); cat(\第\折:\ cat(\训练集的错误率为:\
cat(\测试集的错误率为:\}
NMSE = array();
NMSE[1] = sum(nmse[[1]])/3; NMSE[2] = sum(nmse[[2]])/3;
cat(\训练集上的平均错误率为:\cat(\测试集上的平均错误率为:\
结果:
randomForest method第 1 折: 训练集的错误率为: 0
测试集的错误率为: 0.02575107
randomForest method第 2 折: 训练集的错误率为: 0
测试集的错误率为: 0.04291845
randomForest method第 3 折: 训练集的错误率为: 0
测试集的错误率为: 0.03433476
randomForest method训练集上的平均错误率为: 0
randomForest method测试集上的平均错误率为: 0.03433476
14
5)最近邻方法 用到的包有kknn
a)通过循环,以第一折测试集上的正确率最好为准则,选择k值。 library(igraph); library(kknn); corr = array();
m = 699; zz1 = 1:m;
zz2 = rep(1:3, ceiling(699/3))[1:m]; set.seed(100); zz2 = sample(zz2, m); data.test = breast_cancer_median[zz2 == 3, ];
data.train = breast_cancer_median[-c(which(zz2 == 3)), ]; for (i in 7:100) {
a = kknn(factor(btype) ~ ., test = data.test, train = data.train, k = i); table = table(data.test$btype, a$fit); corr[i] = sum(diag(table))/sum(table); }
plot(0, 0.3, xlim = c(6, 100), ylim = c(0.5, 1), ylab = \正确率\for(i in 7:100)
points(i,corr[[i]]); identify(corr);
结果显示k取11时正确率最高。
15
b)接下来是交叉验证的结果
# 3折交叉验证,k取11
n = 699; zz1 = 1:n; # zz1为所有观测值(行)的下标
zz2 = rep(1:3, ceiling(699/3))[1:n]; set.seed(100); zz2 = sample(zz2, n); # 将样本随机分成三份,用zz2标记分到哪一份 nmse = list(NULL, NULL);
c <- breast_cancer_median; # 为了代码简洁将原来的数据赋值给c for (i in 1:3) {
data.train = c[-c(which(zz2 == i)), ]; # 训练集 data.test = c[c(zz2 == i), ]; # 测试集
d.train <- kknn(factor(btype)~., test = data.train, train = data.train, k = 11); # 训练结果
d.test <- kknn(factor(btype)~., test = data.test, train = data.train, k = 11); # 训练结果
table1 = table(predict(d.train, data.train, type = \ # 训练集混淆矩阵
table2 = table(predict(d.test , data.test, type = \ # 测试集混淆矩阵
nmse[[1]][i] = 1 - sum(diag(table1))/nrow(data.train); # 训练集错误率 nmse[[2]][i] = 1 - sum(diag(table2))/sum(table2); # 测试集错误率 cat(\第\折:\
cat(\训练集的错误率为:\
cat(\测试集的错误率为:\}
NMSE = array();
NMSE[1] = sum(nmse[[1]])/3; # 训练集平均错误率 NMSE[2] = sum(nmse[[2]])/3; # 测试集平均错误率
cat(\训练集上的平均错误率为:\cat(\测试集上的平均错误率为:\
结果:kknn method第 1 折: 训练集的错误率为: 0.01502146 测试集的错误率为: 0.03433476
kknn method第 2 折:
训练集的错误率为: 0.01287554 测试集的错误率为: 0.06008584
kknn method第 3 折:
训练集的错误率为: 0.01072961
16
测试集的错误率为: 0.0472103
knn method训练集上的平均错误率为: 0.01287554 knn method测试集上的平均错误率为: 0.0472103
C)方法比较
可以看出随机森林在训练集和测试集的效果都是最好的。
17
正在阅读:
大树的自述作文350字06-20
百变妈妈作文300字07-02
2014高考高中物理实验操作总复习06-26
威海市二轻职工医院招聘试题及解析05-28
汽车产业与大国崛起04-06
人教版一年级下册语文各单元知识点归纳06-17
ANSYS错误集锦 李05-24
中国古诗古训法语翻译01-25
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 数据挖掘
- 语句
- 决策
- 随机
- 森林
- 学习
- 非公党建推进会书面交流材料汇编
- 业务合并的会计处理
- CFOP(傻瓜都会很快掌握的最佳学习方法)
- 动态面板数据分析步骤详解
- 2016年试验员考试试题及答案
- 施工生产计划和统计报表管理制度(6)
- 高一人教版英语必修三课时作业:Unit 2 Healthy eating(2)
- 北邮模电综合实验报告--简易声光控照明系统的设计与实现 - 图文
- 09氯碱论坛参会名录
- 快速道路工程主要工程项目的施工方案
- 《管理运筹学》第三版案例题解
- 干部作风突出问题集中整治问题清单 新版 可以编辑版
- 幼儿园舞蹈老师工作总结
- MTBE甲基叔丁基醚
- 船舶电气2
- 杜郎口肥皂泡的破灭李炳亭是个大骗子
- 长郡中学实验班选拔考试试卷(英语)
- 2003版山东省建筑工程消耗量定额
- 五年级语文上学期课外阅读专项 新人教版
- 苏州大学有机化学实验-苯甲酸乙酯的制备