Python vs. R:シンタックスシュガーマジック

公開: 2022-07-22

PythonとRに見られる甘さを理解することを学んだ後、私の開発の味覚は拡大しました。データサイエンスは、さまざまな角度からアプローチできる芸術ですが、言語、ライブラリ、専門知識の慎重なバランスが必要です。 PythonとRの拡張機能は、構文糖衣構文を提供します。構文は、作業を容易にし、短くてエレガントなソリューションで複雑な問題に対処できるようにします。

これらの言語は、ソリューション空間を探索するための独自の方法を提供します。 各言語には独自の長所と短所があります。 それぞれを効果的に使用する秘訣は、どの問題タイプが各ツールから利益を得るかを認識し、調査結果をどのように伝達するかを決定することです。 各言語のシンタックスシュガーにより、より効率的に作業できます。

RとPythonは、低レベルのコード上でインタラクティブなインターフェイスとして機能し、データサイエンティストがデータの探索、視覚化、モデリングに選択した言語を使用できるようにします。 この対話性により、コードの編集とコンパイルの絶え間ないループを回避できます。これにより、作業が不必要に複雑になります。

これらの高級言語により、最小限の摩擦で作業し、少ないコードでより多くのことを実行できます。 各言語のシンタックスシュガーにより、コードをリアルタイムで実行できるインタラクティブなインターフェイスであるREPL(read-evaluate-printループ)でアイデアをすばやくテストできます。 この反復的なアプローチは、最新のデータプロセスサイクルの重要な要素です。

R対Python:表現力豊かで専門的

RとPythonの力は、その表現力と柔軟性にあります。 各言語には、他の言語よりも強力な特定のユースケースがあります。 さらに、各言語は、さまざまなベクトルに沿って、非常にさまざまなタイプの出力で問題を解決します。 これらのスタイルは、1つの言語が好まれるさまざまな開発者コミュニティを持つ傾向があります。 各コミュニティが有機的に成長するにつれて、それらの優先言語と機能セットは、問題を解決するために必要なコード量を減らす独自の構文糖衣スタイルに向かう傾向があります。 そして、コミュニティと言語が成熟するにつれて、言語の構文糖衣はしばしばさらに甘くなります。

各言語はデータの問題を解決するための強力なツールセットを提供しますが、ツールの特定の長所を活用する方法でそれらの問題に取り組む必要があります。 Rは統計計算言語として生まれ、統計分析を実行し、データを説明するために利用できる幅広いツールのセットを持っています。 Pythonとその機械学習アプローチは同様の問題を解決しますが、機械学習モデルに適合する問題のみを解決します。 統計計算と機械学習をデータモデリングの2つの学校と考えてください。これらの学校は高度に相互接続されていますが、データモデリングの起源とパラダイムは異なります。

Rは統計が大好き

Rは、統計分析、線形モデリング、および視覚化のための豊富なパッケージ製品に進化しました。 これらのパッケージは何十年もの間Rエコシステムの一部であったため、成熟していて効率的であり、十分に文書化されています。 問題が統計計算アプローチを必要とする場合、Rはその仕事に適したツールです。

Rがコミュニティに愛されている主な理由は、次のとおりです。

  • 離散データの操作、計算、およびフィルタリングの方法。
  • これらのメソッドを接続するための柔軟な連鎖演算子。
  • 開発者が快適な統計および視覚化手法を使用して複雑な問題を解決できるようにする簡潔な構文糖衣。

Rを使用した単純な線形モデル

Rがどれほど簡潔になるかを確認するために、ダイヤモンドの価格を予測する例を作成しましょう。 まず、データが必要です。 Rとともにインストールされ、色やカットなどの属性を含むdiamondsのデフォルトデータセットを使用します。

また、Unixコマンドラインパイプ( | )演算子に相当するRのパイプ演算子( %>% )についても説明します。 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は強力な汎用言語であり、その主要なユーザーコミュニティの1つは機械学習に重点を置いており、scikit-learn、inbalanced-learn、Optunaなどの人気のあるライブラリを活用しています。 TensorFlow、PyTorch、Jaxなど、最も影響力のある機械学習ツールキットの多くは、主にPython用に作成されています。

Pythonのシンタックスシュガーは、簡潔なデータパイプライン構文や、scikit-learnのfit-transform-predictパターンなど、機械学習の専門家が愛する魔法です。

  1. データを変換してモデル用に準備します。
  2. モデルを構築します(暗黙的または明示的に)。
  3. モデルを取り付けます。
  4. 新しいデータを予測する(教師ありモデル)か、データを変換します(教師なし)。
    • 教師ありモデルの場合、新しいデータポイントのエラーメトリックを計算します。

scikit-learnライブラリは、探索と視覚化のためのプログラミングを簡素化しながら、このパターンに一致する機能をカプセル化します。 機械学習サイクルの各ステップに対応する多くの機能もあり、相互検証、ハイパーパラメータチューニング、およびパイプラインを提供します。

ダイヤモンド機械学習モデル

ここでは、Rで直接比較されないPythonを使用した単純な機械学習の例に焦点を当てます。同じデータセットを使用し、非常にタイトなコードで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 Engineeringブログでさらに読む:

  • 機械学習理論とその応用の紹介:例を含むビジュアルチュートリアル
  • Pythonデザインパターン:洗練されたファッショナブルなコード用
  • RとGephiのソーシャルネットワーク分析:Twitterを掘り下げる
  • 教師あり機械学習アルゴリズムの調査
  • クリーンなコードの確保:パラメーター化されたPythonの概要