Python contro R: Magia sintattica dello zucchero

Pubblicato: 2022-07-22

Il mio palato di sviluppo si è ampliato da quando ho imparato ad apprezzare la dolcezza che si trova in Python e R. La scienza dei dati è un'arte che può essere affrontata da più angolazioni ma richiede un attento equilibrio tra linguaggio, librerie ed esperienza. Le capacità espansive di Python e R forniscono zucchero sintattico: sintassi che facilita il nostro lavoro e ci consente di affrontare problemi complessi con soluzioni brevi ed eleganti.

Questi linguaggi ci forniscono modi unici per esplorare il nostro spazio di soluzioni. Ogni lingua ha i suoi punti di forza e di debolezza. Il trucco per utilizzarli in modo efficace è riconoscere quali tipi di problemi traggono vantaggio da ciascuno strumento e decidere come comunicare i nostri risultati. Lo zucchero sintattico in ogni lingua ci consente di lavorare in modo più efficiente.

R e Python funzionano come interfacce interattive sopra il codice di livello inferiore, consentendo ai data scientist di utilizzare il linguaggio scelto per l'esplorazione, la visualizzazione e la modellazione dei dati. Questa interattività ci consente di evitare il ciclo incessante di editing e compilazione del codice, che complica inutilmente il nostro lavoro.

Questi linguaggi di alto livello ci consentono di lavorare con il minimo attrito e di fare di più con meno codice. Lo zucchero sintattico di ogni linguaggio ci consente di testare rapidamente le nostre idee in un REPL (read-evaluate-print loop), un'interfaccia interattiva in cui il codice può essere eseguito in tempo reale. Questo approccio iterativo è una componente chiave nel moderno ciclo di elaborazione dei dati.

R vs Python: espressivo e specializzato

Il potere di R e Python risiede nella loro espressività e flessibilità. Ogni lingua ha casi d'uso specifici in cui è più potente dell'altra. Inoltre, ogni lingua risolve problemi lungo vettori diversi e con tipi di output molto diversi. Questi stili tendono ad avere comunità di sviluppatori diverse in cui è preferita una lingua. Man mano che ogni comunità cresce organicamente, il loro linguaggio preferito e le funzionalità impostano la tendenza verso stili di zucchero sintattici unici che riducono il volume del codice richiesto per risolvere i problemi. E man mano che la comunità e la lingua maturano, lo zucchero sintattico della lingua spesso diventa ancora più dolce.

Sebbene ogni linguaggio offra un potente set di strumenti per risolvere i problemi relativi ai dati, dobbiamo affrontare tali problemi in modi che sfruttino i particolari punti di forza degli strumenti. R è nato come linguaggio di calcolo statistico e dispone di un ampio set di strumenti per eseguire analisi statistiche e spiegare i dati. Python e i suoi approcci di apprendimento automatico risolvono problemi simili ma solo quelli che rientrano in un modello di apprendimento automatico. Pensa al calcolo statistico e all'apprendimento automatico come a due scuole per la modellazione dei dati: sebbene queste scuole siano altamente interconnesse, le loro origini e i loro paradigmi per la modellazione dei dati sono diversi.

R ama le statistiche

R si è evoluto in un ricco pacchetto che offre analisi statistiche, modellazione lineare e visualizzazione. Poiché questi pacchetti fanno parte dell'ecosistema R da decenni, sono maturi, efficienti e ben documentati. Quando un problema richiede un approccio di calcolo statistico, R è lo strumento giusto per il lavoro.

I motivi principali per cui R è amato dalla sua comunità si riducono a:

  • Metodi discreti di manipolazione, calcolo e filtraggio dei dati.
  • Operatori di concatenamento flessibili per connettere questi metodi.
  • Un succinto zucchero sintattico che consente agli sviluppatori di risolvere problemi complessi utilizzando comodi metodi statistici e di visualizzazione.

Un semplice modello lineare con R

Per vedere quanto può essere succinta R, creiamo un esempio che prevede i prezzi dei diamanti. In primo luogo, abbiamo bisogno di dati. Utilizzeremo il set di dati predefinito dei diamonds , che è installato con R e contiene attributi come colore e taglio.

Dimostreremo anche l'operatore pipe di R ( %>% ), l'equivalente dell'operatore pipe ( | ) della riga di comando di Unix. Questo popolare pezzo della funzione sintattica dello zucchero di R è reso disponibile dalla suite di pacchetti tidyverse. Questo operatore e lo stile di codice risultante sono un punto di svolta in R perché consentono il concatenamento dei verbi R (cioè le funzioni R) per dividere e conquistare una vasta gamma di problemi.

