Python vs. R: Sözdizimsel Şeker Büyüsü

Yayınlanan: 2022-07-22

Python ve R'de bulunan tatlılığı takdir etmeyi öğrendiğimden beri gelişim damak tadım genişledi. Veri bilimi, birçok açıdan yaklaşılabilen ancak dikkatli bir dil, kitaplık ve uzmanlık dengesi gerektiren bir sanattır. Python ve R'nin geniş yetenekleri, sözdizimsel şeker sağlar: işimizi kolaylaştıran ve karmaşık sorunları kısa, zarif çözümlerle çözmemizi sağlayan sözdizimi.

Bu diller, çözüm alanımızı keşfetmemiz için bize benzersiz yollar sağlar. Her dilin kendine özgü güçlü ve zayıf yönleri vardır. Her birini etkili bir şekilde kullanmanın püf noktası, her bir araçtan hangi problem türlerinin yararlandığını tanımak ve bulgularımızı nasıl iletmek istediğimize karar vermektir. Her dildeki sözdizimsel şeker, daha verimli çalışmamızı sağlar.

R ve Python, alt düzey kodun üzerinde etkileşimli arabirimler olarak işlev görür ve veri bilimcilerinin veri keşfi, görselleştirme ve modelleme için seçtikleri dili kullanmalarına olanak tanır. Bu etkileşim, işimizi gereksiz yere karmaşıklaştıran sürekli kod düzenleme ve derleme döngüsünden kaçınmamızı sağlar.

Bu üst düzey diller, minimum sürtünme ile çalışmamıza ve daha az kodla daha fazlasını yapmamıza olanak tanır. Her dilin sözdizimsel şekeri, kodun gerçek zamanlı olarak yürütülebildiği etkileşimli bir arayüz olan REPL'de (okuma-değerlendirme-yazdırma döngüsü) fikirlerimizi hızlı bir şekilde test etmemizi sağlar. Bu yinelemeli yaklaşım, modern veri süreci döngüsünde önemli bir bileşendir.

R ve Python: Etkileyici ve Uzmanlaşmış

R ve Python'un gücü, ifade ve esnekliklerinde yatar. Her dilin diğerinden daha güçlü olduğu belirli kullanım durumları vardır. Ek olarak, her dil farklı vektörler boyunca ve çok farklı çıktı türleriyle sorunları çözer. Bu stiller, bir dilin tercih edildiği farklı geliştirici topluluklarına sahip olma eğilimindedir. Her topluluk organik olarak büyüdükçe, tercih ettikleri dil ve özellik, sorunları çözmek için gereken kod hacmini azaltan benzersiz sözdizimsel şeker stillerine doğru eğilim gösterir. Topluluk ve dil olgunlaştıkça, dilin sözdizimsel şekeri genellikle daha da tatlı hale gelir.

Her dil, veri sorunlarını çözmek için güçlü bir araç seti sunsa da, bu sorunlara araçların belirli güçlü yönlerinden yararlanacak şekilde yaklaşmalıyız. R, bir istatistiksel hesaplama dili olarak doğmuştur ve istatistiksel analizler yapmak ve verileri açıklamak için geniş bir araç setine sahiptir. Python ve makine öğrenimi yaklaşımları, benzer sorunları çözer, ancak yalnızca bir makine öğrenimi modeline uyanları çözer. İstatistiksel hesaplamayı ve makine öğrenimini veri modelleme için iki okul olarak düşünün: Bu okullar birbirine son derece bağlı olsa da, veri modelleme için kökenleri ve paradigmaları farklıdır.

R İstatistikleri Seviyor

R, istatistiksel analiz, doğrusal modelleme ve görselleştirme için zengin bir paket teklifine dönüşmüştür. Bu paketler onlarca yıldır R ekosisteminin bir parçası oldukları için olgun, verimli ve iyi belgelenmişlerdir. Bir problem istatistiksel bir hesaplama yaklaşımı gerektirdiğinde, R bu iş için doğru araçtır.

R'nin topluluğu tarafından sevilmesinin başlıca nedenleri şunlardır:

  • Ayrık veri işleme, hesaplama ve filtreleme yöntemleri.
  • Bu yöntemleri bağlamak için esnek zincirleme operatörleri.
  • Geliştiricilerin rahat istatistiksel ve görselleştirme yöntemleri kullanarak karmaşık sorunları çözmesine olanak tanıyan kısa ve öz bir sözdizimsel şeker.

R ile Basit Bir Doğrusal Model

R'nin ne kadar özlü olabileceğini görmek için elmas fiyatlarını tahmin eden bir örnek oluşturalım. İlk olarak, verilere ihtiyacımız var. R ile yüklenen ve renk ve kesim gibi özellikleri içeren diamonds varsayılan veri setini kullanacağız.

Ayrıca, Unix komut satırı boru ( | ) operatörünün eşdeğeri olan R'nin boru operatörünü ( %>% ) göstereceğiz. R'nin sözdizimsel şeker özelliğinin bu popüler parçası, düzenli paket paketi tarafından sunulmaktadır. Bu operatör ve sonuçta ortaya çıkan kod stili, R fiillerinin (yani, R fonksiyonlarının) zincirlenmesine izin verdiği için R'de bir oyun değiştiricidir.

Aşağıdaki kod gerekli kitaplıkları yükler, verilerimizi işler ve doğrusal bir model oluşturur:

 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, sözdizimsel şekeri ile bu doğrusal denklemi programlamayı ve anlamayı kolaylaştırır. Şimdi dikkatimizi Python'un kral olduğu yere çevirelim.

