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

本文来源:https://www.bwwdw.com/article/h3ww.html

Top