Как разделить данные на обучающие и тестовые наборы в R (3 метода)


Часто, когда мы подгоняем алгоритмы машинного обучения к наборам данных, мы сначала разделяем набор данных на обучающий набор и тестовый набор.

В R существует три распространенных способа разделения данных на обучающие и тестовые наборы:

Метод 1: используйте базу R

#make this example reproducible
set. seed (1)

#use 70% of dataset as training set and 30% as test set
sample <- sample(c( TRUE , FALSE ), nrow(df), replace= TRUE , prob=c( 0.7 , 0.3 ))
train <- df[sample, ]
test <- df[!sample, ]

Способ 2: Используйте пакет caTools

library (caTools)

#make this example reproducible
set. seed (1)

#use 70% of dataset as training set and 30% as test set
sample <- sample.split(df$any_column_name, SplitRatio = 0.7 )
train <- subset(df, sample == TRUE )
test <- subset(df, sample == FALSE )

Способ 3: используйте пакет dplyr

library(dplyr)

#make this example reproducible
set. seed (1)

#create ID column
df$id <- 1:nrow(df)

#use 70% of dataset as training set and 30% as test set 
train <- df %>% dplyr::sample_frac( 0.70 )
test <- dplyr::anti_join(df, train, by = 'id')

В следующих примерах показано, как использовать каждый метод на практике со встроенным набором данных iris в R.

Пример 1. Разделение данных на обучающий и тестовый наборы с использованием базы R

В следующем коде показано, как использовать базу R для разделения набора данных радужной оболочки на обучающий и тестовый наборы, используя 70 % строк в качестве обучающего набора, а оставшиеся 30 % — в качестве тестового набора.

#load iris dataset
data(iris)

#make this example reproducible
set. seed (1)

#Use 70% of dataset as training set and remaining 30% as testing set
sample <- sample(c( TRUE , FALSE ), nrow(iris), replace= TRUE , prob=c( 0.7 , 0.3 ))
train <- iris[sample, ]
test <- iris[!sample, ]

#view dimensions of training set
dim(train)

[1] 106 5

#view dimensions of test set
dim(test)

[1] 44 5

Из вывода мы видим:

  • Обучающий набор представляет собой фрейм данных со 106 строками и 5 столбцами.
  • Тест представляет собой фрейм данных с 44 строками и 5 столбцами.

Поскольку в исходном фрейме данных было всего 150 строк, обучающий набор содержит примерно 106/150 = 70,6% исходных строк.

Мы также можем просмотреть первые несколько строк тренировочного набора, если хотим:

#view first few rows of training set
head(train)

 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa

Пример 2. Разделение данных на обучающий и тестовый наборы с помощью caTools

В следующем коде показано, как использовать пакет caTools в R для разделения набора данных радужной оболочки на обучающий и тестовый наборы, используя 70 % строк в качестве обучающего набора, а оставшиеся 30 % — в качестве тестового набора:

library (caTools)

#load iris dataset
data(iris)

#make this example reproducible
set. seed (1)

#Use 70% of dataset as training set and remaining 30% as testing set
sample <- sample.split(iris$Species, SplitRatio = 0.7 )
train <- subset(iris, sample == TRUE )
test <- subset(iris, sample == FALSE )

#view dimensions of training set
dim(train)

[1] 105 5

#view dimensions of test set
dim(test)

[1] 45 5

Из вывода мы видим:

  • Обучающий набор представляет собой фрейм данных со 105 строками и 5 столбцами.
  • Тест представляет собой фрейм данных с 45 строками и 5 столбцами.

Пример 3. Разделение данных на обучающий и тестовый наборы с использованием dplyr

В следующем коде показано, как использовать пакет caTools в R для разделения набора данных радужной оболочки на обучающий и тестовый наборы, используя 70 % строк в качестве обучающего набора, а оставшиеся 30 % — в качестве тестового набора:

library(dplyr)

#load iris dataset
data(iris)

#make this example reproducible
set. seed (1)

#create ID variable
iris$id <- 1:nrow(iris)

#Use 70% of dataset as training set and remaining 30% as testing set 
train <- iris %>% dplyr::sample_frac( 0.7 )
test <- dplyr::anti_join(iris, train, by = 'id')

#view dimensions of training set
dim(train)

[1] 105 6

#view dimensions of test set
dim(test)

[1] 45 6

Из вывода мы видим:

  • Обучающий набор представляет собой фрейм данных со 105 строками и 6 столбцами.
  • Тест представляет собой фрейм данных с 45 строками и 6 столбцами.

Обратите внимание, что эти обучающие и тестовые наборы содержат один дополнительный столбец «id», который мы создали.

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

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции в R:

Как рассчитать MSE в R
Как рассчитать RMSE в R
Как рассчитать скорректированный R-квадрат в R

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.