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,參數化