开始系统学习一下机器学习的一些知识,这个是svm(支持向量机)分类模型。
1.R包和数据
使用了数据iris,用10%作为测试集,90%作为训练集。
if(!require(e1071))install.packages("e1071")
library(e1071)
dat = iris
set.seed(12342)
od = sample(1:nrow(dat),0.9*nrow(dat))
train <- dat[od,]
test <- dat[-od,]
nrow(train)
## [1] 135
nrow(test)
## [1] 15
2.模型构建和预测
model <- svm(Species ~ ., data = train)
fp = predict(model, test[,-5])
kt = table(fp,test[,5]);kt
##
## fp setosa versicolor virginica
## setosa 4 0 0
## versicolor 0 5 1
## virginica 0 0 5
# 看正确率
sum(diag(kt))/sum(kt)
## [1] 0.9333333
这个例子直接用默认参数,正确率已经非常高了,可以不用调优了(当然也可以还是调调)。
3.搜索最优参数
tune.svm函数可以得出误差最小的参数。
cost是惩罚系数,太大导致过拟合,太小导致欠拟合,不直接用默认参数的画,可以用tune.svm找出表现最好的系数。
gamma参数在不同的kernel里用法不同,涉及到了一些细节原理就不看了。
tuned <- tune.svm(Species ~.,
data = train,
gamma = 10^(-3:-1),
cost = 10^(-1:1))
summary(tuned)
##
## Parameter tuning of 'svm':
##
## - sampling method: 10-fold cross validation
##
## - best parameters:
## gamma cost
## 0.1 10
##
## - best performance: 0.03021978
##
## - Detailed performance results:
## gamma cost error dispersion
## 1 0.001 0.1 0.65989011 0.21376773
## 2 0.010 0.1 0.50934066 0.20021339
## 3 0.100 0.1 0.12692308 0.07989422
## 4 0.001 1.0 0.51813187 0.17702297
## 5 0.010 1.0 0.11978022 0.08817117
## 6 0.100 1.0 0.03736264 0.03943475
## 7 0.001 10.0 0.11978022 0.08817117
## 8 0.010 10.0 0.04450549 0.03836985
## 9 0.100 10.0 0.03021978 0.03904580
由summary的结果可见,最好的参数是0.1和10。
4.用最优参数重新建模
model <- svm(Species ~., data = train, gamma=0.1, cost=10)
fp = predict(model, test[,-5])
kt = table(fp,test[,5]);kt
##
## fp setosa versicolor virginica
## setosa 4 0 0
## versicolor 0 5 1
## virginica 0 0 5
# 看正确率
sum(diag(kt))/sum(kt)
## [1] 0.9333333
调完还是一样的,因为默认参数做出来的模型已经挺好的了。
参考:《零基础学R语言数据分析-从机器学习、数据挖掘、文本挖掘到大数据分析》