Python vs. R: วากยสัมพันธ์ Sugar Magic

เผยแพร่แล้ว: 2022-07-22

เพดานปากในการพัฒนาของฉันขยายออกไปตั้งแต่ฉันได้เรียนรู้ที่จะชื่นชมความหวานที่พบใน Python และ R Data Science เป็นศิลปะที่สามารถเข้าถึงได้จากหลากหลายมุมมอง แต่ต้องใช้ความสมดุลของภาษา ห้องสมุด และความเชี่ยวชาญอย่างระมัดระวัง ความสามารถที่กว้างขวางของ Python และ R ทำให้เกิด syntax sugar: syntax ที่ช่วยให้งานของเราง่ายขึ้น และช่วยให้เราจัดการกับปัญหาที่ซับซ้อนด้วยวิธีแก้ปัญหาที่สั้นและสวยงาม

ภาษาเหล่านี้ทำให้เรามีวิธีที่ไม่ซ้ำกันในการสำรวจพื้นที่โซลูชันของเรา แต่ละภาษามีจุดแข็งและจุดอ่อนของตัวเอง เคล็ดลับในการใช้แต่ละอย่างอย่างมีประสิทธิภาพคือการรู้ว่าปัญหาประเภทใดได้รับประโยชน์จากเครื่องมือแต่ละอย่าง และตัดสินใจว่าเราต้องการสื่อสารสิ่งที่ค้นพบของเราอย่างไร น้ำตาลวากยสัมพันธ์ในแต่ละภาษาช่วยให้เราทำงานได้อย่างมีประสิทธิภาพมากขึ้น

R และ Python ทำหน้าที่เป็นอินเทอร์เฟซแบบโต้ตอบที่ด้านบนของโค้ดระดับล่าง ช่วยให้นักวิทยาศาสตร์ข้อมูลสามารถใช้ภาษาที่เลือกไว้สำหรับการสำรวจข้อมูล การสร้างภาพ และการสร้างแบบจำลอง การโต้ตอบนี้ช่วยให้เราหลีกเลี่ยงการแก้ไขและคอมไพล์โค้ดอย่างไม่หยุดยั้ง ซึ่งทำให้งานของเราซับซ้อนโดยไม่จำเป็น

ภาษาระดับสูงเหล่านี้ช่วยให้เราทำงานได้โดยแทบไม่ต้องเสียอะไรเลย และทำสิ่งต่างๆ ได้มากขึ้นด้วยโค้ดที่น้อยลง วากยสัมพันธ์ของแต่ละภาษาช่วยให้เราสามารถทดสอบแนวคิดของเราได้อย่างรวดเร็วใน REPL (การอ่าน-ประเมิน-พิมพ์วนซ้ำ) ซึ่งเป็นอินเทอร์เฟซแบบโต้ตอบที่สามารถเรียกใช้โค้ดได้แบบเรียลไทม์ วิธีการวนซ้ำนี้เป็นองค์ประกอบสำคัญในวงจรกระบวนการข้อมูลสมัยใหม่

R vs. Python: แสดงออกและเชี่ยวชาญ

พลังของ R และ Python อยู่ที่การแสดงออกและความยืดหยุ่น แต่ละภาษามีกรณีการใช้งานเฉพาะซึ่งมีประสิทธิภาพมากกว่าภาษาอื่น นอกจากนี้ แต่ละภาษายังแก้ปัญหาตามเวกเตอร์ต่างๆ และด้วยเอาต์พุตประเภทต่างๆ ที่แตกต่างกันมาก สไตล์เหล่านี้มักจะมีชุมชนนักพัฒนาที่แตกต่างกันซึ่งต้องการใช้ภาษาเดียว เมื่อแต่ละชุมชนเติบโตขึ้นแบบออร์แกนิก ภาษาและคุณลักษณะที่พวกเขาต้องการจะกำหนดแนวโน้มไปสู่รูปแบบน้ำตาลเชิงวากยสัมพันธ์ที่ไม่ซ้ำใคร ซึ่งลดปริมาณโค้ดที่จำเป็นในการแก้ปัญหา และเมื่อชุมชนและภาษาเติบโตขึ้น วากยสัมพันธ์ของภาษาก็มักจะหวานยิ่งขึ้น

