Подход валидационного набора в R-программировании

Опубликовано: 17 Февраля, 2022

Подход с использованием набора проверки - это метод перекрестной проверки в машинном обучении. Методы перекрестной проверки часто используются для оценки производительности и точности модели машинного обучения. В подходе к набору проверки набор данных, который будет использоваться для построения модели, случайным образом делится на 2 части, а именно на набор для обучения и набор для проверки (или набор для тестирования). Модель обучается на обучающем наборе данных, и ее точность вычисляется путем прогнозирования целевой переменной для тех точек данных, которые отсутствуют во время обучения, которое является набором проверки. Весь этот процесс разделения данных, обучения модели, тестирования модели - сложная задача. Но язык R состоит из множества библиотек и встроенных функций, которые могут выполнять все задачи очень легко и эффективно.

Шаги, связанные с подходом к набору валидации

  1. Случайное разделение набора данных на определенное соотношение (обычно предпочтительнее соотношение 70-30 или 80-20)
  2. Обучение модели на обучающем наборе данных
  3. Полученная модель применяется к набору проверки.
  4. Точность модели рассчитывается по ошибке прогноза с использованием показателей производительности модели.

В этой статье обсуждается пошаговый метод реализации подхода с использованием проверочных наборов в качестве метода перекрестной проверки как для классификационных, так и для регрессионных моделей машинного обучения.

Для классификационных моделей машинного обучения

Этот тип модели машинного обучения используется, когда целевая переменная является категориальной переменной, такой как положительная, отрицательная, диабетическая, недиабетическая и т. Д. Модель предсказывает метку класса зависимой переменной. Здесь алгоритм логистической регрессии будет применяться для построения модели классификации.

Шаг 1. Загрузка набора данных и других необходимых пакетов

Before doing any exploratory or manipulation task, one must include all the required libraries and packages to use various inbuilt functions and a dataset which will make it easier to carry out the whole process.

R

# loading required packages
  
# package to perform data manipulation 
# and visualization
library(tidyverse)
  
# package to compute 
# cross - validation methods
library(caret)
  
# package Used to split the data 
# used during classification into 
# train and test subsets
library(caTools)
  
# loading package to 
# import desired dataset
library(ISLR)

 Step 2: Exploring the dataset

It is very necessary to understand the structure and dimension of the dataset as this will help in building a correct model. Also, as this is a classification model, one must know the different categories present in the target variable. 

R

# assigning the complete dataset
# Smarket to a variable
dataset <- Smarket[complete.cases(Smarket), ] 
  
# display the dataset with details 
# like column name and its data type
# along with values in each row
glimpse(dataset)
  
# checking values present
# in the Direction column 
# of the dataset
table(dataset$Direction)


Выход:

 Ряды: 1250
Колонны: 9
$ Год <dbl> 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, ...
$ Lag1 <dbl> 0,381, 0,959, 1,032, -0,623, 0,614, 0,213, 1,392, -0,403, 0,027, 1,303, 0,287, -0,498, -0,189, 0,680, 0,701, -0,562, 0,546, -1 ...
$ Lag2 <dbl> -0,192, 0,381, 0,959, 1,032, -0,623, 0,614, 0,213, 1,392, -0,403, 0,027, 1,303, 0,287, -0,498, -0,189, 0,680, 0,701, -0,562, 0 ...
$ Lag3 <dbl> -2,624, -0,192, 0,381, 0,959, 1,032, -0,623, 0,614, 0,213, 1,392, -0,403, 0,027, 1,303, 0,287, -0,498, -0,189, 0,680, 0,701, -...
$ Lag4 <dbl> -1,055, -2,624, -0,192, 0,381, 0,959, 1,032, -0,623, 0,614, 0,213, 1,392, -0,403, 0,027, 1,303, 0,287, -0,498, -0,189, 0,680, ...
$ Lag5 <dbl> 5,010, -1,055, -2,624, -0,192, 0,381, 0,959, 1,032, -0,623, 0,614, 0,213, 1,392, -0,403, 0,027, 1,303, 0,287, -0,498, -0,189, ...
Объем $ <dbl> 1.19130, 1.29650, 1.41120, 1.27600, 1.20570, 1.34910, 1.44500, 1.40780, 1.16400, 1.23260, 1.30900, 1.25800, 1.09800, 1.05310, ...
$ Сегодня <dbl> 0,959, 1,032, -0,623, 0,614, 0,213, 1,392, -0,403, 0,027, 1,303, 0,287, -0,498, -0,189, 0,680, 0,701, -0,562, 0,546, -1,747, 0 ...
$ Direction <fct> вверх, вверх, вниз, вверх, вверх, вверх, вниз, вверх, вверх, вверх, вниз, вниз, вверх, вверх, вниз, вверх, вниз, вверх, вниз, вниз, вниз, вниз, вверх , Вниз, вниз, вверх ...

