بيثون مقابل آر: سحر السكر النحوي
نشرت: 2022-07-22لقد توسع ذوقي التنموي منذ أن تعلمت أن أقدر الحلاوة الموجودة في Python و R. يعد علم البيانات فنًا يمكن مقاربته من زوايا متعددة ولكنه يتطلب توازنًا دقيقًا بين اللغة والمكتبات والخبرة. توفر الإمكانات الموسعة لـ Python و R سكرًا نحويًا: بناء الجملة الذي يسهل عملنا ويسمح لنا بمعالجة المشكلات المعقدة بحلول قصيرة وأنيقة.
توفر لنا هذه اللغات طرقًا فريدة لاستكشاف مساحة الحلول لدينا. كل لغة لها نقاط قوتها وضعفها. تكمن الحيلة في استخدام كل منها بفعالية في التعرف على أنواع المشكلات التي تستفيد من كل أداة وتحديد الطريقة التي نريد بها توصيل النتائج التي توصلنا إليها. يسمح لنا السكر النحوي في كل لغة بالعمل بكفاءة أكبر.
تعمل R و Python كواجهات تفاعلية أعلى رمز المستوى الأدنى ، مما يسمح لعلماء البيانات باستخدام لغتهم المختارة لاستكشاف البيانات ، والتصور ، والنمذجة. يمكّننا هذا التفاعل من تجنب الحلقة المستمرة لتحرير وتجميع التعليمات البرمجية ، مما يعقد عملنا بلا داع.
تتيح لنا هذه اللغات عالية المستوى العمل بأقل قدر من الاحتكاك والقيام بالمزيد باستخدام كود أقل. يتيح لنا السكر النحوي لكل لغة اختبار أفكارنا بسرعة في REPL (حلقة القراءة-التقييم-الطباعة) ، وهي واجهة تفاعلية حيث يمكن تنفيذ التعليمات البرمجية في الوقت الفعلي. يعد هذا النهج التكراري مكونًا رئيسيًا في دورة معالجة البيانات الحديثة.
R مقابل Python: معبرة ومتخصصة
تكمن قوة R و Python في تعبيرهما ومرونتهما. لكل لغة حالات استخدام محددة تكون فيها أقوى من الأخرى. بالإضافة إلى ذلك ، تحل كل لغة المشكلات على طول نواقل مختلفة وأنواع مختلفة جدًا من المخرجات. تميل هذه الأنماط إلى وجود مجتمعات مطورين مختلفة حيث يتم تفضيل لغة واحدة. مع نمو كل مجتمع بشكل عضوي ، تحدد لغته وميزاته المفضلة الاتجاه نحو أنماط السكر النحوية الفريدة التي تقلل من حجم الشفرة المطلوبة لحل المشكلات. ومع نضوج المجتمع واللغة ، غالبًا ما يصبح السكر النحوي للغة أكثر حلاوة.
على الرغم من أن كل لغة توفر مجموعة أدوات قوية لحل مشاكل البيانات ، يجب أن نتعامل مع هذه المشكلات بطرق تستغل نقاط القوة الخاصة للأدوات. وُلدت لغة R كلغة حوسبة إحصائية ولديها مجموعة واسعة من الأدوات المتاحة لإجراء التحليلات الإحصائية وشرح البيانات. بايثون وأساليب التعلم الآلي الخاصة بها تحل مشاكل مماثلة ولكن فقط تلك التي تتناسب مع نموذج التعلم الآلي. فكر في الحوسبة الإحصائية والتعلم الآلي كمدرستين لنمذجة البيانات: على الرغم من أن هذه المدارس مترابطة بشكل كبير ، إلا أن أصولها ونماذجها لنمذجة البيانات مختلفة.
R يحب الإحصاء
تطورت R إلى عرض حزمة غني للتحليل الإحصائي والنمذجة الخطية والتصور. نظرًا لأن هذه الحزم كانت جزءًا من النظام البيئي R لعقود ، فهي ناضجة وفعالة وموثقة جيدًا. عندما تستدعي المشكلة اتباع نهج الحوسبة الإحصائية ، فإن R هي الأداة المناسبة للوظيفة.
تتلخص الأسباب الرئيسية التي تجعل R محبوبًا من قبل مجتمعها في:
- طرق معالجة البيانات المنفصلة والحساب والتصفية.
- عوامل ربط مرنة لربط هذه الطرق.
- سكر نحوي موجز يتيح للمطورين حل المشكلات المعقدة باستخدام طرق إحصائية وتصور مريحة.
نموذج خطي بسيط مع R.
لنرى إلى أي مدى يمكن أن تكون R مقتضبة ، فلنقم بإنشاء مثال يتنبأ بأسعار الماس. أولا ، نحن بحاجة إلى البيانات. diamonds
مجموعة البيانات الافتراضية لـ Diamonds ، والتي يتم تثبيتها مع R وتحتوي على سمات مثل اللون والقطع.
سنقوم أيضًا بتوضيح عامل تشغيل الأنابيب R ( %>%
) ، وهو ما يعادل مشغل أنبوب سطر أوامر Unix ( |
). يتم توفير هذه القطعة الشهيرة من ميزة السكر النحوية لـ 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 هذه المعادلة الخطية سهلة البرمجة والفهم باستخدام سكرها النحوي. الآن ، دعنا نحول انتباهنا إلى حيث تكون بايثون هي الملك.
Python هي الأفضل لتعلم الآلة
Python هي لغة قوية وذات أغراض عامة ، حيث تركز إحدى مجتمعات المستخدمين الأساسية الخاصة بها على التعلم الآلي ، والاستفادة من المكتبات الشائعة مثل scikit-Learn ، والتعلم غير المتوازن ، و Optuna. تمت كتابة العديد من مجموعات أدوات التعلم الآلي الأكثر تأثيرًا ، مثل TensorFlow و PyTorch و Jax ، بشكل أساسي لبايثون.
السكر النحوي في Python هو السحر الذي يحبه خبراء التعلم الآلي ، بما في ذلك بناء جملة موجز لخطوط البيانات ، بالإضافة إلى نمط scikit-Learn المناسب للتحويل والتنبؤ:
- تحويل البيانات لإعدادها للنموذج.
- بناء نموذج (ضمني أو صريح).
- تناسب النموذج.
- توقع بيانات جديدة (نموذج خاضع للإشراف) أو قم بتحويل البيانات (غير خاضعة للإشراف).
- بالنسبة للنماذج الخاضعة للإشراف ، احسب مقياس خطأ لنقاط البيانات الجديدة.
تقوم مكتبة scikit-Learn بتلخيص الوظائف المطابقة لهذا النمط مع تبسيط البرمجة للاستكشاف والتصور. هناك أيضًا العديد من الميزات المقابلة لكل خطوة من خطوات دورة التعلم الآلي ، مما يوفر التحقق المتقاطع وضبط المعلمة الفائقة وخطوط الأنابيب.
نموذج التعلم الآلي الماسي
سنركز الآن على مثال بسيط للتعلم الآلي باستخدام Python ، والذي ليس له مقارنة مباشرة في R. سنستخدم نفس مجموعة البيانات ونبرز نمط fit-convert-Forecast في جزء ضيق جدًا من التعليمات البرمجية.
باتباع نهج التعلم الآلي ، سنقوم بتقسيم البيانات إلى أقسام تدريب واختبار. سنطبق نفس التحويلات على كل قسم ونقوم بتسلسل العمليات المحتواة بخط أنابيب. تعد الأساليب (الملاءمة والنتيجة) أمثلة رئيسية على أساليب التعلم الآلي القوية الواردة في 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}")
يمكننا أن نرى مدى تبسيط عملية التعلم الآلي في Python. بالإضافة إلى ذلك ، تساعد فئات sklearn
في Python المطورين على تجنب التسريبات والمشكلات المتعلقة بتمرير البيانات من خلال نموذجنا مع إنشاء رمز منظم ومستوى الإنتاج.
ما الذي يمكن أن يفعله R و Python أيضًا؟
بصرف النظر عن حل التطبيقات الإحصائية وإنشاء نماذج التعلم الآلي ، تتفوق R و Python في إعداد التقارير وواجهات برمجة التطبيقات ولوحات المعلومات التفاعلية والإدراج البسيط لمكتبات الرموز الخارجية منخفضة المستوى.
يمكن للمطورين إنشاء تقارير تفاعلية في كل من R و Python ، ولكن تطويرها في R. R يدعم أيضًا تصدير هذه التقارير إلى PDF و HTML.
تسمح كلتا اللغتين لعلماء البيانات بإنشاء تطبيقات بيانات تفاعلية. يستخدم R و Python المكتبات Shiny و Streamlit ، على التوالي ، لإنشاء هذه التطبيقات.
أخيرًا ، يدعم كل من R و Python الروابط الخارجية للتعليمات البرمجية منخفضة المستوى. يستخدم هذا عادةً لحقن عمليات عالية الأداء في مكتبة ثم استدعاء هذه الوظائف من داخل اللغة التي تختارها. يستخدم R حزمة Rcpp ، بينما يستخدم Python حزمة pybind11 لإنجاز ذلك.
Python and R: الحصول على أحلى كل يوم
في عملي كعالم بيانات ، أستخدم كل من R و Python بانتظام. المفتاح هو فهم المكان الذي تكون فيه كل لغة أقوى ثم ضبط المشكلة لتلائم حل مشفر بأناقة.
عند التواصل مع العملاء ، يريد علماء البيانات القيام بذلك باللغة التي يسهل فهمها. لذلك ، يجب علينا تقييم ما إذا كان العرض التقديمي الإحصائي أو التعلم الآلي أكثر فعالية ثم استخدام لغة البرمجة الأكثر ملاءمة.
يوفر كل من Python و R مجموعة متزايدة باستمرار من السكر النحوي ، مما يبسط عملنا كعلماء بيانات ويسهل فهمه للآخرين. كلما زادت دقة تركيبنا ، أصبح من الأسهل أتمتة اللغات المفضلة لدينا والتفاعل معها. أنا أحب لغة علم البيانات الخاصة بي ، والحلول الأنيقة التي تنتج عنها أحلى.
مزيد من القراءة على مدونة Toptal Engineering:
- مقدمة في نظرية التعلم الآلي وتطبيقاتها: دروس مرئية بأمثلة
- أنماط تصميم Python: للحصول على كود أنيق وعصري
- تحليل الشبكة الاجتماعية في R و Gephi: البحث في Twitter
- استكشاف خوارزميات التعلم الآلي الخاضعة للإشراف
- ضمان الكود النظيف: نظرة على بايثون ، ذات معلمات