แม้ว่าแต่ละภาษาจะมีชุดเครื่องมือที่มีประสิทธิภาพสำหรับการแก้ปัญหาข้อมูล เราต้องแก้ไขปัญหาเหล่านั้นด้วยวิธีที่ใช้ประโยชน์จากจุดแข็งเฉพาะของเครื่องมือ R ถือกำเนิดขึ้นเป็นภาษาคอมพิวเตอร์เชิงสถิติและมีชุดเครื่องมือมากมายสำหรับการวิเคราะห์ทางสถิติและอธิบายข้อมูล Python และวิธีการเรียนรู้ด้วยเครื่องของมันแก้ปัญหาที่คล้ายคลึงกัน แต่เฉพาะปัญหาที่เข้ากับโมเดลการเรียนรู้ของเครื่องเท่านั้น คิดว่าการคำนวณทางสถิติและแมชชีนเลิร์นนิงเป็นโรงเรียนสองแห่งสำหรับการสร้างแบบจำลองข้อมูล: แม้ว่าโรงเรียนเหล่านี้จะเชื่อมโยงถึงกันอย่างมาก แต่ต้นกำเนิดและกระบวนทัศน์สำหรับการสร้างแบบจำลองข้อมูลนั้นแตกต่างกัน

R รักสถิติ

R ได้พัฒนาเป็นแพ็คเกจที่หลากหลายสำหรับการวิเคราะห์ทางสถิติ การสร้างแบบจำลองเชิงเส้น และการแสดงภาพ เนื่องจากแพ็คเกจเหล่านี้เป็นส่วนหนึ่งของระบบนิเวศ R มานานหลายทศวรรษ แพ็คเกจเหล่านี้จึงมีความสมบูรณ์ มีประสิทธิภาพ และได้รับการจัดทำเป็นเอกสารอย่างดี เมื่อปัญหาเรียกร้องให้ใช้วิธีคำนวณทางสถิติ R เป็นเครื่องมือที่เหมาะสมสำหรับงาน

เหตุผลหลักที่ R เป็นที่รักของชุมชน ได้แก่:

  • การจัดการข้อมูล การคำนวณ และการกรองข้อมูลแบบไม่ต่อเนื่อง
  • ตัวดำเนินการ chaining ที่ยืดหยุ่นเพื่อเชื่อมต่อวิธีการเหล่านั้น
  • น้ำตาลประโยคประโยคสั้นๆ ที่ช่วยให้นักพัฒนาสามารถแก้ปัญหาที่ซับซ้อนได้โดยใช้วิธีการทางสถิติและการแสดงภาพที่สะดวกสบาย

แบบจำลองเชิงเส้นอย่างง่ายด้วย R

หากต้องการดูว่า R รวบรัดเพียงใด ให้สร้างตัวอย่างที่คาดการณ์ราคาเพชร อันดับแรก เราต้องการข้อมูล เราจะใช้ชุดข้อมูลเริ่มต้นของ diamonds ซึ่งติดตั้งด้วย R และมีคุณลักษณะต่างๆ เช่น สีและการเจียระไน

นอกจากนี้เรายังจะสาธิตตัวดำเนินการไพพ์ของ R ( %>% ) ซึ่งเทียบเท่ากับตัวดำเนินการไพพ์บรรทัดคำสั่ง Unix ( | ) ฟีเจอร์น้ำตาลวากยสัมพันธ์ของ R ที่ได้รับความนิยมนี้จัดทำขึ้นโดยชุดแพ็คเกจที่เป็นระเบียบ โอเปอเรเตอร์นี้และรูปแบบโค้ดที่เป็นผลลัพธ์เป็นตัวเปลี่ยนเกมใน 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, imbalanced-learn และ Optuna ชุดเครื่องมือการเรียนรู้ของเครื่องที่ทรงอิทธิพลที่สุดมากมาย เช่น TensorFlow, PyTorch และ Jax ถูกเขียนขึ้นสำหรับ Python เป็นหลัก

น้ำตาลซินแทกติกของ Python เป็นเวทมนตร์ที่ผู้เชี่ยวชาญด้านแมชชีนเลิร์นนิงชื่นชอบ รวมถึงไวยากรณ์ไปป์ไลน์ข้อมูลที่กระชับ เช่นเดียวกับ scikit-learn's fit-transform-predict pattern:

  1. แปลงข้อมูลเพื่อเตรียมพร้อมสำหรับโมเดล
  2. สร้างแบบจำลอง (โดยนัยหรือโดยชัดแจ้ง)
  3. พอดีกับรุ่น
  4. ทำนายข้อมูลใหม่ (แบบจำลองภายใต้การดูแล) หรือแปลงข้อมูล (ไม่ได้ดูแล)
    • สำหรับโมเดลภายใต้การดูแล ให้คำนวณตัววัดข้อผิดพลาดสำหรับจุดข้อมูลใหม่

ไลบรารี scikit-learn สรุปฟังก์ชันการทำงานที่ตรงกับรูปแบบนี้ ในขณะที่ทำให้การเขียนโปรแกรมสำหรับการสำรวจและการแสดงภาพง่ายขึ้น นอกจากนี้ยังมีคุณสมบัติมากมายที่สอดคล้องกับแต่ละขั้นตอนของวัฏจักรการเรียนรู้ของเครื่อง ซึ่งให้การตรวจสอบความถูกต้อง การปรับพารามิเตอร์ไฮเปอร์พารามิเตอร์ และไปป์ไลน์