Python, Makine Öğrenimi İçin En İyisidir

Python, scikit-learn, dengesiz-öğrenme ve Optuna gibi popüler kitaplıklardan yararlanan, makine öğrenimine odaklanan birincil kullanıcı topluluklarından biri ile güçlü, genel amaçlı bir dildir. TensorFlow, PyTorch ve Jax gibi en etkili makine öğrenimi araç setlerinin çoğu öncelikle Python için yazılmıştır.

Python'un sözdizimsel şekeri, kısa ve öz veri hattı sözdizimi ve scikit-learn'in uyum-dönüştürme-tahmin modeli de dahil olmak üzere, makine öğrenimi uzmanlarının sevdiği sihirdir:

  1. Modele hazırlamak için verileri dönüştürün.
  2. Bir model oluşturun (örtük veya açık).
  3. Modeli takın.
  4. Yeni verileri tahmin edin (denetimli model) veya verileri dönüştürün (denetimsiz).
    • Denetlenen modeller için yeni veri noktaları için bir hata metriği hesaplayın.

Scikit-learn kitaplığı, keşif ve görselleştirme için programlamayı basitleştirirken, bu modele uyan işlevselliği kapsar. Makine öğrenimi döngüsünün her adımına karşılık gelen, çapraz doğrulama, hiperparametre ayarlama ve işlem hatları sağlayan birçok özellik de vardır.

Elmas Makine Öğrenimi Modeli

Şimdi, R'de doğrudan karşılaştırması olmayan Python kullanan basit bir makine öğrenimi örneğine odaklanacağız. Aynı veri setini kullanacağız ve çok sıkı bir kod parçasında sığdır-dönüştür-tahmin modelini vurgulayacağız.

Bir makine öğrenimi yaklaşımının ardından, verileri eğitim ve test bölümlerine ayıracağız. Aynı dönüşümleri her bölüme uygulayacağız ve içerdiği işlemleri bir ardışık düzen ile zincirleyeceğiz. Yöntemler (uyum ve puan), scikit-learn'de bulunan güçlü makine öğrenimi yöntemlerinin temel örnekleridir:

 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'da makine öğrenme sürecinin ne kadar akıcı olduğunu görebiliriz. Ek olarak, Python'un sklearn sınıfları, geliştiricilerin, modelimiz üzerinden veri geçirmeyle ilgili sızıntılardan ve sorunlardan kaçınmasına yardımcı olurken, aynı zamanda yapılandırılmış ve üretim düzeyinde kod oluşturur.

R ve Python Başka Ne Yapabilir?

İstatistiksel uygulamaları çözmenin ve makine öğrenimi modelleri oluşturmanın yanı sıra, R ve Python, raporlama, API'ler, etkileşimli panolar ve harici düşük seviyeli kod kitaplıklarının basit bir şekilde dahil edilmesinde mükemmeldir.

Geliştiriciler hem R'de hem de Python'da etkileşimli raporlar oluşturabilir, ancak bunları R'de geliştirmek çok daha kolaydır. R ayrıca bu raporları PDF ve HTML'ye aktarmayı da destekler.

Her iki dil de veri bilimcilerinin etkileşimli veri uygulamaları oluşturmasına olanak tanır. R ve Python, bu uygulamaları oluşturmak için sırasıyla Shiny ve Streamlit kitaplıklarını kullanır.

Son olarak, R ve Python, düşük seviyeli koda harici bağlamaları destekler. Bu genellikle, yüksek performanslı işlemleri bir kitaplığa enjekte etmek ve ardından bu işlevleri tercih edilen dilden çağırmak için kullanılır. R, Rcpp paketini kullanırken Python bunu gerçekleştirmek için pybind11 paketini kullanır.

Python ve R: Her Gün Daha Tatlı Oluyor

Veri bilimcisi olarak işimde hem R hem de Python'u düzenli olarak kullanıyorum. Anahtar, her bir dilin en güçlü olduğu yeri anlamak ve ardından bir sorunu zarif bir şekilde kodlanmış bir çözüme uyacak şekilde ayarlamaktır.

Veri bilimcileri, müşterilerle iletişim kurarken bunu en kolay anlaşılan dilde yapmak ister. Bu nedenle, istatistiksel veya makine öğrenmesi sunumunun daha etkili olup olmadığını tartmalı ve ardından en uygun programlama dilini kullanmalıyız.

Python ve R'nin her biri, hem veri bilimcileri olarak işimizi basitleştiren hem de başkaları için anlaşılabilirliğini kolaylaştıran, sürekli büyüyen bir sözdizimsel şeker koleksiyonu sağlar. Sözdizimimiz ne kadar rafine olursa, tercih ettiğimiz dillerle otomatikleştirmek ve etkileşim kurmak o kadar kolay olur. Veri bilimi dilimi tatlı seviyorum ve ortaya çıkan zarif çözümler daha da tatlı.

Toptal Mühendislik Blogunda Daha Fazla Okuma:

  • Makine Öğrenimi Teorisine Giriş ve Uygulamaları: Örneklerle Görsel Bir Eğitim
  • Python Tasarım Modelleri: Şık ve Modaya Uygun Kod İçin
  • R ve Gephi'de Sosyal Ağ Analizi: Twitter'a Girmek
  • Denetimli Makine Öğrenimi Algoritmalarını Keşfetme
  • Temiz Kodun Sağlanması: Python'a Bir Bakış, Parametreli