บันทึก training data science EP 6: Decision Tree – ทางแยกมันแยกยาก

บันทึก training data science EP 6: Decision Tree – ทางแยกมันแยกยาก

ตอนก่อนหน้า: บันทึก training data science EP 5: Logistic Regression & Dummy Classifier – Regressor ที่ไม่ใช่ Regressor

ต่อจาก EP 5 ที่เราคุยกันเรื่อง Classification นะฮะ เรามีอีก model นึงเพื่อทำหน้าที่วิเคราะห์การระบุกลุ่มของข้อมูล นั่นคื๊อ…

Decision tree

Decision tree เป็น classification model ที่คล้ายกับ Logistic regression แต่ความต่างของทั้งสองอยู่ที่นี่

Decision tree จะวิเคราะห์ข้อมูลแบบกล่องครอบผลลัพท์แต่ละค่า เราสามารถกำหนดให้กล่องมีขนาดเล็กลงเพื่อให้คลุมกับข้อมูลได้มากขึ้นจากการกำหนดค่า parameter นะฮะ ทำให้เราใช้งานได้แม้ว่าจะมีข้อมูลปริมาณไม่เยอะ แต่ข้อเสียคือ ถ้ามี outlier จะทำให้ค่าแกว่งง่ายมากเพราะจะต้องวาดกล่องไปคลุม outlier ด้วยฮะ

ส่วน Logistic regression จะเป็นการวาดเส้นให้ทับจุดข้อมูลมากที่สุดอย่างที่อธิบายไปในตอนที่แล้วฮะ ต้องใช้ข้อมูลปริมาณเยอะใช้ได้ ถึงจะได้ค่าที่แม่นยำพอ แต่กลับกัน ถ้ามี outlier อยู่ มันก็ยังประมวลผลได้ไม่แกว่งนักฮะ

Reference link:

เตรียมข้อมูลกันก่อน

เริ่มจากให้ตัวแปร x เก็บค่า Pclass, is_male, และ Age ฮะ ไม่ลืมว่าเราจะไม่เอาค่า NaN มาใช้งานนะฮะ

จากนั้นกำหนดตัวแปร y ให้เป็นค่า classifier ของ Fare จากการใช้ .map() คู่กับฟังก์ชันที่เราสร้างเอง ฟังก์ชันนี้จะ return มาเป็น string บอกว่า Fare เท่านี้อยู่ใน classifier อะไรฮะ

เริ่มต้นสร้าง Model

เราสร้าง object DecisionTreeClassifier มาก่อน กำหนด parameter สองตัวหลัก ได้แก่

  • criterion
    ให้เราเลือกระหว่าง
    • “gini” มาจาก “gini impurity” เป็นการวัดว่า ถ้าเราสุ่มค่าขึ้นมาค่านึง เราจะคำนวณผลลัพท์จากค่านั้นผิดเพี้ยนไปเท่าไหร่ อย่างไรฮะ มักใช้เพื่อลดค่า error ของ classification
    • “entropy” เป็นการวัดความไม่บริสุทธิ์ของข้อมูล หรืออีกความหมายนึงก็คือ ข้อมูลแตกต่างกันมากแค่ไหน ใช้สำหรับการวิเคราะห์ในเบื้องต้น (exploratory analysis)
  • max_depth
    ระบุว่า Tree ของเราจะแยกย่อยไปกี่ชั้น ครั้งนี้ผมจะกำหนดเอาไว้ที่ 3 นะฮะ

Reference link:

ช่นเคย เราใช้ .fit() กับตัวแปร x และ y

มาดูกันก่อนว่าค่าที่เป็นไปได้มีอะไรบ้าง ด้วยคำสั่ง .classes_

เสร็จแล้วล่ะฮะ

เปิดตัว model

เรามาลองดูว่า Model หน้าตาเป็นแบบไหน ด้วยคำสั่ง

sklearn.tree.export_graphviz()

อ่านยากจัง เราเลยมาใช้ script นี้ให้มันวาดออกมาเป็น diagram เข้าใจง่ายๆ กันฮะ

try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO

import sklearn.tree
import IPython.display
import pydot
File_obj = StringIO()
sklearn.tree.export_graphviz(tree, out_file=File_obj)
Graph = pydot.graph_from_dot_data(File_obj.getvalue())

IPython.display.Image(Graph[0].create_png())

ลองมาอ่านกราฟกันคร่าวๆ นะฮะ เอาด้านซ้ายสุด

  • ถ้า x[0] หรือ Pclass มีค่าน้อยกว่าหรือเท่ากับ 1.5 (อีกความหมายคือ Pclass มีค่า 1)
  • และถ้า x[1] หรือ is_male มีค่าน้อยกว่าหรือเท่ากับ 0.5 (อีกความหมายคือ is_male เท่ากับ 0 หรือเป็นผู้หญิง)
  • และถ้า x[2] หรือ Age มีค่าน้อยกว่า 43.5
  • ผลลัพท์ที่ได้คือ [2, 11, 23, 26]
  • นั่นคือ ถ้ามีข้อมูลตามเงื่อนไขข้างต้น มีโอกาสเป็น Quite rich ถึง 26
Cheap Luxury Medium Quite rich
2 11 23 26

เอ๊ะ เรามีตัวแปร x อยู่สามตัว ตัวไหนที่มีผลมากที่สุด ใช้คำสั่งนี้ฮะ .feature_importances_ ซึ่ง feature เนี่ย เราใช้ในความหมายว่าเป็น column ที่สนใจของข้อมูลนั้นๆ ฮะ

และสุดท้ายลองทำนายกันดู ด้วยข้อมูลลูกเรือที่อยู่ Pclass 1 เป็นผู้หญิง (is_male = False) และมีอายุ 40 ปี model ของเราก็ทำนายว่าคนนี้จ่าย Fare ในระดับ Quite rich ฮะ


จบไปแล้วนะฮะ ทีนี้ถ้ามีคำถามว่า อ้าว แล้วเราจะใช้ Decision tree ตอนไหน Logistic regression ตอนไหน ก็ต้องตอบว่า ด้วยความที่ Logistic regression มันเป็นสมการเส้นตรง ถ้าเรามั่นใจว่า classification ของเราจะได้ผลลัพท์เป็นสองกลุ่มที่แตกต่างกันแบบชัดเจน ก็เลือกใช้ Logistic regression ฮะ แต่ถ้าไม่ใช่หรือไม่มั่นใจ ก็ใช้ Decision tree แทนนะฮะ

รอบหน้าจะมาเหลาให้อ่านกันใหม่เน้อ

บาย~

ตอนต่อไป: บันทึก training data science EP 7: Metrics – สินค้าที่ผ่าน QC

Show Comments