Il codice seguente carica le librerie richieste, elabora i nostri dati e genera un modello lineare:

 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 rende questa equazione lineare semplice da programmare e comprendere con il suo zucchero sintattico. Ora, spostiamo la nostra attenzione su dove Python è il re.

Python è il migliore per l'apprendimento automatico

Python è un linguaggio potente e generico, con una delle sue principali comunità di utenti focalizzata sull'apprendimento automatico, sfruttando librerie popolari come scikit-learn, squilibrid-learn e Optuna. Molti dei toolkit di machine learning più influenti, come TensorFlow, PyTorch e Jax, sono scritti principalmente per Python.

Lo zucchero sintattico di Python è la magia che gli esperti di apprendimento automatico amano, inclusa la sintassi della pipeline di dati succinta, nonché il modello fit-transform-predict di scikit-learn:

  1. Trasforma i dati per prepararli per il modello.
  2. Costruisci un modello (implicito o esplicito).
  3. Montare il modello.
  4. Prevedi nuovi dati (modello supervisionato) o trasforma i dati (non supervisionato).
    • Per i modelli supervisionati, calcola una metrica di errore per i nuovi punti dati.

La libreria scikit-learn incapsula la funzionalità che corrisponde a questo modello semplificando la programmazione per l'esplorazione e la visualizzazione. Ci sono anche molte funzionalità corrispondenti a ogni fase del ciclo di apprendimento automatico, fornendo convalida incrociata, ottimizzazione degli iperparametri e pipeline.

Un modello di apprendimento automatico del diamante

Ci concentreremo ora su un semplice esempio di apprendimento automatico usando Python, che non ha confronti diretti in R. Useremo lo stesso set di dati ed evidenzieremo il modello fit-transform-predict in un pezzo di codice molto stretto.

Seguendo un approccio di apprendimento automatico, suddivideremo i dati in partizioni di addestramento e test. Applicheremo le stesse trasformazioni su ogni partizione e concateneremo le operazioni contenute con una pipeline. I metodi (fit e punteggio) sono esempi chiave di potenti metodi di apprendimento automatico contenuti in 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}")

Possiamo vedere quanto sia snello il processo di apprendimento automatico in Python. Inoltre, le classi sklearn di Python aiutano gli sviluppatori a evitare perdite e problemi relativi al passaggio dei dati attraverso il nostro modello generando allo stesso tempo codice strutturato ea livello di produzione.

Cos'altro possono fare R e Python?

Oltre a risolvere applicazioni statistiche e creare modelli di machine learning, R e Python eccellono nel reporting, nelle API, nei dashboard interattivi e nella semplice inclusione di librerie di codice esterne di basso livello.

Gli sviluppatori possono generare report interattivi sia in R che in Python, ma è molto più semplice svilupparli in R. R supporta anche l'esportazione di tali report in PDF e HTML.

Entrambi i linguaggi consentono ai data scientist di creare applicazioni di dati interattive. R e Python utilizzano rispettivamente le librerie Shiny e Streamlit per creare queste applicazioni.

Infine, R e Python supportano entrambi i collegamenti esterni al codice di basso livello. Questo è in genere usato per iniettare operazioni altamente performanti in una libreria e quindi chiamare quelle funzioni dall'interno della lingua scelta. R usa il pacchetto Rcpp, mentre Python usa il pacchetto pybind11 per ottenere questo risultato.

Python e R: Diventare ogni giorno più dolci

Nel mio lavoro come data scientist, uso regolarmente sia R che Python. La chiave è capire dove ogni lingua è più forte e quindi adattare un problema per adattarlo a una soluzione elegantemente codificata.

Quando comunicano con i clienti, i data scientist vogliono farlo nella lingua più facilmente comprensibile. Pertanto, dobbiamo valutare se una presentazione statistica o di machine learning è più efficace e quindi utilizzare il linguaggio di programmazione più adatto.

Python e R forniscono ciascuno una raccolta in continua crescita di zucchero sintattico, che semplifica il nostro lavoro come data scientist e ne facilita la comprensibilità agli altri. Più raffinata è la nostra sintassi, più facile è automatizzare e interagire con i nostri linguaggi preferiti. Mi piace il mio linguaggio della scienza dei dati dolce e le soluzioni eleganti che ne risultano sono ancora più dolci.

Ulteriori letture sul blog di Toptal Engineering:

  • Un'introduzione alla teoria dell'apprendimento automatico e alle sue applicazioni: un tutorial visivo con esempi
  • Modelli di design Python: per codice elegante e alla moda
  • Analisi dei social network in R e Gephi: scavare in Twitter
  • Esplorazione degli algoritmi di apprendimento automatico supervisionato
  • Garantire codice pulito: uno sguardo a Python, parametrizzato