Python در مقابل R: Syntactic Sugar Magic


کام توسعه من از زمانی گسترش یافته است که یاد گرفتم از شیرینی موجود در پایتون و R قدردانی کنم. علم داده هنری است که می توان از زوایای مختلف به آن نزدیک شد، اما به تعادل دقیق زبان، کتابخانه ها و تخصص نیاز دارد. قابلیت‌های گسترده پایتون و R، قند نحوی را فراهم می‌کند: نحوی که کار ما را آسان می‌کند و به ما اجازه می‌دهد تا مشکلات پیچیده را با راه‌حل‌های کوتاه و ظریف برطرف کنیم.

این زبان‌ها راه‌های منحصربه‌فردی را برای کشف فضای راه‌حل در اختیار ما قرار می‌دهند. هر زبانی نقاط قوت و ضعف خود را دارد. ترفند استفاده موثر از هر کدام این است که تشخیص دهیم کدام نوع مشکل از هر ابزار سود می‌برند و تصمیم می‌گیریم که چگونه می‌خواهیم یافته‌های خود را به اشتراک بگذاریم. قند نحوی در هر زبان به ما امکان می دهد کارآمدتر کار کنیم.

R و Python به عنوان رابط های تعاملی در بالای کدهای سطح پایین عمل می کنند و به دانشمندان داده اجازه می دهند از زبان انتخابی خود برای کاوش، تجسم و مدل سازی داده ها استفاده کنند. این تعامل ما را قادر می سازد تا از حلقه بی وقفه ویرایش و کامپایل کد که بی جهت کار ما را پیچیده می کند اجتناب کنیم.

این زبان های سطح بالا به ما امکان می دهند با کمترین اصطکاک کار کنیم و کارهای بیشتری را با کد کمتر انجام دهیم. قند نحوی هر زبان ما را قادر می سازد تا به سرعت ایده های خود را در یک REPL (حلقه خواندن، ارزیابی، چاپ) آزمایش کنیم، یک رابط تعاملی که در آن کد می تواند در زمان واقعی اجرا شود. این رویکرد تکراری یک جزء کلیدی در چرخه پردازش داده مدرن.

R در مقابل پایتون: بیانی و تخصصی

قدرت R و Python در بیان و انعطاف پذیری آنها نهفته است. هر زبان موارد کاربرد خاصی دارد که در آنها از زبان دیگر قدرتمندتر است. علاوه بر این، هر زبان مسائل را در امتداد بردارهای مختلف و با انواع بسیار متفاوت خروجی حل می کند. این سبک‌ها معمولاً جوامع توسعه‌دهنده متفاوتی دارند که در آن یک زبان ترجیح داده می‌شود. همانطور که هر جامعه به طور ارگانیک رشد می کند، زبان و ویژگی ترجیحی آنها به سمت سبک های قند نحوی منحصربفرد گرایش پیدا می کند که حجم کد مورد نیاز برای حل مشکلات را کاهش می دهد. و با بالغ شدن جامعه و زبان، قند نحوی زبان اغلب شیرین‌تر می‌شود.

اگرچه هر زبان مجموعه ابزار قدرتمندی را برای حل مشکلات داده ارائه می دهد، اما ما باید به این مشکلات به گونه ای برخورد کنیم که از نقاط قوت خاص ابزارها استفاده کنیم. R به عنوان یک زبان محاسباتی آماری متولد شد و دارای مجموعه گسترده ای از ابزارها برای انجام تحلیل های آماری و توضیح داده ها است. پایتون و رویکردهای یادگیری ماشین آن مشکلات مشابهی را حل می‌کنند، اما فقط آن‌هایی را که در یک مدل یادگیری ماشینی قرار می‌گیرند. محاسبات آماری و یادگیری ماشین را به عنوان دو مکتب برای مدل‌سازی داده‌ها در نظر بگیرید: اگرچه این مدارس بسیار به هم مرتبط هستند، منشأ و پارادایم‌های آنها برای مدل‌سازی داده‌ها متفاوت است.

R عاشق آمار است

R به یک بسته غنی برای تجزیه و تحلیل آماری، مدل‌سازی خطی و تجسم تبدیل شده است. از آنجایی که این بسته‌ها برای دهه‌ها بخشی از اکوسیستم R بوده‌اند، بالغ، کارآمد و به خوبی مستند شده‌اند. هنگامی که یک مشکل نیاز به یک رویکرد محاسباتی آماری دارد، R ابزار مناسبی برای کار است.

دلایل اصلی محبوبیت R توسط جامعه خود به این موارد خلاصه می شود:

  • روش های دستکاری، محاسبات و فیلتر گسسته داده ها.
  • عملگرهای زنجیره ای انعطاف پذیر برای اتصال آن روش ها.
  • یک قند نحوی مختصر که به توسعه دهندگان اجازه می دهد تا با استفاده از روش های آماری و تجسمی راحت، مسائل پیچیده را حل کنند.

یک مدل خطی ساده با R

برای اینکه بفهمیم R چقدر می تواند مختصر باشد، بیایید مثالی ایجاد کنیم که قیمت الماس را پیش بینی می کند. ابتدا به داده ها نیاز داریم. ما استفاده خواهیم کرد diamonds مجموعه داده پیش فرض که با R نصب می شود و دارای ویژگی هایی مانند رنگ و برش است.

