写在前面:
分类是管理学、金融学、统计学等常用的实证分析方法之一,目前,分类的方法有逻辑回归、支持向量机、贝叶斯分类、决策树、支持向量机、卷积神经网络、线性判别分类器等等。
方法有很多,不同的方法适用于不同的环境,其难易度也不同。目前最最常见的分类器应该是逻辑回归。此处对硕士论文常见的逻辑回归和支持向量机模型进行实例分析,讲述在R语言中的建模过程与结果。
在开始建模前,首先说一下,为什么拿这两个模型进行对比,逻辑回归不仅可以输出结果还可以输出其对应的概率。
拟合出来的参数可以清晰地看到每一个特征对结果的影响。但是本质上是一个线性分类器,特征之间相关度高时不适用。同时异常值对拟合结果影响巨大。但是SVM不存在这种问题,SVM通过核方法的映射避免了非线性及异常值的影响,从而达到了比逻辑回归的精度更高的目标。
但是其问题也有,即模型运算慢,少量数据通过SVM模型可以达到理想的结果,但是对于大量数据来说,他的运行速度太漫长,所以逻辑回归的应用更广泛。
01 数据集介绍
1936年费希尔收集了三种鸢尾花(分别标记为setosa(山鸢尾)、versicolor(变色鸢尾)和virginica(维吉尼亚鸢尾))的花萼和花瓣数据。包括花萼的长度和宽度,以及花瓣的长度和宽度。改数据包为iris,共包含150条数据。
我们将根据这四个特征来建立支持向量机模型从而实现对鸢尾花的分类判别任务。
如下图所示:iris数据集中更有三种品种的鸢尾,蓝色为山鸢尾、粉色为变色鸢尾,绿色为维吉尼亚鸢尾。
其中山鸢尾和其他两个品种的鸢尾在花瓣的长度和宽度上具有显著的差异,而变色鸢尾和维吉尼亚鸢尾并没有特别明显的界限。
为了方便大家理解,这里不进行多分类,只进行二分类。而山鸢尾与其他品种鸢尾的差异明显,如果选取山鸢尾和非山鸢尾进行分类预测,那么我们无法比较逻辑回归和SVM的精度的区别。
变色鸢尾的花瓣长与宽度在其他两种鸢尾花瓣特征的中间,如果选取变色鸢尾和非变色鸢尾进行分类,则逻辑回归无法进行。
所以本文选取virginica(维吉尼亚鸢尾)作为评判,进行非维吉尼亚鸢尾(赋值为0)和维吉尼亚鸢尾(赋值为1)的分类。
初始设置:
set.seed(1)
is = sample(1:150)#将1到150随机打乱。
z = iris[is,]#将iris原本按分类排序的数据改为按照is里的顺序一一排序。
head(z)#查看前六行数据。
is.virginica = (z$Species =='virginica')#因为是三类品种,这里我们进行二分类的话,要将是virginica的视作TRUE,将其他品种视作FLASE。
z$Species = as.numeric(is.virginica)#将TRUE和FLASE转变为数值型1和0。
x = z[1:100,] #选取随机排序后数据的前100条作为训练集。
testset = z[101:150,] #选取后50条数据作为测试集。
y = testset[,1:4]#提取出测试集前四列的特征(花萼长、宽和花瓣的长、宽)作为预测时的输入。
real= testset[,5]#提取测试集真实的分类结果。
02 逻辑回归分类预测
fit=glm(Species~.,data=x,family=binomial(logit))#进行逻辑回归的拟合。
pred=predict(fit,newdata=y,type='response')#获得逻辑回归的拟合模型后利用前面准备好的测试集的前四列特征进行预测。
y.hat = as.numeric(pred > .5)#由于glm模型输出的为连续数值而非0,1,所以将其进行0,1分类。
cbind(y.hat, real)#展示后50条特征的预测结果与实际结果。
y.hat real
[14,] 0 1
[43,] 0 1
#从上述输出结果可以看出第14和第43条的结果的预测值和真实值有差异。(由于数据长,这里只展现预测错误的数据)
res=table(y.hat, real)#通过田字表观察一共几个出现了差异。
res
#上述输出说明有两个值原始结果是赋值为1,预测结果却赋值为0,存在差异。
accurary=sum(diag(res))/sum(res)#通过上述田子表测算精确度
accurary
[1] 0.96
#精确度为96%,说明50个数据中有48个成功预测,有两个预测失败。
03 支持向量机分类
library(e1071)#svm模型必须用的包
fit= svm(Species~.,data=x)#拟合SVM模型
pred = predict(fit, newdata=y)#预测
y.hat = as.numeric(pred > .5)#赋值
cbind(y.hat, real)#对比结果
y.hat real
[14,] 0 1
#由预测值和真实值的对比可以发现,只有第14个出现了预测和真实值的差异(由于数据长,这里只展现预测错误的数据)
res=table(y.hat, real)
res
accurary=sum(diag(res))/sum(res)
accurary
[1] 0.98
#预测精度98%,50个预测值中只有一个预测错误。
04 总结
在本文的分类预测中,SVM模型的预测精度略胜一筹。