机器学习方法是计算机利用已有的数据(经验),得出某种模型,并利用此模型预测未来的一种方法。常用的机器学习模型:
①决策树
②随机森林(random forest)
③支持向量机(support vector machine,SVM)
④bagging,来自bootstrap aggregating
⑤adaboost
⑥人工神经网络(artifical neural networks)
不同的机器学习模型需要使用不同的函数包,因此我们自爱建模之前要先下载安装好相应的函数包。
决策树包:rpart
随机森林包:randomForest
支持向量机包:kernlab
1、决策数分类
决策树方法,处理离散值时,称为决策树;在处理连续变量时,称为回归树。
# 设置随机种子,用于复现结果
set.seed(33)
# 加载决策树包
library(rpart)
# 抽取用于建模的数据,70%的数据集用于建模
ind<-sample(1:150,105)
# 构建决策树模型
m<-rpart(formula=Species~.,data=iris[ind,],method="class")
# 使用建立的模型进行预测
pre<-predict(m,iris[-ind,-5],type="class")
# 计算准确率
result<-sum(pre==iris$Species[-ind])/length(pre)
print(result)
2、随机森林和支持向量机
# 随机森林
library(randomForest)
r<-randomForest(Species~.,data=iris[ind,])
pred<-predict(r,iris[-ind,-5])
result<-sum(pred==iris$Species[-ind])/length(pred)
print(result)
# 支持向量机
library(kernlab)
k<-ksvm(x=Species~.,iris[ind,])
pred<-predict(k,iris[-ind,-5])
result<-sum(pred==iris$Species[-ind])/length(pred)
print(result)
大家可以自行验证预测的准确率。
3、模型的随机性
单次抽取数据集进行机器学习具有较大的随机性。比较模型的预测精度,需要进行多次训练模型并预测,得到较稳定的结果。
## 决策树
# 加载rpart包
library(rpart)
# 初始化变量,用于存储驯化中的预测精度
result1<-0
# 循环30次
for(i in 1:30){
# 随机抽取数据集,不设随机种子
ind=sample(1:150,105)
# 训练模型
r<-rpart(formula=Species~.,data=iris[ind,],method="class")
# 预测模型
pred<-predict(r,iris[-ind,-5],type="class")
# 计算并储存预测精度
result1[i]<-sum(pred==iris$Species[-ind])/length(pred)
}
# 求平均预测精度
mean(result1)
注意:运行30次仍具有一定的偶然性,每次运行的结果仍会有所不同。
其他两个模型的运行代码如下:
# 初始化变量,用于存储驯化中的预测精度
result2<-0
# 循环30次
for(i in 1:30){
# 随机抽取数据集,不设随机种子
ind=sample(1:150,105)
# 训练模型
r<-randomForest(Species~.,data=iris[ind,])
# 预测模型
pred<-predict(r,iris[-ind,-5])
# 计算并储存预测精度
result2[i]<-sum(pred==iris$Species[-ind])/length(pred)
}
# 求平均预测精度
mean(result2)
# 初始化变量,用于存储驯化中的预测精度
result3<-0
# 循环30次
for(i in 1:30){
# 随机抽取数据集,不设随机种子
ind=sample(1:150,105)
# 训练模型
k<-ksvm(Species~.,data=iris[ind,])
# 预测模型
pred<-predict(k,iris[-ind,-5])
# 计算并储存预测精度
result3[i]<-sum(pred==iris$Species[-ind])/length(pred)
}
# 求平均预测精度
mean(result3)
4、模型的比较
(1)模型的比较可以直接使用平均预测精度直接进行比较。
(2)直接比较平均预测精度虽然可以看出模型的平均水平,但难以得到模型的上下限以及稳定性等信息。
# 制作数据框
result<-data.frame(
# 精度列
precision=c(result1,result2,result3),
# 模型方法列
method=gl(n=3,k=30,labels=c('decision',"randomForest","SVM"))
)
head(result)
# 绘制箱线图
library(ggplot2)
ggplot(data=result,mapping=aes(x=method,y=precision,fill=method))+geom_boxplot()