Python против R: магия синтаксического сахара

Опубликовано: 2022-07-22

Мои вкусы разработчиков расширились с тех пор, как я научился ценить сладость Python и R. Наука о данных — это искусство, к которому можно подходить с разных сторон, но оно требует тщательного баланса языка, библиотек и опыта. Широкие возможности Python и R обеспечивают синтаксический сахар: синтаксис, который облегчает нашу работу и позволяет нам решать сложные проблемы с помощью коротких и элегантных решений.

Эти языки предоставляют нам уникальные способы изучения нашего пространства решений. Каждый язык имеет свои сильные и слабые стороны. Хитрость в эффективном использовании каждого из них заключается в том, чтобы определить, какие типы проблем выигрывают от каждого инструмента, и решить, как мы хотим сообщить о наших результатах. Синтаксический сахар в каждом языке позволяет нам работать более эффективно.

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

Эти языки высокого уровня позволяют нам работать с минимальными трудностями и делать больше с меньшим количеством кода. Синтаксический сахар каждого языка позволяет нам быстро проверять наши идеи в REPL (цикл чтения-оценки-печати), интерактивном интерфейсе, в котором код может выполняться в режиме реального времени. Этот итеративный подход является ключевым компонентом современного цикла обработки данных.

R против Python: выразительный и специализированный

Сила R и Python заключается в их выразительности и гибкости. Каждый язык имеет определенные варианты использования, в которых он более эффективен, чем другой. Кроме того, каждый язык решает задачи по разным векторам и с очень разными типами вывода. Эти стили, как правило, имеют разные сообщества разработчиков, где предпочтение отдается одному языку. По мере того, как каждое сообщество органически растет, его предпочтительный язык и наборы функций имеют тенденцию к уникальным стилям синтаксического сахара, которые уменьшают объем кода, необходимый для решения проблем. И по мере взросления сообщества и языка синтаксический сахар языка часто становится еще слаще.

Хотя каждый язык предлагает мощный набор инструментов для решения проблем с данными, мы должны подходить к этим проблемам таким образом, чтобы использовать сильные стороны этих инструментов. R родился как язык статистических вычислений и имеет широкий набор инструментов для выполнения статистического анализа и объяснения данных. Python и его подходы к машинному обучению решают аналогичные проблемы, но только те, которые вписываются в модель машинного обучения. Думайте о статистических вычислениях и машинном обучении как о двух школах моделирования данных: хотя эти школы тесно взаимосвязаны, их происхождение и парадигмы моделирования данных различны.

R любит статистику

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

Основные причины, по которым R нравится сообществу, сводятся к следующему:

  • Обработка дискретных данных, вычисления и методы фильтрации.
  • Гибкие операторы цепочки для соединения этих методов.
  • Лаконичный синтаксический сахар, позволяющий разработчикам решать сложные задачи с помощью удобных методов статистики и визуализации.

Простая линейная модель с R

Чтобы увидеть, насколько лаконичным может быть R, давайте создадим пример, предсказывающий цены на бриллианты. Во-первых, нам нужны данные. Мы будем использовать набор данных по умолчанию для diamonds , который устанавливается вместе с R и содержит такие атрибуты, как цвет и огранка.

Мы также продемонстрируем оператор канала R ( %>% ), эквивалент оператора канала командной строки Unix ( | ). Эта популярная функция синтаксического сахара R доступна в пакете tidyverse. Этот оператор и полученный в результате стиль кода меняют правила игры в R, потому что он позволяет связывать R-глаголы (т. е. R-функции) для разделения и преодоления множества проблем.

Следующий код загружает необходимые библиотеки, обрабатывает наши данные и генерирует линейную модель:

 library(tidyverse) library(ggplot2) mode <- function(data) { freq <- unique(data) freq[which.max(tabulate(match(data, freq)))] } data <- diamonds %>% mutate(across(where(is.numeric), ~ replace_na(., median(., na.rm = TRUE)))) %>% mutate(across(where(is.numeric), scale)) %>% mutate(across(where(negate(is.numeric)), ~ replace_na(.x, mode(.x)))) model <- lm(price~., data=data) model <- step(model) summary(model)
 Call: lm(formula = price ~ carat + cut + color + clarity + depth + table + x + z, data = data) Residuals: Min 1Q Median 3Q Max -5.3588 -0.1485 -0.0460 0.0943 2.6806 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.140019 0.002461 -56.892 < 2e-16 *** carat 1.337607 0.005775 231.630 < 2e-16 *** cut.L 0.146537 0.005634 26.010 < 2e-16 *** cut.Q -0.075753 0.004508 -16.805 < 2e-16 *** cut.C 0.037210 0.003876 9.601 < 2e-16 *** cut^4 -0.005168 0.003101 -1.667 0.09559 . color.L -0.489337 0.004347 -112.572 < 2e-16 *** color.Q -0.168463 0.003955 -42.599 < 2e-16 *** color.C -0.041429 0.003691 -11.224 < 2e-16 *** color^4 0.009574 0.003391 2.824 0.00475 ** color^5 -0.024008 0.003202 -7.497 6.64e-14 *** color^6 -0.012145 0.002911 -4.172 3.02e-05 *** clarity.L 1.027115 0.007584 135.431 < 2e-16 *** clarity.Q -0.482557 0.007075 -68.205 < 2e-16 *** clarity.C 0.246230 0.006054 40.676 < 2e-16 *** clarity^4 -0.091485 0.004834 -18.926 < 2e-16 *** clarity^5 0.058563 0.003948 14.833 < 2e-16 *** clarity^6 0.001722 0.003438 0.501 0.61640 clarity^7 0.022716 0.003034 7.487 7.13e-14 *** depth -0.022984 0.001622 -14.168 < 2e-16 *** table -0.014843 0.001631 -9.103 < 2e-16 *** x -0.281282 0.008097 -34.740 < 2e-16 *** z -0.008478 0.005872 -1.444 0.14880 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.2833 on 53917 degrees of freedom Multiple R-squared: 0.9198, Adjusted R-squared: 0.9198 F-statistic: 2.81e+04 on 22 and 53917 DF, p-value: < 2.2e-16

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

