PyCaret Vs scikit-learn เปรียบเทียบไลบรารีช่วยวิเคราะห์ข้อมูล (3/3)

Thanakorn Thaminkaew
5 min readMay 15, 2022

--

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

การทำงานภายในของ PyCaret เทียบกับ scikit-learn

จากตอนที่หนึ่งที่ผมได้อธิบายว่า “PyCaret ถูกพัฒนาด้วยการเปลี่ยนแปลงพฤติกรรมการทำงานของฟังก์ชั่นหรือคลาส (wrapper) ของไลบรารีที่ถูกใช้บ่อยในการวิเคราะห์ข้อมูล” ทำให้ผลลัพธ์ที่ได้จาก PyCaret จะไม่ต่างจากการประมวลผลด้วยไลบรารีหลักโดยตรง ซึ่งหนึ่งในไลบรารีที่ PyCaret อ้างถึงก็คือ scikit-learn

ดังนั้น เพื่อให้ท่านเห็นภาพการทำงานของ PyCaret ผมจะใช้ PyCaret และ scikit-learn ในการวิเคราะห์ข้อมูลด้วยโจทย์การจำแนกแบบไบนารี (binary classification) ด้วยข้อมูลที่รู้จักอย่างแพร่หลายนั่นคือ Titanic dataset (ข้อมูลผู้รอดชีวิตจากการล่มของเรือไททานิก) ซึ่งทั้งสองเครื่องมือจะต้องทำการแบ่งข้อมูล ทำความสะอาดข้อมูล สร้างโมเดลต้นไม้การตัดสินใจ (decision tree) และวัดผลของโมเดล โดยที่โค้ดการเขียนทั้งหมด จะอยู่ใน google colab ซึ่งท่านสามารถทดลองเล่นระหว่างการอ่านบทความได้ ที่นี่

สำหรับตัวอย่างนี้ ผมเริ่มจากการโหลดข้อมูลไททานิกด้วยคำสั่ง

import pandas as pdtraining_data = pd.read_csv("https://storage.googleapis.com/tf-datasets/titanic/train.csv")unseen_data = pd.read_csv("https://storage.googleapis.com/tf-datasets/titanic/eval.csv")

ข้อมูลสำหรับการพัฒนาโมเดลชุดนี้มีจำนวน 627 ตัวอย่าง และมีตัวแปร 10 ตัว ซึ่งมีความหมาย ดังนี้

  • survived: ค่าที่ต้องการทำนาย ( 0 = เสียชีวิต; 1 = รอดชีวิต)
  • sex: เพศ (male = ชาย; female = หญิง)
  • age: อายุ
  • n_siblings_spouses: จำนวนพี่น้องและคู่สมรส
  • parch: จำนวนผู้ปกครองหรือเด็กบนเครื่องที่เกี่ยวข้องกับผู้โดยสาร
  • fare: ราคาตั๋ว
  • class: ชั้นของตั๋ว (First = ชั้นหนึ่ง; Second = ชั้นสอง; Third = ชั้นสาม)
  • deck: ชั้นของที่พัก (A, B, C, D, E, F, G, unknown)
  • embark_town: เมืองที่ขึ้นเรือ (Southampton, Cherbourg, Queenstown, unknown)
  • alone: ขึ้นเรือคนเดียว (y = ใช่; n = ไม่ใช่)

การทำงานของ PyCaret

ขั้นตอนการเตรียมข้อมูลนั้น เริ่มจากคำสั่ง setup() บรรทัดเดียว โดยที่คำสั่งดังกล่าวทำจัดเตรียมและแปรงค่าข้อมูลให้พร้อมใช้งานให้เสร็จสรรพ

from pycaret.classification import *prep_data = setup(data = pycaret_training_data, target = 'survived')

รายละเอียดของการจัดเตรียมข้อมูลทั้งหมดของ PyCaret

ในบทความนี้ ผมขอยกตัวอย่างเบื้องหลัง PyCaret ในการตรวจสอบประเภทของแต่ละตัวแปรว่าเป็น กลุ่ม ตัวเลข เวลา หรือวันที่ ซึ่งมีการเรียกใช้เครื่องมือไลบรารี pandas ในบางคำสั่งเข้าช่วย ดังนี้

ที่มา https://github.com/pycaret/pycaret/blob/master/pycaret/internal/preprocess.py

