10.集成学习

#####10 集成学习#####
#集成学习是近年来机器学习领域中的研究热点之一。经典的两个集成算法是Bagging和
#AdaBoost,它们分别以某种巧妙的方式将若干基分类器的预测结果进行综合,已达到显
#著提示分类效果的目的。

#####10.2.2 核心函数#####
#1. bagging函数
#bagging(formula,data,mfinal=100,control)
#formula表示用于建模的公式,格式为y~x1+x2+x3;data中放置待训数据集;mfinal表示
#算法的迭代次数,即基分类器的个数,可设置为任意整数,缺失值为100;这里的
#control参数与rpart()函数中的相同,用于控制基分类器的参数。

#2. boosting函数
#函数boosting()中的Adaboost算法以分类树为基分类器,其基本格式为
#boosting(formula,data,boos=TRUE,mfinal=100,coeflearn='Breiman',control)
#其中formula、data、mfinal及control参数与bagging()中完全相同,不再解释;boos参数
#用于选择在当下的迭代过程中,是否用各种观测样本的相应权重来抽取boostrap样本,其默
#认值为TRUE,如果取FALSE,则每个观测样本的相应权重在迭代过程中被使用;coeflearn用
#于选择权重更新系数alpha的计算方式,默认取Breiman,即alpha=1/2ln((1-err)/err),另外
#也可更改设置为"Freund"或"Zhu"。

#####10.2.3 数据集#####
#本章使用UCI Machine Learning Repository数据库中的Bank Marketing数据集,该数据集来
#自于某葡萄牙银行机构的一个基于电话跟踪的商业营销项目,其中收录了包括银行客户个人
#信息及与电话跟踪咨询结果有关的16个自变量,以及1个因变量——该客户是否订阅了银行的定
#期存款。http://archive.ics.uci.edu/ml/datasets/Bank+Marketing

setwd("E://books/数据挖掘 R语言实战/bank")      #设置路径
data=read.csv("bank.csv", header=TRUE, sep=";") #读取bank.csv数据文件
dim(data)
head(data)
summary(data)

#各变量的详细信息
# age    年龄               数值   17至87
#                                  admin.行政;unknown未知;unemployed失业;management管理;housemaid客房服务;entrepreneur企业家;
# job    工作类型           分类   student学生;blue-collar体力劳动者;self-emploted个体;retried退休;technician技术人员;
#                                  services服务业。
# marital 婚姻状况          分类   married已婚;divorced离婚或丧偶;single单身;
# education教育程度         分类   unknown未知,secondary中学;primary小学;tertiary大学
# default 是否无信用违约    二分   yes是;no否;
# balance 年均余额(欧元)    数值   -3313至71188
# housing 是否有房贷        二分   yes是;no否
# loan    是否有个人贷款    二分   yes是;no否
# contact 联系方式          分类   unknown未知;telephone固定电话;cellular移动电话
# day     最后一次联系的日期 数值   1至31
# month   最近一次联系的月份 分类   jan一月;feb二月...dec十二月
# duration最近一次联系的持续时间 数值  4至3025(秒)
# compaign该次项目中练习总次数   数值    1至50
# pdays   最近一次联系距今的日数 数值 -1未联系过;1至871
#previous 该次项目之前联系的总次数 数值 0至25
# y       是否订阅银行的定期存款 二分  yes是;no否

#使用数据集1/4的样本作为测试集
sub=sample(1:nrow(data), round(nrow(data)/4)) #随机抽取data四分之一样本的序号
length(sub)                                   #显示sub中存有的样本序号个数
data_train=data[-sub,]                        #将不包含于sub中的数据构造为训练集
data_test=data[sub,]                          #将包含于sub中的数据构造为测试集
dim(data_train);dim(data_test)

#####10.3 应用案例#####
#下面我们分别使用bagging与boosting函数来实现相应的算法

