Python vs. R:语法糖魔法

已发表: 2022-07-22

自从我学会了欣赏 Python 和 R 中的甜头后,我的开发口味已经扩大。数据科学是一门可以从多个角度接近的艺术,但需要仔细平衡语言、库和专业知识。 Python 和 R 的扩展能力提供了语法糖:简化我们的工作并允许我们用简短、优雅的解决方案解决复杂问题的语法。

这些语言为我们提供了探索解决方案空间的独特方式。 每种语言都有自己的长处和短处。 有效使用每种工具的诀窍是识别哪些问题类型从每种工具中受益,并决定我们希望如何传达我们的发现。 每种语言中的语法糖使我们能够更有效地工作。

R 和 Python 作为底层代码之上的交互式接口,允许数据科学家使用他们选择的语言进行数据探索、可视化和建模。 这种交互性使我们能够避免不断的编辑和编译代码循环,这不必要地使我们的工作复杂化。

这些高级语言使我们能够以最小的摩擦工作,用更少的代码做更多的事情。 每种语言的语法糖使我们能够在 REPL(读取-评估-打印循环)中快速测试我们的想法,这是一个可以实时执行代码的交互式界面。 这种迭代方法是现代数据处理周期的关键组成部分。

R vs. Python:富有表现力和专业化

R 和 Python 的强大之处在于它们的表现力和灵活性。 每种语言都有特定的用例,在这些用例中它比另一种更强大。 此外,每种语言都使用不同的向量和非常不同的输出类型来解决问题。 这些风格往往有不同的开发人员社区,其中一种语言是首选。 随着每个社区的有机发展,他们的首选语言和功能集趋向于独特的语法糖样式,从而减少了解决问题所需的代码量。 随着社区和语言的成熟,语言的语法糖通常变得更加甜美。

尽管每种语言都为解决数据问题提供了强大的工具集,但我们必须以利用这些工具的特殊优势的方式来解决这些问题。 R 是作为一种统计计算语言而诞生的,它拥有大量可用于执行统计分析和解释数据的工具。 Python 及其机器学习方法解决了类似的问题,但只解决了那些适合机器学习模型的问题。 将统计计算和机器学习视为数据建模的两个流派:尽管这些流派高度互联,但它们的数据建模起源和范式是不同的。

R喜欢统计

R 已经发展成为用于统计分析、线性建模和可视化的丰富软件包。 因为这些包几十年来一直是 R 生态系统的一部分,所以它们成熟、高效且有据可查。 当一个问题需要统计计算方法时,R 是完成这项工作的正确工具。

R 受到社区喜爱的主要原因归结为:

  • 离散数据操作、计算和过滤方法。
  • 灵活的链接运算符来连接这些方法。
  • 一种简洁的语法糖,允许开发人员使用舒适的统计和可视化方法解决复杂问题。

带有 R 的简单线性模型

为了了解 R 有多简洁,让我们创建一个预测钻石价格的示例。 首先,我们需要数据。 我们将使用diamonds默认数据集,该数据集与 R 一起安装,包含颜色和切工等属性。

我们还将演示 R 的管道运算符 ( %>% ),它相当于 Unix 命令行管道 ( | ) 运算符。 tidyverse 软件包套件提供了这个流行的 R 语法糖功能。 这个运算符和由此产生的代码风格是 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、不平衡学习和 Optuna 等流行库。 许多最具影响力的机器学习工具包,例如 TensorFlow、PyTorch 和 Jax,主要是为 Python 编写的。

Python 的语法糖是机器学习专家喜爱的魔法,包括简洁的数据管道语法,以及 scikit-learn 的 fit-transform-predict 模式:

  1. 转换数据以准备模型。
  2. 构建模型(隐式或显式)。
  3. 适合模型。
  4. 预测新数据(监督模型)或转换数据(无监督)。
    • 对于监督模型,计算新数据点的误差度量。

scikit-learn 库封装了与此模式匹配的功能,同时简化了探索和可视化的编程。 还有很多特征对应于机器学习周期的每一步,提供交叉验证、超参数调优和管道。

钻石机器学习模型

我们现在将关注一个使用 Python 的简单机器学习示例,它在 R 中没有直接的比较。我们将使用相同的数据集并在一段非常紧凑的代码中突出显示 fit-transform-predict 模式。

遵循机器学习方法,我们将数据分成训练和测试分区。 我们将在每个分区上应用相同的转换,并使用管道链接包含的操作。 方法(拟合和得分)是 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 工程博客:

  • 机器学习理论及其应用简介:带有示例的可视化教程
  • Python 设计模式:用于时尚时尚的代码
  • R 和 Gephi 中的社交网络分析:深入研究 Twitter
  • 探索监督机器学习算法
  • 确保干净的代码:看一下 Python,参数化