สำหรับการสร้างโมเดลวิเคราะห์ข้อมูลดังกล่าวด้วยโมเดลต้นไม้การตัดสินใจใน PyCaret สามารถทำได้ด้วยคำสั่ง

best_model = create_model('dt')
tuned_best_model = tune_model(best_model)

เมื่อโมเดลถูกปรับค่าพารามิเตอร์ที่เหมาะสม (hyperparameter tuning) แล้ว ค่าความแม่นยำเพิ่มขึ้นจาก 0.7236 เป็น 0.7900 ซึ่งหากเข้าไปดูการทำงานเบื้องหลัง จะพบว่า PyCaret ใช้ไลบรารี scikit-learn มีการตั้งค่าการปรับค่าพารามิเตอร์แต่ละตัวที่ต่างกันออกไปตามรูปข้างล่าง

ที่มา https://github.com/pycaret/pycaret/blob/09b302386c04f103eb56d848e70092503ff83b03/pycaret/containers/models/classification.py

ทั้งนี้ สำหรับโมเดลที่ดีที่สุดที่ PyCaret เลือกใช้คือ max_depth=15, max_features=1.0, min_samples_leaf=4 และ min_samples_split=5

หลังจากนั้นผมทำการแสดงแผนภูมิผลลัพธ์ของโมเดลด้วยตารางสรุปผลความแม่นยำของโมเดล (confustion matrix)

plot_model(tuned_best_model, plot = 'confusion_matrix')

ซึ่งแผนภูมิดังกล่าวสร้างมาจากไลบรารี Yellowbrick ซึ่งช่วยในการสร้างแผนภูมิที่เกี่ยวข้องกับการเรียนรู้ด้วยเครื่อง

ที่มา https://github.com/pycaret/pycaret/blob/ccef84d80e8e0fc97ead20e8be961b29ec13821c/pycaret/internal/tabular.py

นอกจากนี้ ผมสร้างแผนภูมิแสดงค่าความสำคัญของตัวแปรต่อการพัฒนาโมเดลด้วยการคำนวน feature importance

plot_model(tuned_best_model, plot = 'feature')

ซึ่งแผนภูมิดังกล่าวสร้างมาจากไลบรารี Matplotlib ที่ช่วยสร้างแผนภูมิในภาษา Python โดยสังเกตได้จากการเรียน “plt.” ซึ่งอ้างถึงการเรียนไลบรารีก่อนหน้านี้ด้วยคำสั่ง import matplotlib.pyplot as plt

ที่มา https://github.com/pycaret/pycaret/blob/ccef84d80e8e0fc97ead20e8be961b29ec13821c/pycaret/internal/tabular.py

การทำงานของ scikit-learn

ขั้นตอนการเตรียมข้อมูลด้วยวิธีปกตินั้นยุ่งยากมากกว่า เพราะ scikit-learn ไม่มีเครื่องมือจัดการโดยตรง ทำให้ท่านจะต้องทำการตรวจสอบข้อมูลเองด้วยคำสั่ง

sklearn_training_data = training_data.copy()sklearn_training_data.describe(include = 'all')

จากนั้นหากท่านต้องการแปลงข้อมูลที่เป็นกลุ่ม (categorial features) ให้อยู่ในรูปแบบที่เหมาะต่อการพัฒนาโมเดลด้วยเทคนิค one-hot encoding (ศึกษาได้เพิ่มเติม ที่นี่) ท่านจะต้องเขียนคำสั่งขึ้นมาเอง เพื่อให้ข้อมูลเหมาะสมกับการพัฒนาโมเดล

ที่มา https://github.com/pycaret/pycaret/blob/04bb337a1a5ca3635193745a403f857f874bb2b8/pycaret/internal/preprocess.py

ท่านสามารถแบ่งข้อมูลออกเป็นกลุ่มตัวแปรที่ใช้ในการทำนาย (sklearn_x) และค่าที่ต้องการทำนาย (sklearn_y) ด้วยคำสั่ง

sklearn_x = sklearn_training_data.drop(['survived'], axis=1)sklearn_y = sklearn_training_data['survived']

และทำการพัฒนาโมเดลต้นไม้การตัดสินใจพร้อมหาค่าความแม่นยำของโมเดลเฉลี่ยด้วยการทดสอบย่อย 10 ครั้ง (10 fold cross validation) ซึ่งท่านสามารถศึกษาได้เพิ่มเติม ที่นี

