Цель. На этом занятии показано, как создать веб-инструмент, позволяющий пользователю выбирать подходы к классификации для набора данных Iris. Мы собираемся включить в эту версию SVM, K-среднее и иерархическую кластеризацию и добавим больше в будущем.

Введение в набор данных: ссылка

Пользовательский интерфейс:

  1. Значение по умолчанию для раскрывающегося списка - «SVM», и оно показывает, как модель классифицирует элемент на основе длины лепестка и ширины лепестка. В таблице ниже показана точность классификации. Если реальный столбец не совпадает с прогнозируемым столбцом, это означает, что модель неправильно классифицирует эти отдельные элементы.

2. Вы можете выбрать «hclust» для иерархической кластеризации или «Kmean» для метода кластеризации K-среднего.

Структура инструмента.
R Shiny включает две основные части кода: UI.R и Server.R.

  1. Пользовательский интерфейс: код пользовательского интерфейса управляет дизайном и макетом инструмента с входом и выходом на 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        
    })
})

Вот ССЫЛКА инструмента! Наслаждайся этим :)