> таблица (набор данных $ Direction)
Вниз до 
 602 648

Согласно приведенной выше информации, импортированный набор данных содержит 250 строк и 9 столбцов. Тип данных столбцов как <dbl> означает число с плавающей запятой двойной точности (dbl произошло от double). Целевая переменная должна иметь факторный тип данных в моделях классификации. Поскольку тип данных столбца «Направление» уже <fct>, изменять что-либо не нужно.

Более того, переменная ответа или целевая переменная является двоичной категориальной переменной (поскольку значения в столбце только Вниз и Вверх), а соотношение меток обоих классов приблизительно 1: 1 означает, что они сбалансированы. Если произойдет дисбаланс классов, как если бы пропорция меток классов была бы 1: 2, мы должны убедиться, что обе категории находятся в примерно равной пропорции. Для этого существует множество техник, например:

  • Даунсэмплинг
  • Вверх выборка
  • Гибридная выборка с использованием SMOTE и ROSE

Шаг 3. Построение модели и создание набора для проверки.

This step involves the random splitting of the dataset, developing training and validation set, and training of the model. Below is the implementation.

R

# setting seed to generate a  
# reproducible random sampling
set.seed(100)
  
# dividing the complete dataset
# into 2 parts having ratio of
# 70% and 30%
spl = sample.split(dataset$Direction, SplitRatio = 0.7)
  
# selecting that part of dataset
# which belongs to the 70% of the
# dataset divided in previous step
train = subset(dataset, spl == TRUE)
  
# selecting that part of dataset
# which belongs to the 30% of the
# dataset divided in previous step
test = subset(dataset, spl == FALSE)
  
# checking number of rows and column
# in training and testing dataset
print(dim(train))
print(dim(test))
  
# Building the model 
  
# training the model by assigning Direction column 
# as target variable and rest other columns 
# as independent variables
model_glm = glm(Direction ~ . , family = "binomial"
                data = train, maxit = 100)

Выход:

> print(dim(train))
[1] 875   9
> print(dim(test))
[1] 375   9

Шаг 4. Прогнозирование целевой переменной

Когда обучение модели завершено, пора делать прогнозы на основе невидимых данных. Здесь целевая переменная имеет только 2 возможных значения, поэтому в функции pred () желательно использовать type = response , чтобы модель предсказывала оценку вероятности целевой категориальной переменной как 0 или 1.

There is an optional step of transforming the response variable into the factor variable of 1’s and 0’s so that if the probability score of a data point is above a certain threshold, it will be treated as 1 and if below that threshold it will be treated as 0. Here, the probability cutoff is set as 0.5.  Below is the code to implement these steps

R

# predictions on the validation set
predictTest = predict(model_glm, newdata = test, 
                      type = "response")
  
# assigning the probability cutoff as 0.5
predicted_classes <- as.factor(ifelse(predictTest >= 0.5, 
                                      "Up", "Down"))

Step 5: Evaluating the accuracy of the model

The Best way to judge the accuracy of a classification machine learning model is through Confusion Matrix. This matrix gives us a numerical value which suggests how many data points are predicted correctly as well as incorrectly by taking reference with the actual values of the target variable in the testing dataset. Along with the confusion matrix, other statistical details of the model like accuracy and kappa can be calculated using the below code.

R

# generating confusion matrix and
# other detials from the  
# prediction made by the model
print(confusionMatrix(predicted_classes, test$Direction))


Выход:

 Матрица неточностей и статистика

          Ссылка
