1 数据
以R中自带的鸢尾花数据集为例,根据花瓣、萼片的长宽来预测植物类别!
> data(iris)
> iris
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
说明:iris是R自带的数据,Species是鸢尾花的种类,Sepal.Length Sepal.Width Petal.Length Petal.Width分别是萼片、花瓣的长和宽。
2 划分训练集和测试集
> dim(iris)
[1] 150 5
> n=dim(iris)[1]
> sp=sample(1:n,size=round(n*0.3),replace=FALSE) # 随机抽取30%的数据
> iris_train=iris[-sp,] # 70%作为训练集
> iris_test=iris[sp,] # 30%作为测试集
3 采用Adaboost模型进行分类
3.1 Breiman算法
训练模型:
> install.packages("adabag")
> library(adabag)
> fit_boost=boosting(Species~., iris_train, mfinal = 100, coeflearn = "Breiman")
预测:
> pdt=predict(fit_boost,iris_test)
> sum(pdt$class==iris_test$Species)/dim(iris_test)[1]
[1] 0.9111111
> table(pdt$class,iris_test$Species)
setosa versicolor virginica
setosa 15 0 0
versicolor 0 13 4
virginica 0 0 13
说明:coeflearn = "Breiman"或coeflearn = "Freund"表明使用M1算法
3.2 SAMME算法
训练模型:
> fit_boost1=boosting(Species~., iris_train, mfinal = 500, coeflearn = "Zhu")
预测:
> pdt1=predict(fit_boost1,iris_test)
> sum(pdt1$class==iris_test$Species)/dim(iris_test)[1]
[1] 0.9111111
> table(pdt1$class,iris_test$Species)
setosa versicolor virginica
setosa 15 0 0
versicolor 0 13 4
virginica 0 0 13
说明:coeflearn = "Zhu"表明使用SAMME算法,可以发现采用SAMME算法,并增加迭代次数后,分类精度并没有得到提升。