โมเดลการเรียนรู้ของเครื่องเพชร

ตอนนี้เราจะเน้นที่ตัวอย่างการเรียนรู้ของเครื่องอย่างง่ายโดยใช้ Python ซึ่งไม่มีการเปรียบเทียบโดยตรงใน R เราจะใช้ชุดข้อมูลเดียวกันและเน้นรูปแบบ fit-transform-predict ในโค้ดที่แน่นมาก

ตามแนวทางการเรียนรู้ของเครื่อง เราจะแบ่งข้อมูลออกเป็นพาร์ติชั่นการฝึกอบรมและการทดสอบ เราจะใช้การแปลงแบบเดียวกันนี้กับแต่ละพาร์ติชั่นและโยงการดำเนินการที่มีอยู่ด้วยไปป์ไลน์ วิธีการ (พอดีและให้คะแนน) เป็นตัวอย่างสำคัญของวิธีการเรียนรู้ของเครื่องที่มีประสิทธิภาพซึ่งมีอยู่ใน 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 ยังเชี่ยวชาญในการรายงาน, API, แดชบอร์ดแบบโต้ตอบ และการรวมไลบรารีโค้ดระดับต่ำภายนอกอย่างง่าย

นักพัฒนาสามารถสร้างรายงานเชิงโต้ตอบได้ทั้งใน R และ Python แต่การพัฒนาใน R นั้นง่ายกว่ามาก นอกจากนี้ R ยังสนับสนุนการส่งออกรายงานเหล่านั้นเป็น PDF และ HTML

ทั้งสองภาษาช่วยให้นักวิทยาศาสตร์ข้อมูลสร้างแอปพลิเคชันข้อมูลแบบโต้ตอบได้ R และ Python ใช้ไลบรารี Shiny และ Streamlit ตามลำดับ เพื่อสร้างแอปพลิเคชันเหล่านี้

สุดท้ายทั้ง R และ Python รองรับการเชื่อมโยงภายนอกกับโค้ดระดับต่ำ โดยทั่วไปจะใช้เพื่อแทรกการดำเนินการที่มีประสิทธิภาพสูงลงในไลบรารีแล้วเรียกใช้ฟังก์ชันเหล่านั้นจากภายในภาษาที่เลือก R ใช้แพ็คเกจ Rcpp ในขณะที่ Python ใช้แพ็คเกจ pybind11 เพื่อทำสิ่งนี้ให้สำเร็จ

Python และ R: หวานขึ้นทุกวัน

ในงานของฉันในฐานะนักวิทยาศาสตร์ข้อมูล ฉันใช้ทั้ง R และ Python เป็นประจำ กุญแจสำคัญคือการทำความเข้าใจว่าแต่ละภาษามีความเข้มแข็งมากที่สุดแล้วปรับปัญหาให้เข้ากับโซลูชันที่มีการเข้ารหัสอย่างหรูหรา

เมื่อสื่อสารกับลูกค้า นักวิทยาศาสตร์ข้อมูลต้องการทำเช่นนั้นในภาษาที่เข้าใจได้ง่ายที่สุด ดังนั้น เราต้องชั่งน้ำหนักว่าการนำเสนอทางสถิติหรือแมชชีนเลิร์นนิงมีประสิทธิภาพมากกว่า จากนั้นจึงใช้ภาษาโปรแกรมที่เหมาะสมที่สุด

Python และ R ต่างก็มีคอลเลกชั่นน้ำตาลซินแทคติกเพิ่มขึ้นเรื่อยๆ ซึ่งทำให้งานของเราง่ายขึ้นในฐานะนักวิทยาศาสตร์ด้านข้อมูล และทำให้ผู้อื่นเข้าใจได้ง่ายขึ้น ยิ่งไวยากรณ์ของเราละเอียดขึ้นเท่าใด การทำให้เป็นอัตโนมัติและโต้ตอบกับภาษาที่เราต้องการก็จะยิ่งง่ายขึ้นเท่านั้น ฉันชอบภาษาศาสตร์ข้อมูลของฉันที่หวาน และโซลูชันที่สวยงามซึ่งให้ผลลัพธ์นั้นหวานยิ่งกว่า

อ่านเพิ่มเติมในบล็อก Toptal Engineering:

  • บทนำสู่ทฤษฎีแมชชีนเลิร์นนิงและการประยุกต์: การสอนด้วยภาพพร้อมตัวอย่าง
  • รูปแบบการออกแบบหลาม: สำหรับโค้ดที่เก๋ไก๋และทันสมัย
  • การวิเคราะห์เครือข่ายโซเชียลใน R และ Gephi: การขุดลงใน Twitter
  • สำรวจอัลกอริธึมการเรียนรู้ของเครื่องภายใต้การดูแล
  • การตรวจสอบโค้ดที่สะอาด: ดูที่ Python, Parameterized