Цель. На этом занятии показано, как создать веб-инструмент, позволяющий пользователю выбирать подходы к классификации для набора данных Iris. Мы собираемся включить в эту версию SVM, K-среднее и иерархическую кластеризацию и добавим больше в будущем.
Введение в набор данных: ссылка
Пользовательский интерфейс:
- Значение по умолчанию для раскрывающегося списка - «SVM», и оно показывает, как модель классифицирует элемент на основе длины лепестка и ширины лепестка. В таблице ниже показана точность классификации. Если реальный столбец не совпадает с прогнозируемым столбцом, это означает, что модель неправильно классифицирует эти отдельные элементы.
2. Вы можете выбрать «hclust» для иерархической кластеризации или «Kmean» для метода кластеризации K-среднего.
Структура инструмента.
R Shiny включает две основные части кода: UI.R и Server.R.
- Пользовательский интерфейс: код пользовательского интерфейса управляет дизайном и макетом инструмента с входом и выходом на Server.R.
navbarPage("IRIS", tabPanel("classification", sidebarPanel( selectInput("method", "Method:", choices=c("svm","hclust","Kmean")) ), mainPanel( plotOutput("plot1"), hr(), helpText("Accuracy:"), tableOutput("view1") ) ) )
2. Сервер: код сервера фактически запускает машинное обучение за сценой и возвращает результаты (диаграмму, таблицу и т. Д.) Обратно в интерфейс.
2.1 seleceData1: измените структуру данных, добавив столбцы setosa / virginica / versicolor, чтобы их можно было использовать для всех моделей (в будущем мы будем включать больше моделей, таких как нейронная сеть).
selectedData1 <- reactive({ iris.dataset <- iris iris.dataset$setosa <- iris.dataset$Species=="setosa" iris.dataset$virginica = iris.dataset$Species == "virginica" iris.dataset$versicolor = iris.dataset$Species == "versicolor" iris.dataset })
2.2 selectdata2. Постройте модель на основе входных данных, переданных из интерфейса. Это вернет результат файла, который будет использоваться в матрице ошибок графика и точности.
selectedData2 <- reactive({ if ( input$method == "svm") { fit <- svm(formula = Species ~ Sepal.Length+Sepal.Width+Petal.Length+Petal.Width, data = selectedData1()) } else if ( input$method == "hclust") { fit <- hclust(dist(selectedData1(), method="euclidean") , method="ward.D2") } else if ( input$method == "Kmean") { fit <- kmeans(selectedData1()[, -5] , centers=3) } fit })
2.3 output $ plot1: Это выходной график, представленный в пользовательском интерфейсе (см. mainPanel в части пользовательского интерфейса). Он использует результат модели (подходящий для selectdata2) для создания графика.
output$plot1 <- renderPlot({ fit <- selectedData2() iris <- selectedData1() if ( input$method == "svm") { plot(fit, iris, Petal.Width ~ Petal.Length, slice = list(Sepal.Width = 3, Sepal.Length = 4)) } else if ( input$method == "hclust") { par(mfrow=c(1,2)) plot( fit, xlab="euclidean") } else if ( input$method == "Kmean") { fviz_cluster(fit, data = iris[, -5] , geom = c("point"), frame.type = "norm") } })
2.4 output $ view1: Это таблица вывода, представленная в пользовательском интерфейсе (см. mainPanel в части пользовательского интерфейса). Он использует результат модели (соответствует selectdata2) для создания матрицы неточности.
output$view1 <- renderTable({ fit <- selectedData2() iris <- selectedData1() if ( input$method == "svm") { comp = predict(fit, iris) confus.matrix <- table(real=iris$Species, predict=comp ) } else if ( input$method == "hclust") { fit.update <- fit fit.update <- cutree(fit.update, k=3) fit.raw <- fit.update confus.matrix.raw <- table(fit.raw, iris$Species) for(i in 1:nrow(iris)){ if(confus.matrix.raw[1,fit.raw[i]]/50 >0.5) {fit.update[i] <- "setosa"} if(confus.matrix.raw[2,fit.raw[i]]/50 >0.5) {fit.update[i] <- "versicolor"} if(confus.matrix.raw[3,fit.raw[i]]/50 >0.5) {fit.update[i] <- "virginica"} } confus.matrix <- table(fit.update, iris$Species) } else if ( input$method == "Kmean") { fit.raw <- fit confus.matrix.raw <- table(fit.raw$cluster, iris$Species) for(i in 1:nrow(iris)){ if(confus.matrix.raw[1,fit.raw$cluster[i]]/50 >0.5) {fit$cluster[i] <- "setosa"} if(confus.matrix.raw[2,fit.raw$cluster[i]]/50 >0.5) {fit$cluster[i] <- "versicolor"} if(confus.matrix.raw[3,fit.raw$cluster[i]]/50 >0.5) {fit$cluster[i] <- "virginica"} } confus.matrix <- table(fit$cluster, iris$Species) } confus.matrix })
Полный код:
library(shiny) library(neuralnet) library(e1071) library(cluster) library(factoextra) shinyServer(function(input, output) { selectedData1 <- reactive({ iris.dataset <- iris iris.dataset$setosa <- iris.dataset$Species=="setosa" iris.dataset$virginica = iris.dataset$Species == "virginica" iris.dataset$versicolor = iris.dataset$Species == "versicolor" iris.dataset }) selectedData2 <- reactive({ if ( input$method == "svm") { fit <- svm(formula = Species ~ Sepal.Length+Sepal.Width+Petal.Length+Petal.Width, data = selectedData1()) } else if ( input$method == "hclust") { fit <- hclust(dist(selectedData1(), method="euclidean") , method="ward.D2") } else if ( input$method == "Kmean") { fit <- kmeans(selectedData1()[, -5] , centers=3) } fit }) output$plot1 <- renderPlot({ fit <- selectedData2() iris <- selectedData1() if ( input$method == "svm") { plot(fit, iris, Petal.Width ~ Petal.Length, slice = list(Sepal.Width = 3, Sepal.Length = 4)) } else if ( input$method == "hclust") { par(mfrow=c(1,2)) plot( fit, xlab="euclidean") } else if ( input$method == "Kmean") { fviz_cluster(fit, data = iris[, -5] , geom = c("point"), frame.type = "norm") } }) output$view1 <- renderTable({ fit <- selectedData2() iris <- selectedData1() if ( input$method == "svm") { comp = predict(fit, iris) confus.matrix <- table(real=iris$Species, predict=comp ) } else if ( input$method == "hclust") { fit.update <- fit fit.update <- cutree(fit.update, k=3) fit.raw <- fit.update confus.matrix.raw <- table(fit.raw, iris$Species) for(i in 1:nrow(iris)){ if(confus.matrix.raw[1,fit.raw[i]]/50 >0.5) {fit.update[i] <- "setosa"} if(confus.matrix.raw[2,fit.raw[i]]/50 >0.5) {fit.update[i] <- "versicolor"} if(confus.matrix.raw[3,fit.raw[i]]/50 >0.5) {fit.update[i] <- "virginica"} } confus.matrix <- table(fit.update, iris$Species) } else if ( input$method == "Kmean") { fit.raw <- fit confus.matrix.raw <- table(fit.raw$cluster, iris$Species) for(i in 1:nrow(iris)){ if(confus.matrix.raw[1,fit.raw$cluster[i]]/50 >0.5) {fit$cluster[i] <- "setosa"} if(confus.matrix.raw[2,fit.raw$cluster[i]]/50 >0.5) {fit$cluster[i] <- "versicolor"} if(confus.matrix.raw[3,fit.raw$cluster[i]]/50 >0.5) {fit$cluster[i] <- "virginica"} } confus.matrix <- table(fit$cluster, iris$Species) } confus.matrix }) })
Вот ССЫЛКА инструмента! Наслаждайся этим :)