Python лучше всего подходит для машинного обучения

Python — это мощный язык общего назначения, одно из основных сообществ пользователей которого сосредоточено на машинном обучении, используя популярные библиотеки, такие как scikit-learn, Balanced-learn и Optuna. Многие из наиболее влиятельных наборов инструментов машинного обучения, такие как TensorFlow, PyTorch и Jax, написаны в основном для Python.

Синтаксический сахар Python — это волшебство, которое любят специалисты по машинному обучению, включая краткий синтаксис конвейера данных, а также шаблон scikit-learn fit-transform-predict:

  1. Преобразуйте данные, чтобы подготовить их для модели.
  2. Построить модель (неявную или явную).
  3. Соответствуйте модели.
  4. Прогнозировать новые данные (модель с учителем) или преобразовывать данные (без учителя).
    • Для контролируемых моделей вычислите метрику ошибки для новых точек данных.

Библиотека scikit-learn инкапсулирует функциональность, соответствующую этому шаблону, и упрощает программирование для исследования и визуализации. Существует также множество функций, соответствующих каждому этапу цикла машинного обучения, обеспечивающих перекрестную проверку, настройку гиперпараметров и конвейеры.

Алмазная модель машинного обучения

Теперь мы сосредоточимся на простом примере машинного обучения с использованием Python, который не имеет прямого сравнения в R. Мы будем использовать тот же набор данных и выделим шаблон «подгонка-преобразование-прогноз» в очень узком фрагменте кода.

Следуя подходу машинного обучения, мы разделим данные на разделы для обучения и тестирования. Мы применим одни и те же преобразования к каждому разделу и свяжем содержащиеся операции с конвейером. Методы (соответствие и оценка) являются ключевыми примерами мощных методов машинного обучения, содержащихся в scikit-learn:

 import numpy as np import pandas as pd from sklearn.linear_model LinearRegression from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import OneHotEncoder from sklearn.impute import SimpleImputer from sklearn.pipeline import Pipeline from sklearn.compose import ColumnTransformer from pandas.api.types import is_numeric_dtype diamonds = sns.load_dataset('diamonds') diamonds = diamonds.dropna() x_train,x_test,y_train,y_test = train_test_split(diamonds.drop("price", axis=1), diamonds["price"], test_size=0.2, random_state=0) num_idx = x_train.apply(lambda x: is_numeric_dtype(x)).values num_cols = x_train.columns[num_idx].values cat_cols = x_train.columns[~num_idx].values num_pipeline = Pipeline(steps=[("imputer", SimpleImputer(strategy="median")), ("scaler", StandardScaler())]) cat_steps = Pipeline(steps=[("imputer", SimpleImputer(strategy="constant", fill_value="missing")), ("onehot", OneHotEncoder(drop="first", sparse=False))]) # data transformation and model constructor preprocessor = ColumnTransformer(transformers=[("num", num_pipeline, num_cols), ("cat", cat_steps, cat_cols)]) mod = Pipeline(steps=[("preprocessor", preprocessor), ("linear", LinearRegression())]) # .fit() calls .fit_transform() in turn mod.fit(x_train, y_train) # .predict() calls .transform() in turn mod.predict(x_test) print(f"R squared score: {mod.score(x_test, y_test):.3f}")

Мы видим, насколько оптимизирован процесс машинного обучения в Python. Кроме того, классы Python sklearn помогают разработчикам избежать утечек и проблем, связанных с передачей данных через нашу модель, а также генерировать структурированный код производственного уровня.

Что еще могут сделать R и Python?

Помимо решения статистических приложений и создания моделей машинного обучения, R и Python отлично подходят для создания отчетов, API-интерфейсов, интерактивных информационных панелей и простого включения внешних библиотек низкоуровневого кода.

Разработчики могут создавать интерактивные отчеты как в R, так и в Python, но разрабатывать их в R гораздо проще. R также поддерживает экспорт этих отчетов в PDF и HTML.

Оба языка позволяют специалистам по данным создавать интерактивные приложения данных. R и Python используют библиотеки Shiny и Streamlit соответственно для создания этих приложений.

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

Python и R: с каждым днем ​​становится все милее

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

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

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

Дальнейшее чтение в блоге Toptal Engineering:

  • Введение в теорию машинного обучения и ее приложения: наглядное пособие с примерами
  • Шаблоны дизайна Python: для гладкого и модного кода
  • Анализ социальных сетей в R и Gephi: копание в Twitter
  • Изучение контролируемых алгоритмов машинного обучения
  • Обеспечение чистого кода: взгляд на Python, параметризованный