Пример того, как заставить Python XGBoost легко работать в R

Нет сомнений в том, что Python имеет самый широкий спектр алгоритмов машинного обучения из всех языков программирования, и в целом Python - это мой первый портал, когда я собираюсь выполнять любую форму прогнозного моделирования. Тем не менее, я предпочитаю R для упорядочивания и подготовки данных и хотел бы иметь возможность импортировать алгоритмы Python в R, чтобы иметь лучшее из обоих миров. Поэтому я недавно решил посмотреть, смогу ли я легко запустить алгоритм Python ML в R. Я решил попробовать k-кратную перекрестно проверенную модель XGBoost.

Я решил, что это довольно легко сделать, работая в RStudio, поэтому написал здесь как. Я также собрал репозиторий Github с этим примером.

Чтобы эти методы работали, вам нужно будет работать внутри проекта R и указывать на исполняемый файл Python в среде Conda или Virtualenv, который содержит все необходимые пакеты Python. Вы можете сделать это, используя файл .Rprofile в каталоге вашего проекта R. Всякий раз, когда вы запускаете проект в R, этот файл будет выполнять свое содержимое при запуске. В моем .Rprofile было две строчки кода. Первая строка сообщала R, где найти нужный исполняемый файл Python в среде Conda, где я установил все необходимые мне пакеты (а именно pandas, scipy, scikit-learn и XGBoost). Это нужно будет отредактировать, чтобы он указывал на правильный путь на вашем компьютере.

Sys.setenv(RETICULATE_PYTHON = "/home/rstudio/.local/share/r-miniconda/envs/r_and_py_models/bin/python3")

Вторая строка предназначена для моего удобства. Он печатает подтверждение использования среды Conda. Это должно убедить меня при запуске, что R знает, где я хочу, чтобы он выполнял код Python.

print(paste("Python environment forced to", Sys.getenv("RETICULATE_PYTHON")))

Когда я запускаю свой проект, я получаю это сообщение, подтверждающее, что используется предполагаемая среда Conda.

Напишите функции Python для работы с набором данных в R

Я создал файл Python с именем python_functions.py, в котором я написал необходимые функции на Python для выполнения модели XGBoost на любом произвольном фрейме данных Pandas. Я настроил это так, чтобы можно было ожидать, что все параметры для этих функций будут в одном dict с именем parameters. Мне нужно было написать четыре функции Python: одну для разделения моих данных на обучающие и тестовые данные, одну для масштабирования моих функций, одну для запуска XGBoost и последнюю для создания отчета о классификации в виде DataFrame. Вот содержимое этого файла, содержащего четыре обязательные функции:

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

library(reticulate)
source_python("python_functions.py")

Пример: использование Python XGBoost в R

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

white_wines <- read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv",
                        sep = ";")
red_wines <- read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv", 
                      sep = ";")

Мы создадим новую функцию «белый или красный», а «высокое качество» определим как показатель качества, равный семи или более.

library(dplyr)
white_wines$red <- 0
red_wines$red <- 1
wine_data <- white_wines %>% 
  bind_rows(red_wines) %>% 
  mutate(high_quality = ifelse(quality >= 7, 1, 0)) %>% 
  select(-quality)
head(wine_data)

Теперь, когда наши данные настроены для моделирования, пришло время применить наши функции Python в действии.

Теперь мы устанавливаем наш список параметров (список в R эквивалентен dict в Python):

params <- list(
  input_cols = colnames(wine_data)[colnames(wine_data) != 'high_quality'],
  target_col = 'high_quality',
  test_size = 0.3,
  random_state = 123,
  subsample = (3:9)/10, 
  xgb_max_depth = 3:9,
  colsample_bytree = (3:9)/10,
  xgb_min_child_weight = 1:4,
  k = 3,
  k_shuffle = TRUE,
  n_iter = 10,
  scoring = 'f1',
  error_score = 0,
  verbose = 1,
  n_jobs = -1
)

Теперь мы готовы запустить нашу модель XGBoost, скажем, с 3-кратной перекрестной проверкой. Сначала мы разделяем данные с помощью нашей исходной функции Python split_data - обратите внимание, что reticulate будет переводить входные данные в их эквиваленты Python за кулисами, поэтому wine_data станет фреймом данных Pandas, а params станет dict.

split <- split_data(df = wine_data,  parameters = params)

Наша функция Python возвращает dict, выводом в R будет список, который мы можем передать в нашу функцию масштабирования:

scaled <- scale_data(split$X_train, split$X_test)

И снова вывод будет списком. Теперь мы можем запустить алгоритм XGBoost с определенными параметрами в нашем обучающем наборе:

trained <- train_xgb_crossvalidated(
  scaled$X_train_scaled,
  split$y_train,
  parameters = params
)

Наконец, мы можем создать отчет о классификации по нашему набору тестов:

generate_classification_report(trained, scaled$X_test_scaled, split$y_test)

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

test_data <- py_to_r(scaled$X_test_scaled)
trained$predict(test_data[1, ])
[1] 1

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

Изначально я был чистым математиком, затем стал психометриком и специалистом по анализу данных. Я с энтузиазмом отношусь к применению всех этих дисциплин к сложным человеческим вопросам. Я также помешан на кодировании и большой поклонник японских ролевых игр. Найдите меня в LinkedIn или Twitter. Также посетите мой блог на drkeithmcnulty.com.