ما همچنین اپراتور لوله 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 این معادله خطی را برای برنامه ریزی و درک با قند نحوی آن ساده می کند. حالا بیایید توجه خود را به جایی که پایتون پادشاه است معطوف کنیم.

پایتون برای یادگیری ماشینی بهترین است

پایتون یک زبان قدرتمند و همه منظوره است که یکی از جوامع اصلی کاربران آن بر یادگیری ماشین متمرکز است و از کتابخانه های محبوبی مانند
scikit-یادگیری، نامتعادل-یادگیری، و Optuna. بسیاری از تأثیرگذارترین ابزارهای یادگیری ماشینی، مانند TensorFlow، PyTorch، و جکس، در اصل برای پایتون نوشته شده اند.

قند نحوی پایتون جادویی است که متخصصان یادگیری ماشین دوست دارند، از جمله نحو خط لوله داده مختصر، و همچنین الگوی تناسب تبدیل-پیش‌بینی scikit-learn:

  1. داده ها را تبدیل کنید تا برای مدل آماده شوند.
  2. یک مدل (به طور ضمنی یا صریح) بسازید.
  3. مدل را برازش کنید.
  4. داده های جدید را پیش بینی کنید (مدل تحت نظارت) یا تبدیل داده ها (بدون نظارت).
    • برای مدل‌های تحت نظارت، یک معیار خطا برای نقاط داده جدید محاسبه کنید.

کتابخانه scikit-learn عملکردی مطابق با این الگو را در بر می گیرد و در عین حال برنامه نویسی را برای کاوش و تجسم ساده می کند. همچنین ویژگی های بسیاری مربوط به هر مرحله از چرخه یادگیری ماشینی وجود دارد که اعتبارسنجی متقابل، تنظیم هایپرپارامتر و خطوط لوله را ارائه می دهد.

مدل یادگیری ماشین الماس

ما اکنون بر روی یک مثال ساده یادگیری ماشین با استفاده از پایتون تمرکز خواهیم کرد، که هیچ مقایسه مستقیمی در 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}")

ما می توانیم ببینیم که فرآیند یادگیری ماشین در پایتون چقدر ساده است. علاوه بر این، پایتون sklearn کلاس ها به توسعه دهندگان کمک می کنند از نشت و مشکلات مربوط به انتقال داده ها از طریق مدل ما جلوگیری کنند و در عین حال کدهای ساخت یافته و سطح تولید را نیز تولید کنند.

R و Python چه کارهای دیگری می توانند انجام دهند؟

جدا از حل برنامه‌های آماری و ایجاد مدل‌های یادگیری ماشین، R و Python در گزارش‌دهی، APIها، داشبوردهای تعاملی و گنجاندن ساده کتابخانه‌های کد سطح پایین خارجی برتری دارند.

توسعه دهندگان می توانند گزارش های تعاملی را در R و Python ایجاد کنند، اما توسعه آنها در R بسیار ساده تر است. R همچنین از صادرات آن گزارش ها به PDF و HTML پشتیبانی می کند.

هر دو زبان به دانشمندان داده اجازه می دهند تا برنامه های کاربردی داده های تعاملی ایجاد کنند. R و Python از کتابخانه ها استفاده می کنند براق و Streamlitبه ترتیب برای ایجاد این برنامه ها.

در نهایت، R و Python هر دو از اتصالات خارجی به کدهای سطح پایین پشتیبانی می کنند. این معمولاً برای تزریق عملیات با عملکرد بالا به یک کتابخانه و سپس فراخوانی آن توابع از داخل زبان انتخابی استفاده می شود. R از Rcpp بسته، در حالی که پایتون از pybind11 بسته برای انجام این کار

پایتون و آر: هر روز شیرین‌تر می‌شویم

در کار خود به عنوان یک دانشمند داده، من از R و Python به طور منظم استفاده می کنم. نکته کلیدی این است که بفهمید هر زبان در کجا قوی‌تر است و سپس یک مشکل را به گونه‌ای تنظیم کنید که در یک راه‌حل کدگذاری زیبا قرار گیرد.

هنگام برقراری ارتباط با مشتریان، دانشمندان داده می خواهند این کار را به زبانی انجام دهند که به راحتی قابل درک باشد. بنابراین، باید بسنجیم که آیا ارائه آماری یا یادگیری ماشینی موثرتر است و سپس از مناسب ترین زبان برنامه نویسی استفاده کنیم.

پایتون و R هر کدام مجموعه‌ای از قندهای نحوی در حال رشد را ارائه می‌کنند که هم کار ما را به عنوان دانشمندان داده ساده می‌کند و هم درک آن را برای دیگران آسان می‌کند. هر چه نحو ما دقیق تر باشد، خودکارسازی و تعامل با زبان های دلخواه آسان تر است. من زبان علم داده خود را شیرین دوست دارم و راه حل های ظریفی که به دست می آیند حتی شیرین تر هستند.

ادامه مطلب در وبلاگ مهندسی تاپتال:



منبع

Matthew Newman

Matthew Newman Matthew has over 15 years of experience in database management and software development, with a strong focus on full-stack web applications. He specializes in Django and Vue.js with expertise deploying to both server and serverless environments on AWS. He also works with relational databases and large datasets
[ Back To Top ]