from sklearn import tree
from sklearn.model_selection import cross_validate
classifier = tree.DecisionTreeClassifier()sklearn_prediction = pd.DataFrame(cross_validate(classifier,sklearn_x, sklearn_y,cv=10))

ในส่วนของการปรับค่าพารามิเตอร์ที่เหมาะสมนั้น ท่านจะต้องเข้าไปศึกษาตามคู่มือที่เป็นทางการ (ที่นี่) เพื่อหาค่าการปรับที่เหมาะสม (สามารถศึกษาเพิ่มเติมได้ ที่นี่) ก่อนที่จะเขียนคำสั่งได้

สำหรับตัวอย่างนี้ ผมลองปรับค่า max_depth จาก 0 ถึง 10 ที่ทำให้โมเดลมีค่าความแม่นยำเพิ่มขึ้น ซึ่งช่วยให้ค่าความแม่นยำเพิ่มขึ้นจาก 0.7512 เป็น 0.8198 ด้วยค่า max_depth ที่ดีที่สุดคือ 4 ตามรูปด้านล่าง

สำหรับการคำนวนตารางสรุปผลความแม่นยำของโมเดล (confustion matrix) นั้น มีขั้นตอนเพิ่มขึ้นเมื่อเทียบกับ PyCaret ดังนี้

คล้ายกันสำหรับค่าความสำคัญของตัวแปรต่อการพัฒนาโมเดลด้วยการคำนวน feature importance ที่จะต้องเขียนคำสั่งเองได้ดังนี้

สิ่งที่ PyCaret เหนือกว่า scikit-learn

  • การใช้งานที่ง่ายและจำนวนโค้ดที่เขียนเพื่อตอบโจทย์ปัญหาสั้นกว่า เนื่องจาก PyCaret ได้ทำการเขียนคำสั่งย่อของไลบรารีที่เกี่ยวข้องกับการประมวลผลด้วยเครื่องไว้ก่อนแล้ว
  • โมเดลที่ PyCaret นำมาเปรียบเทียบให้ค่อนข้างหลากหลายและเพียงพอต่อการแก้โจทย์ที่สนใจในเบื้องต้น
  • ทำการปรับค่าพารามิเตอร์ที่เหมาะสมได้อย่างรวดเร็ว ท่านไม่จำเป็นต้องไปศึกษาว่า แต่ละโมเดลมีตัวแปรไหนที่จะต้องปรับค่าบ้าง
  • การจัดการตัวแปรที่เกี่ยวข้องให้เหมาะสมกับโมเดลได้รวดเร็ว เนื่องจากทาง PyCaret ได้รวบรวมคำสั่งที่จำเป็นต่อการทำความสะอาดข้อมูลไว้ให้แล้ว
  • การวิเคราะห์ผลลัพธ์ของโมเดลถูกแสดงมาในรูปแบบของแผนภูมิที่เข้าใจได้ง่าย ผิดจากการวิเคราะห์ด้วยวิธีปกติที่จะต้องเลือกใช้กราฟที่เหมาะสมในการแปรงผลจากที่ได้รับจากการคำนวนเป็นแผนภูมิ
  • รองรับการแก้โจทย์ประเภท การตรวจจับความผิดปกติ (anomaly detection) การแก้โจทย์กฎความสัมพันธ์ (association rule mining) และการประมวลผลทางภาษา (natural language processing)
  • มีตัวช่วยในการบันทึกการทดลองของโมเดล (experiment logging)

สิ่งที่ scikit-learn เหนือกว่า PyCaret

  • รองรับการปรับแต่งโมเดลที่ซับซ้อนได้ง่ายกว่า การปรับตัวแปรที่เกี่ยวข้องให้เหมาะสมกับโมเดลบางตัวที่ไม่ได้ถูกเขียนไว้ใน PyCaret รวมไปถึงการเลือกใช้เทคนิคการปรับตัวแปรนอกเหนือจาก random grid search ของ PyCaret
  • มีตัวเลือกสำหรับการพัฒนาโมเดลที่หลายหลายกว่า จากรูปด้านล่างพบว่า เฉพาะ linear models ในข้อ 1.1 มีโมเดลย่อยให้เลือกใช้ถึง 18 โมเดล