Прогнозирование вниз вверх
      Вниз 177 5
      Вверх 4 189
                                         
               Точность: 0,976          
                 95% ДИ: (0,9549, 0,989)
    Нет информации Скорость: 0,5173         
    Значение P [Acc> NIR]: <2e-16         
                                         
                  Каппа: 0,952          
                                         
 Значение P теста Макнемара: 1              
                                         
            Чувствительность: 0,9779         
            Специфичность: 0,9742         
         Pos Pred Value: 0,9725         
         Отрицательное прогнозное значение: 0,9793         
             Распространенность: 0,4827         
         Скорость обнаружения: 0,4720         
   Распространенность обнаружения: 0,4853         
      Сбалансированная точность: 0,9761         
                                         
       «Позитивный» класс: вниз                                                                                            

Для регрессионных моделей машинного обучения

Модели регрессии используются для прогнозирования количества, имеющего непрерывный характер, например, цены дома, продаж продукта и т. Д. Обычно в задаче регрессии целевая переменная представляет собой вещественное число, такое как целые числа или значения с плавающей запятой. Точность модели такого типа рассчитывается как среднее значение ошибок при прогнозировании выходных данных для различных точек данных. Ниже приведены шаги по реализации подхода с использованием набора проверки в моделях линейной регрессии.

Шаг 1. Загрузка набора данных и необходимых пакетов

R language contains a variety of datasets. Here we are using trees dataset which is an inbuilt dataset for the linear regression model. Below is the code to import the required dataset and packages to perform various operations to build the model.

R

# loading required packages 
  
# package to perform data manipulation 
# and visualization 
library(tidyverse) 
  
# package to compute 
# cross - validation methods 
library(caret) 
  
# access the data from R’s datasets package
data(trees)
  
# look at the first several rows of the data
head(trees)


Выход:

 Обхват Высота Объем
1 8,3 70 10,3
2 8,6 65 10,3
3 8,8 63 10,2
4 10,5 72 16,4
5 10,7 81 18,8
6 10,8 83 19,7

Итак, в этом наборе данных всего 3 столбца, среди которых Volume является целевой переменной. Поскольку переменная имеет непрерывный характер, для прогнозирования результата можно использовать алгоритм линейной регрессии.

Шаг 2. Построение модели и создание набора для проверки.

In this step, the model is split randomly into a ratio of 80-20. 80% of the data points will be used to train the model while 20% acts as the validation set which will give us the accuracy of the model. Below is the code for the same.

R

# reproducible random sampling 
set.seed(123)
  
# creating training data as 80% of the dataset 
random_sample <- createDataPartition(trees $ Volume,  
                                     p = 0.8, list = FALSE
  
# generating training dataset 
# from the random_sample 
training_dataset  <- trees[random_sample, ] 
  
# generating testing dataset 
# from rows which are not  
# included in random_sample 
testing_dataset <- trees[-random_sample, ] 
  
# Building the model 
  
# training the model by assigning sales column 
# as target variable and rest other columns 
# as independent variables 
model <- lm(Volume ~., data = training_dataset)

Step 3: Predict the target variable

After building and training the model, predictions of the target variable of the data points belong to the validation set will be done. 

R

# predicting the target variable 
predictions <- predict(model, testing_dataset)

Step 4: Evaluating the accuracy of the model

Statistical metrics that are used for evaluating the performance of a Linear regression model are Root Mean Square Error(RMSE), Mean Squared Error(MAE), and R2 Error. Among all R2 Error, metric makes the most accurate judgment and its value must be high for a better model. Below is the code to calculate the prediction error of the model.

R

# computing model performance metrics 
data.frame(R2 = R2(predictions, testing_dataset $ Volume), 
           RMSE = RMSE(predictions, testing_dataset $ Volume), 
           MAE = MAE(predictions, testing_dataset $ Volume))

Выход:

 R2 RMSE MAE
1 0,9564487 5,274129 4,73567

Преимущества подхода с использованием набора валидации

  • Один из самых основных и простых методов оценки модели.
  • Никаких сложных шагов для реализации.

Недостатки подхода с использованием набора валидации

  • Прогнозы, сделанные моделью, сильно зависят от подмножества наблюдений, используемых для обучения и проверки.
  • Использование только одного подмножества данных для целей обучения может сделать модель смещенной.