Python vs. R: Syntactic Sugar Magic
Publicat: 2022-07-22Palatul meu de dezvoltare s-a extins de când am învățat să apreciez dulceața găsită în Python și R. Știința datelor este o artă care poate fi abordată din mai multe unghiuri, dar necesită un echilibru atent de limbaj, biblioteci și expertiză. Capacitățile expansive ale Python și R oferă zahăr sintactic: sintaxă care ne ușurează munca și ne permite să abordăm probleme complexe cu soluții scurte și elegante.
Aceste limbi ne oferă modalități unice de a explora spațiul nostru de soluții. Fiecare limbă are propriile sale puncte forte și puncte slabe. Trucul de a folosi fiecare în mod eficient este să recunoaștem ce tipuri de probleme beneficiază de pe urma fiecărui instrument și să decidem cum vrem să ne comunicăm descoperirile. Zahărul sintactic din fiecare limbă ne permite să lucrăm mai eficient.
R și Python funcționează ca interfețe interactive pe deasupra codului de nivel inferior, permițând oamenilor de știință să folosească limbajul ales pentru explorarea, vizualizarea și modelarea datelor. Această interactivitate ne permite să evităm bucla neîncetată de editare și compilare a codului, care ne complică inutil munca.
Aceste limbaje de nivel înalt ne permit să lucrăm cu frecare minimă și să facem mai mult cu mai puțin cod. Zahărul sintactic al fiecărui limbaj ne permite să ne testăm rapid ideile într-o buclă REPL (read-evaluate-print loop), o interfață interactivă în care codul poate fi executat în timp real. Această abordare iterativă este o componentă cheie în ciclul modern de procesare a datelor.
R vs. Python: expresiv și specializat
Puterea lui R și Python constă în expresivitatea și flexibilitatea lor. Fiecare limbă are cazuri de utilizare specifice în care este mai puternică decât cealaltă. În plus, fiecare limbă rezolvă probleme de-a lungul vectorilor diferiți și cu tipuri foarte diferite de ieșire. Aceste stiluri tind să aibă comunități de dezvoltatori diferite, unde este preferată o singură limbă. Pe măsură ce fiecare comunitate crește organic, limbajul și caracteristica preferată stabilesc tendința către stiluri sintactice unice care reduc volumul de cod necesar pentru rezolvarea problemelor. Și pe măsură ce comunitatea și limba se maturizează, zahărul sintactic al limbii devine adesea și mai dulce.
Deși fiecare limbă oferă un set de instrumente puternic pentru rezolvarea problemelor de date, trebuie să abordăm aceste probleme în moduri care să exploateze punctele forte specifice ale instrumentelor. R s-a născut ca un limbaj de calcul statistic și are un set larg de instrumente disponibile pentru efectuarea de analize statistice și explicarea datelor. Python și abordările sale de învățare automată rezolvă probleme similare, dar numai pe cele care se încadrează într-un model de învățare automată. Gândiți-vă la calculul statistic și la învățarea automată ca două școli pentru modelarea datelor: deși aceste școli sunt foarte interconectate, originile și paradigmele lor pentru modelarea datelor sunt diferite.
R iubește statisticile
R a evoluat într-un pachet bogat care oferă analize statistice, modelare liniară și vizualizare. Deoarece aceste pachete fac parte din ecosistemul R de zeci de ani, ele sunt mature, eficiente și bine documentate. Când o problemă necesită o abordare de calcul statistic, R este instrumentul potrivit pentru job.
Principalele motive pentru care R este iubit de comunitatea sa se rezumă la:
- Metode discrete de manipulare, calcul și filtrare a datelor.
- Operatori de înlănțuire flexibili pentru a conecta aceste metode.
- Un zahar sintactic succint care permite dezvoltatorilor să rezolve probleme complexe folosind metode confortabile de statistică și vizualizare.
Un model liniar simplu cu R
Pentru a vedea cât de succint poate fi R, să creăm un exemplu care prezice prețurile diamantelor. În primul rând, avem nevoie de date. Vom folosi setul de date implicit de diamonds
, care este instalat cu R și conține atribute precum culoarea și tăierea.
Vom demonstra, de asemenea, operatorul pipe al lui R ( %>%
), echivalentul operatorului pipe din linia de comandă Unix ( |
). Această bucată populară din caracteristica de zahăr sintactic a lui R este pusă la dispoziție de suita de pachete tidyverse. Acest operator și stilul de cod rezultat schimbă jocul în R, deoarece permite înlănțuirea verbelor R (adică, funcțiile R) pentru a împărți și a învinge o gamă largă de probleme.
Următorul cod încarcă bibliotecile necesare, prelucrează datele noastre și generează un model liniar:
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 face această ecuație liniară simplu de programat și de înțeles cu zahărul său sintactic. Acum, să ne îndreptăm atenția către locul în care Python este rege.
Python este cel mai bun pentru învățarea automată
Python este un limbaj puternic, cu scop general, cu una dintre comunitățile sale principale de utilizatori concentrată pe învățarea automată, valorificând biblioteci populare precum scikit-learn, dezechilibrat-learn și Optuna. Multe dintre cele mai influente seturi de instrumente de învățare automată, cum ar fi TensorFlow, PyTorch și Jax, sunt scrise în principal pentru Python.
Zahărul sintactic al lui Python este magia pe care experții în învățarea automată o iubesc, inclusiv sintaxa succintă a conductei de date, precum și modelul fit-transform-predict al scikit-learn:
- Transformați datele pentru a le pregăti pentru model.
- Construiți un model (implicit sau explicit).
- Potriviți modelul.
- Preziceți date noi (model supravegheat) sau transformați datele (nesupravegheat).
- Pentru modelele supravegheate, calculați o valoare de eroare pentru noile puncte de date.
Biblioteca scikit-learn încapsulează funcționalitatea care se potrivește cu acest model, simplificând în același timp programarea pentru explorare și vizualizare. Există, de asemenea, multe caracteristici care corespund fiecărui pas al ciclului de învățare automată, oferind validare încrucișată, reglare hiperparametrică și conducte.
Un model Diamond Machine Learning
Acum ne vom concentra pe un exemplu simplu de învățare automată folosind Python, care nu are nicio comparație directă în R. Vom folosi același set de date și vom evidenția modelul fit-transform-predict într-o bucată de cod foarte strânsă.
Urmând o abordare de învățare automată, vom împărți datele în partiții de antrenament și testare. Vom aplica aceleași transformări pe fiecare partiție și vom înlănțui operațiile conținute cu o conductă. Metodele (fit și scor) sunt exemple cheie de metode puternice de învățare automată conținute în 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}")
Putem vedea cât de eficient este procesul de învățare automată în Python. În plus, clasele sklearn
ale Python îi ajută pe dezvoltatori să evite scurgerile și problemele legate de transmiterea datelor prin modelul nostru, generând în același timp cod structurat și la nivel de producție.
Ce altceva pot face R și Python?
Pe lângă rezolvarea aplicațiilor statistice și crearea modelelor de învățare automată, R și Python excelează la raportare, API-uri, tablouri de bord interactive și includerea simplă a bibliotecilor externe de coduri de nivel scăzut.
Dezvoltatorii pot genera rapoarte interactive atât în R, cât și în Python, dar este mult mai simplu să le dezvolte în R. R acceptă și exportarea acestor rapoarte în PDF și HTML.
Ambele limbi permit oamenilor de știință să creeze aplicații interactive de date. R și Python folosesc bibliotecile Shiny și, respectiv, Streamlit, pentru a crea aceste aplicații.
În cele din urmă, R și Python acceptă ambele legături externe la codul de nivel scăzut. Acesta este de obicei folosit pentru a injecta operațiuni de înaltă performanță într-o bibliotecă și apoi pentru a apela acele funcții din limbajul ales. R folosește pachetul Rcpp, în timp ce Python folosește pachetul pybind11 pentru a realiza acest lucru.
Python și R: Devenind mai dulce în fiecare zi
În munca mea de cercetător al datelor, folosesc atât R, cât și Python în mod regulat. Cheia este să înțelegeți unde fiecare limbă este mai puternică și apoi să ajustați o problemă pentru a se potrivi într-o soluție codificată elegant.
Atunci când comunică cu clienții, oamenii de știință de date doresc să facă acest lucru în limba care este cel mai ușor de înțeles. Prin urmare, trebuie să cântărim dacă o prezentare statistică sau de învățare automată este mai eficientă și apoi să folosim cel mai potrivit limbaj de programare.
Python și R oferă fiecare o colecție în continuă creștere de zahăr sintactic, care simplifică munca noastră ca cercetători ai datelor și ușurează înțelegerea acesteia pentru alții. Cu cât sintaxa noastră este mai rafinată, cu atât este mai ușor să automatizăm și să interacționăm cu limbile noastre preferate. Îmi place limbajul meu de știință a datelor dulce, iar soluțiile elegante care rezultă sunt și mai dulci.
Citiți suplimentare pe blogul Toptal Engineering:
- O introducere în teoria învățării automate și aplicațiile sale: un tutorial vizual cu exemple
- Modele de design Python: pentru un cod elegant și la modă
- Analiza rețelelor sociale în R și Gephi: Săpătură în Twitter
- Explorarea algoritmilor de învățare automată supravegheați
- Asigurarea codului curat: o privire asupra Python, parametrizat