Instalace balíčku s funkcí svm()
install.packages("e1071")
library(e1071)
Nejprve si vyzkoušejte na podmnožině iris dat fungování SVM klasifikátoru - příklad převzat z knihy: Yu-Wei, Chiu: Machine Learning with R Cookbook, Packt, 2015 - Book review
Načtení iris dat a jejich úprava
# načtení iris dat
data(iris)
# podmnožina dat a její vykreslení
iris.subset = subset(iris, select=c("Sepal.Length", "Sepal.Width", "Species"), Species %in% c("setosa","virginica"))
plot(x=iris.subset$Sepal.Length,y=iris.subset$Sepal.Width,col=iris.subset$Species, pch=19)
svm.model = svm(Species ~ ., data=iris.subset, kernel='linear',cost=1, scale=FALSE) plot(x=iris.subset$Sepal.Length,y=iris.subset$Sepal.Width, col=iris.subset$Species, pch=19) points(iris.subset[svm.model$index,c(1,2)],col="blue",cex=2) w = t(svm.model$coefs) %*% svm.model$SV b = -svm.model$rho abline(a=-b/w[1,2], b=-w[1,1]/w[1,2], col="red", lty=5)
Úkoly:
cost.
cost na míru přeučení algoritmu?
cost během učení klasifikátoru?
# tune tuned = tune.svm(Species ~ ., data=iris.subset, cost = 10^(1:4), gamma = 10^(-6:-1)) summary(tuned) svm.model.tuned = svm(Species ~ ., data=iris.subset, kernel='linear', cost=?, scale=FALSE) plot(x=iris.subset$Sepal.Length,y=iris.subset$Sepal.Width, col=iris.subset$Species, pch=19) points(iris.subset[svm.model.tuned$index,c(1,2)],col="blue",cex=2) w = t(svm.model.tuned$coefs) %*% svm.model.tuned$SV b = -svm.model.tuned$rho abline(a=-b/w[1,2], b=-w[1,1]/w[1,2], col="red", lty=5)
Ve druhém příkladu si ukážeme fungování klasifikátoru na datech s kruhem a jeho okolím.
Začneme přípravou dat s kruhem. Naimportujte data empty.csv jako v tomto případě kruh. Data obsahují náhodně vygenerované body ve čtverci o velikosti strany 1.
# úprava dat na kruh a jeho okolí kruh$class <- 0 #pro jistotu kruh$class[(kruh$a-0.3)^2+(kruh$b-0.5)^2<0.04] <- 1 kruh$class <- as.factor(kruh$class) plot(kruh$a, kruh$b, col=kruh$class)
Naučte SVM klasifikátor
m <- svm(class ~ ., data=kruh, kernel='radial',cost=2)
# kontingenční tabulka
table(m$fitted, kruh$class, dnn = c("m", "kruh"))
# vykreslení chybně klasifikovaných bodů
kruh.pred <- kruh[m$fitted != kruh$class,]
par(mfrow = c(1,2))
plot(kruh$a, kruh$b, col=kruh$class)
plot(kruh.pred$a, kruh.pred$b, pch=19, xlim=c(0,1), ylim=c(0,1))
Úkoly:
cost= 1,1.3,2,5 a parametr kernel=“linear”.