Python versus R: syntactische suikermagie

Mijn smaakpapillen zijn gegroeid sinds ik de zoetheid in heb leren waarderen Python en R. Datawetenschap is een kunst die vanuit meerdere invalshoeken kan worden benaderd, maar die een zorgvuldige balans vereist tussen taal, bibliotheken en expertise. De uitgebreide mogelijkheden van Python en R bieden syntactische suiker: syntaxis die ons werk vergemakkelijkt en ons in staat stelt complexe problemen aan te pakken met korte, elegante oplossingen.

Deze talen bieden ons unieke manieren om onze oplossingsruimte te verkennen. Elke taal heeft zijn eigen sterke en zwakke punten. De truc om elk effectief te gebruiken, is te herkennen welke probleemtypen baat hebben bij elk hulpmiddel en te beslissen hoe we onze bevindingen willen communiceren. De syntactische suiker in elke taal stelt ons in staat om efficiënter te werken.

R en Python fungeren als interactieve interfaces bovenop code op een lager niveau, waardoor datawetenschappers hun gekozen taal kunnen gebruiken voor gegevensverkenning, visualisatie en modellering. Deze interactiviteit stelt ons in staat om de onophoudelijke lus van het bewerken en compileren van code te vermijden, wat ons werk onnodig ingewikkeld maakt.

Deze talen op hoog niveau stellen ons in staat om met minimale wrijving te werken en meer te doen met minder code. De syntactische suiker van elke taal stelt ons in staat om onze ideeën snel te testen in een REPL (read-evaluate-print loop), een interactieve interface waar code in realtime kan worden uitgevoerd. Deze iteratieve aanpak is een belangrijk onderdeel van de moderne dataprocescyclus.

R vs. Python: expressief en gespecialiseerd

De kracht van R en Python ligt in hun expressiviteit en flexibiliteit. Elke taal heeft specifieke gebruikssituaties waarin deze krachtiger is dan de andere. Bovendien lost elke taal problemen op langs verschillende vectoren en met zeer verschillende soorten uitvoer. Deze stijlen hebben meestal verschillende ontwikkelaarsgemeenschappen waar één taal de voorkeur heeft. Naarmate elke gemeenschap organisch groeit, zetten hun voorkeurstaal en functies de trend in de richting van unieke syntactische suikerstijlen die het codevolume verminderen dat nodig is om problemen op te lossen. En naarmate de gemeenschap en de taal volwassener worden, wordt de syntactische suiker van de taal vaak nog zoeter.

Hoewel elke taal een krachtige toolset biedt voor het oplossen van gegevensproblemen, moeten we die problemen benaderen op een manier die de specifieke sterke punten van de tools benut. R is geboren als een statistische computertaal en heeft een breed scala aan tools beschikbaar voor het uitvoeren van statistische analyses en het verklaren van de gegevens. Python en zijn machine learning-benaderingen lossen vergelijkbare problemen op, maar alleen die die passen in een machine learning-model. Beschouw statistisch computergebruik en machine learning als twee scholen voor gegevensmodellering: hoewel deze scholen sterk met elkaar verbonden zijn, zijn hun oorsprong en paradigma’s voor gegevensmodellering verschillend.

R houdt van statistieken

R is uitgegroeid tot een uitgebreid pakket voor statistische analyse, lineaire modellering en visualisatie. Omdat deze pakketten al tientallen jaren deel uitmaken van het R-ecosysteem, zijn ze volwassen, efficiënt en goed gedocumenteerd. Wanneer een probleem een ​​statistische computerbenadering vereist, is R de juiste tool voor de klus.

De belangrijkste redenen waarom R zo geliefd is bij de gemeenschap komt neer op:

  • Discrete methoden voor gegevensmanipulatie, berekening en filtering.
  • Flexibele ketenoperators om deze methoden met elkaar te verbinden.
  • Een beknopte syntactische suiker waarmee ontwikkelaars complexe problemen kunnen oplossen met behulp van comfortabele statistische en visualisatiemethoden.

Een eenvoudig lineair model met R

Laten we, om te zien hoe beknopt R kan zijn, een voorbeeld maken dat diamantprijzen voorspelt. Ten eerste hebben we gegevens nodig. We zullen de gebruiken diamonds standaard dataset, die is geïnstalleerd met R en attributen zoals kleur en snit bevat.

We zullen ook de pijpoperator van R demonstreren (%>%), het equivalent van de Unix command-line pipe (|) exploitant. Dit populaire stuk van R’s syntactische suikerfunctie is beschikbaar gesteld door de netjesverse pakketsuite. Deze operator en de resulterende codestijl is een game changer in R omdat het de mogelijkheid biedt om R-werkwoorden (dwz R-functies) aan elkaar te koppelen om een ​​groot aantal problemen te verdelen en te overwinnen.