#####10.3.1 Bagging算法#####
library(adabag)
library(rpart)

#1. 对训练集data_train运行Bagging算法
bag = bagging(y~.,data_train,mfinal=5)  #使用bagging()函数建模,迭代过程中生成5颗决策树
names(bag)                            #显示模型bag所生成的输出项名称
bag$formula                           #模型bag构建所依据的公式
bag$trees[2]                          #模型bag中第二课决策树的构成
bag$votes[105:115,]                   #模型bag中第105至第115个样本的投票情况
bag$prob[105:115,]                    #模型bag中第105至第115个样本被预测为各类别的概率
bag$class[105:115]                    #模型bag中第105至第115个样本的预测值
#第六项为5次迭代过程中所使用的boostrap样本
bag$samples[105:115,]                 #模型bag中第105次至115个样本在5次迭代过程中的抽样情况
#第七项为各输入变量在分类过程中的相对重要性,并绘制其中前10个变量重要程度的条形图
bag$importance                        #模型bag中各输入变量的相对重要性

#用control参数中的深度maxdepth来控制基分类树的大小
bag1=bagging(y~.,data_train,mfinal=5,control=rpart.control(maxdepth=3))#通过control参数控制基分类树的复杂度
bag1$trees[2]

#2. 对测试集data_test的目标变量进行预测
pre_bag=predict(bag,data_test) #使用bag模型对测试集中目标变量的取值进行预测,记为pre_bag
names(pre_bag)                 #显示预测结果的输出项名称
pre_bag$votes[1:10,]           #预测结果pre_bag中前10个样本的投票情况
pre_bag$prob[1:10,]            #模型bag中前10个样本被预测为各类别的概率
pre_bag$class[1:10]            #测试集各样本的预测类别
#混淆矩阵confusion和预测误差error给出了预测结果的初步分析。不平衡数据
pre_bag$confusion              #测试集预测结果的混淆矩阵
pre_bag$error                  #测试集预测错误率

#我们查看测试集中少数类"yes"和多数类"no"的样本数各为多少,并计算过程中的变量用于后续两类
#别各自错误率的计算
sub_minor=which(data_test$y=="yes") #取少数类"yes"在测试集中的编号
sub_major=which(data_test$y=="no")  #取多数类"no"在测试集中的编号
length(sub_minor);length(sub_major) #查看多数类和少数类的个数
#下面我们分别计算出测试总体的预测错误率,以及两类各自的正确率
err_bag=sum(pre_bag$class!=data_test$y)/nrow(data_test)#计算总体错误率
err_minor_bag=sum(pre_bag$class[sub_minor]!=data_test$y[sub_minor])/length(sub_minor)
                                    #计算少数类"yes"的错误率err_minor_bag
err_major_bag=sum(pre_bag$class[sub_major]!=data_test$y[sub_major])/length(sub_major)
                                    #计算多数类"no"的错误率err_minor_bag                                   
err_bag;err_minor_bag;err_major_bag
#我们看到少数类的错误率高达0.637,多数类的错误率仅为0.0382。这正是由于数据的不平衡性造成的

#####10.3.2 Adaboost算法#####
boo=boosting(y~.,data_train,mfinal=5)   #建立Adaboost模型
pre_boo=predict(boo,data_test)
err_boo=sum(pre_boo$class!=data_test$y)/nrow(data_test)#计算总体错误率
err_minor_boo=sum(pre_boo$class[sub_minor]!=data_test$y[sub_minor])/length(sub_minor)
#计算少数类"yes"的错误率err_minor_bag
err_major_boo=sum(pre_boo$class[sub_major]!=data_test$y[sub_major])/length(sub_major)
#计算多数类"no"的错误率err_minor_bag 
err_boo;err_minor_boo;err_major_boo
#书上少数类的预测错误率相对有所提升,这里没有




猜你喜欢

转载自blog.csdn.net/qq_39124646/article/details/83214743
10.