ที่มา https://scikit-learn.org/stable/supervised_learning.html
  • ปัญหาความไม่เข้ากันระหว่าง scikit-learn กับเวอร์ชั่นของไลบรารี่ที่เกี่ยวข้องมีน้อยกว่า PyCaret ทำให้การทำงานข้ามสภาพแวดล้อม (environment) ทำได้ราบรื่นกว่า
  • sklearn-learn ถูกสร้างมาตั้งแต่ปี 2007 เทียบกับ PyCaret ที่ถูกสร้างปี 2019 ทำให้มีชุมชนนักพัฒนาที่ใหญ่กว่า มีการเขียนคู่มือใช้งานละเอียดกว่าทั้งคู่มือทางการและบทความทั่วไปในอินเทอร์เน็ต
  • รองรับการแก้โจทย์ประเภท neural network เบื้องต้น (หากต้องการพัฒนา neural network อย่างจริงจัง ผมแนะนำให้ศึกษา tensorflow หรือ pytorch จะดีกว่า)

กล่าวโดยสรุป

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

ในทางกลับกันหากการพัฒนาโมเดลให้ได้ค่าความแม่นยำสูง หรือข้อมูลมีความซับซ้อนในการทำความสะอาดข้อมูล หรือข้อมูลมาจากหลายหลายรูปแบบ หรือท่านทำโมเดลด้วย PyCaret มาสักพักแล้ว ผลของการปรับค่าพารามิเตอร์ยังไม่ดีพอ ผมแนะนำให้ scikit-learn เพราะมีโมเดลให้เลือกหลายหลายกว่า สามารถปรับแต่งค่าพารามิเตอร์ และทำงานร่วมกับไลบรารีอื่นได้ง่ายกว่า

#machinelearning #datascience #datasciencearchitecture #pycaret #วิศวะคอมฯจุฬาฯ #cpengchula #sklearn

เอกสารอ้างอิง

Kanoktipsatharporn, Surapong. 2019. “One Hot Encoding คืออะไร ประโยชน์ ข้อดี ข้อเสีย ของ One Hot Encoding ทำไมต้องใช้ One Hot Encoding ใน Machine Learning.” BUA Labs. September 19, 2019. https://www.bualabs.com/archives/1902/what-is-one-hot-encoding-benefit-one-hot-encoding-why-one-hot-encoding-in-machine-learning/.

Matplotlib. 2012. “Matplotlib: Python Plotting — Matplotlib 3.1.1 Documentation.” Matplotlib.org. 2012. https://matplotlib.org/.

Mithrakumar, Mukesh. 2019. “How to Tune a Decision Tree?” Medium. November 12, 2019. https://towardsdatascience.com/how-to-tune-a-decision-tree-f03721801680.

Pandas. 2018. “Python Data Analysis Library — Pandas: Python Data Analysis Library.” Pydata.org. 2018. https://pandas.pydata.org/.

“Pycaret vs Catboost on Soccer Fever Classification Dataset.” 2021. Analytics Vidhya. September 9, 2021. https://www.analyticsvidhya.com/blog/2021/09/pycaret-vs-catboost-on-soccer-fever-classification-dataset/.

“Scikit-Learn: Machine Learning in Python — Scikit-Learn 0.22.2 Documentation.” n.d. Scikit-Learn.org. https://scikit-learn.org.

stackpython. 2020. “Machine Learning Ep.2 : Cross Validation.” Medium. January 18, 2020. https://stackpython.medium.com/machine-learning-ep-2-cross-validation-70cbefb2dda4#:~:text=K%2DFold%20Cross%20Validation%20%E0%B8%84%E0%B8%B7%E0%B8%AD.

“TensorFlow vs Pycaret: A Comparison of Machine Learning Frameworks.” 2022. Analytics India Magazine. January 10, 2022. https://analyticsindiamag.com/tensorflow-vs-pycaret-a-comparison-of-machine-learning-frameworks/.

“Welcome to PyCaret — PyCaret Official.” 2020. Gitbook.io. 2020. https://pycaret.gitbook.io/docs/.

“Yellowbrick: Machine Learning Visualization — Yellowbrick V1.4 Documentation.” n.d. Www.scikit-Yb.org. Accessed May 15, 2022. https://www.scikit-yb.org/en/latest/.

--

--