De volgende code laadt de vereiste bibliotheken, verwerkt onze gegevens en genereert een lineair model:

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 maakt deze lineaire vergelijking eenvoudig te programmeren en te begrijpen met zijn syntactische suiker. Laten we nu onze aandacht verleggen naar waar Python koning is.

Python is het beste voor machinaal leren

Python is een krachtige taal voor algemene doeleinden, met een van de primaire gebruikersgemeenschappen gericht op machine learning, gebruikmakend van populaire bibliotheken zoals
scikit-leren, onevenwichtig-lerenen Optuna. Veel van de meest invloedrijke toolkits voor machine learning, zoals: TensorFlow, PyTorchen Jaxzijn voornamelijk geschreven voor Python.

Python’s syntactische suiker is de magie waar machine learning-experts dol op zijn, inclusief beknopte datapijplijnsyntaxis, evenals het fit-transform-predict-patroon van scikit-learn:

  1. Transformeer gegevens om ze voor te bereiden op het model.
  2. Construeer een model (impliciet of expliciet).
  3. Pas het model aan.
  4. Voorspel nieuwe data (gesuperviseerd model) of transformeer de data (unsupervised).
    • Bereken voor bewaakte modellen een foutstatistiek voor de nieuwe gegevenspunten.

De scikit-learn-bibliotheek omvat functionaliteit die overeenkomt met dit patroon, terwijl het programmeren voor verkenning en visualisatie wordt vereenvoudigd. Er zijn ook veel functies die overeenkomen met elke stap van de machine learning-cyclus, en bieden kruisvalidatie, hyperparameter-afstemming en pijplijnen.

Een Diamond Machine Learning-model

We zullen ons nu concentreren op een eenvoudig voorbeeld van machine learning met Python, dat geen directe vergelijking heeft in R. We gebruiken dezelfde dataset en markeren het fit-transform-predict-patroon in een zeer strak stuk code.

Na een machine learning-benadering, splitsen we de gegevens op in trainings- en testpartities. We passen dezelfde transformaties toe op elke partitie en koppelen de ingesloten bewerkingen aan een pijplijn. De methoden (fit en score) zijn belangrijke voorbeelden van krachtige machine learning-methoden 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}")

We kunnen zien hoe gestroomlijnd het machine learning-proces is in Python. Bovendien, Python’s sklearn klassen helpen ontwikkelaars om lekken en problemen met betrekking tot het doorgeven van gegevens door ons model te voorkomen, terwijl ze ook gestructureerde code en code op productieniveau genereren.

Wat kunnen R en Python nog meer doen?

Naast het oplossen van statistische toepassingen en het maken van machine learning-modellen, blinken R en Python uit in rapportage, API’s, interactieve dashboards en het eenvoudig opnemen van externe codebibliotheken op laag niveau.

Ontwikkelaars kunnen interactieve rapporten genereren in zowel R als Python, maar het is veel eenvoudiger om ze in R te ontwikkelen. R ondersteunt ook het exporteren van die rapporten naar PDF en HTML.

Met beide talen kunnen datawetenschappers interactieve datatoepassingen maken. R en Python gebruiken de bibliotheken Glimmend en gestroomlijndrespectievelijk, om deze toepassingen te maken.

Ten slotte ondersteunen R en Python beide externe bindingen met code op laag niveau. Dit wordt meestal gebruikt om zeer performante bewerkingen in een bibliotheek te injecteren en die functies vervolgens aan te roepen vanuit de taal van keuze. R gebruikt de Rcpp pakket, terwijl Python de . gebruikt pybind11 pakket om dit te realiseren.

Python en R: elke dag zoeter worden

In mijn werk als datawetenschapper gebruik ik zowel R als Python regelmatig. De sleutel is om te begrijpen waar elke taal het sterkst is en vervolgens een probleem aan te passen aan een elegant gecodeerde oplossing.

Bij communicatie met klanten willen datawetenschappers dat doen in de taal die het gemakkelijkst te begrijpen is. Daarom moeten we afwegen of een statistische of machine learning-presentatie effectiever is en vervolgens de meest geschikte programmeertaal gebruiken.

Python en R bieden elk een steeds groter wordende verzameling syntactische suikers, die zowel ons werk als datawetenschappers vereenvoudigen en de begrijpelijkheid ervan voor anderen vergemakkelijken. Hoe verfijnder onze syntaxis, hoe gemakkelijker het is om onze voorkeurstalen te automatiseren en ermee om te gaan. Ik hou van mijn datawetenschapstaal zoet, en de elegante oplossingen die daaruit voortvloeien zijn nog zoeter.

Verder lezen op de Toptal Engineering Blog:

creatSource link

Kloudy102.nl
Logo
Vergelijk items
  • Totaal (0)
Vergelijken
0
Shopping cart