BOTNOI classroom-Titanic dataset (feature extraction)
Baseline discussion
ต่อจาก คลิก -> ตอนที่แล้ว ที่เราได้ set pipeline เอาเฉพาะข้อมูลที่เป็นตัวเลข เติมข้อมูลที่หายไปด้วย 0 ทั้งหมด classification result ที่ได้คือความถูกต้อง 69% ทุกคนคิดว่า 69% เป็นยังไงบ้างครับ พอใช้ได้มั้ยสำหรับการเริ่มต้น นี่คือสิ่งที่ผมต้องพยายามอธิบายให้ stack holder กับพวกผู้บริหารต่าง ๆ ทุกครั้ง ที่บอกว่า อืมม โมเดลความแม่นยำแค่ 69% เอง ไม่แม่นยำพอ (หยุดสัก 10 วินาที แล้วตั้งใจอ่านประโยคข้างล่างนะครับ)
ถ้าผมมีโมเดลที่บอกล็อตเตอรี่รางวัลที่ 1 ถูก 69 ครั้ง จากการทำนาย 100 ครั้ง … ทุกคนจะซื้อโมเดลผมมั้ยครับ
ใช่แล้วครับ ตัวเลขค่าความถูกต้องอย่างเดียว บอกทั้งหมดไม่ได้ เราต้องดูด้วยว่าโจทย์มันยากง่ายแค่ไหน สมมตินะครับ ว่าถ้าข่าวออกว่าผู้รอดชีวิตจากการที่เรือจมเพียง 10% เท่านั้น นั่นหมายความว่า ไม่ต้องใช้โมเดลอะไรทั้งสิ้น แล้วก็กา ขอไข่ ทุกข้อ ว่าทุกคนไม่รอด จะได้ความถูกต้องสูงถึง 90%
คิดว่าทุกคนสมัยเป็นนักเรียน แล้วทำโจทย์ไม่ออก ก็กาชวดไปเลย แล้วก็กา ขอ ไข่ กับ คอควาย เพราะคิดว่าครูคงไม่ค่อยชอบวางคำตอบไว้ที่แรกกับที่สุดท้าย ใครทำยกมือขึ้น
ทีนี้ก็กลับเข้าเรื่องว่า 69% เนี่ยมันโอเคมั้ยสำหรับการเริ่มต้น ผมก็จะมาดูว่าสัดส่วนของผู้รอดกับไม่รอดใน training set เป็นเท่าไหร่ (อันที่จริง เราควรจะทำตรงนี้ก่อน ที่จะสร้างโมเดลด้วยซ้ำ)
เราก็โหลด module ที่เราสร้างขึ้น เมื่อตอนที่แล้ว module ก็คือ ไฟล์ .py ที่เอาฟังก์ชั่นต่าง ๆ ที่เราสร้างขึ้นในตอนที่แล้วไปแปะ ๆ ๆ แล้วเราก็สามารถเรียกใช้ได้ผ่าน interactive shell ไม่ว่าจะเป็น ipython หรือ jupyter notebook หรือแล้วแต่ความถนัด ผมก็โหลด .csv ได้ข้อมูลเป็น dataframe เลือก column ที่สนใจ แล้วก็เรียกฟังก์ชั่น describe() ก็จะเจอว่า รอดชีวิต 38% ให้ดูตรงค่า mean() เพราะว่าในข้อมูล คนที่รอดจะถูกแทนด้วย 1 ไม่รอดคือ 0 นั่นหมายความว่า ถ้าจะให้ผมเดาแบบไม่ต้องใช้โมเดลใน testset ผมก็จะเอาว่าไม่รอดทั้งหมด ผมก็จะถูก 62% แต่นี่ใช้โมเดลเบื้องต้นผมได้มา 69% ผมจึงสรุปว่า เป็นการเริ่มต้นที่ดีในระดับนึง
— — — — — — -
Feature extraction
เข้าสู่เรื่องหลักที่ผมจะอธิบายในบทความนี้ นั่นก็คือ Feature extraction การดึงคุณลักษณะต่าง ๆ จากข้อมูล ให้ออกมาเป็นตัวเลข เพื่อที่จะสามารถเอาเข้าไปใส่ใน model
ผมจะบอกว่า Feature extraction เป็นส่วนที่สำคัญที่สุดที่จะมาตัดว่า ใครเป็น data scientist ที่เก่งหรือไม่เก่ง เหนือกว่าคนที่เก่ง machine learning
ในขณะที่ถ้าเป็นนักวิจัยทางด้าน Computer Vision หรือ NLP feature engineering หรือว่า feature extraction ได้ถูกลดความสำคัญลงไป ด้วยเทคโนโลยีปัจจุบัน ไม่ว่าจะสร้าง model แยกรูปอะไร ทายอายุ หรือจะจดจำหน้า หรือจะ detect สิ่งของ มันค่อนข้างที่จะมี pipeline ที่เป็น standard แล้วหยิบมาใช้ได้เลย นักวิจัยเค้าก็พยายามปรับปรุงกันต่อไป เราก็เอามาประยุกต์ใช้ทำตามเค้า
แต่สำหรับงาน data scientist มันไม่ใช่ครับ โจทย์มันหลากหลาย และข้อมูลก็หลากหลาย ตามธุรกิจที่เราไปทำ
และนี่ก็คือสาเหตุที่สร้าง data scientist ยาก เพราะเค้าต้องมีทั้งพื้นฐานคอม พื้นฐาน machine learning พื้นฐานเกี่ยวกับการจัดการข้อมูล แล้วก็ต้องอาศัยประสบการณ์ในการทำ feature extraction จากการทำ model ให้ธุรกิจหลาย ๆ แบบ จะได้คิดออก
ผมขอยกตัวอย่าง case นึงสมัยที่ทำให้กับบริษัทโทรคม โจทย์คือว่า จะส่ง sms เพื่อบอกให้ลูกค้าเปิด โรมมิ่งแพคเกจก่อนจะเดินทางไปต่างประเทศ แล้วให้ได้ผลตอบรับที่ดี conversion rate สูง ๆ นี่ก็คือ business problem แล้วเราก็จะแปลงให้เป็น machine learning problem คือสร้าง model ทำนายว่าลูกค้ากำลังจะไปต่างประเทศหรือเปล่า จะส่งมาโรมมิ่งแพคเกจมาให้ผมทำไม ผมไม่ได้จะไปต่างประเทศ ผมแค่มารับญาติที่สนามบิน
ข้อมูลที่ผมก็มีหลายอย่างนะ เช่น ตำแหน่งปัจจุบันที่ได้จากการจับเสาสัญญาณ แล้วก็ข้อมูลการใช้โทรศัพท์ โทรกี่ครั้ง โทรนานแค่ไหน จ่ายเงินเท่าไหร่ต่อเดือน เป็นต้น เราจะสามารถสร้าง feature ที่ดี ที่ใช้เป็นอินพุตสำหรับสร้างโมเดล ทำนายว่าใครกำลังจะเดินทางไปต่างประเทศได้มั้ย แน่นอนพวกพื้นฐานข้อมูลที่เราโยนเข้าไปได้เลย อะไรที่เป็นตัวเลขก็ใส่เข้าไปเถอะ แต่ข้อมูลที่ผมคิดว่าถ้าเราสกัดออกมาได้ จะมีผลมากที่สุดก็คือสถิติการไปต่างประเทศในอดีตของเค้า คนที่ไปต่างประเทศก็น่าจะไปอยู่เรื่อย ๆ แล้วเราจะเอาข้อมูลนี้มาได้ยังไง เราไม่ใช่ตรวจคนเข้าเมืองที่จะมีข้อมูลนี้ แต่ …
a. ถ้าลูกค้าจับสัญญาณเครือข่ายที่สุวรรณภูมิ แล้วหายไปเป็นวัน แล้วมาโผล่อีกทีที่สุวรรณภูมิก็น่าจะแสดงว่าเค้าบินไปต่างประเทศ แล้วช่วงเวลาที่หายไปก็ยังน่าจะใช้เป็น information ว่าเค้าบินไปเพื่อนบ้านใกล้ ๆ หรือไปไกล ๆ
b. ถ้าลูกค้าจับสัญญาณเครือข่ายที่สุวรรณภูมิ แล้วหายไป แล้วไปโผล่อีกทีที่เชียงใหม่ แสดงว่าเค้าก็น่าจะอาศัยอยู่กทม แล้วไปเที่ยวเชียงใหม่
c. ถ้าลูกค้าจับสัญญาณเครือข่ายที่สุวรรณภูมิ แล้วก็ไปจับสัญญาณเสาอื่น ก็แสดงว่าไปรับญาติ
d. ถ้าลูกค้าจับสัญญาณเครือข่ายที่สุวรรณภูมิทุกวัน แต่ไม่เคยปิดเครื่องอยู่ในกทมตลอด แสดงว่าเค้าน่าจะเป็นพนักงานอยู่ที่สนามบิน
แล้วเราก็สะสมข้อมูลพวกนี้เก็บไว้เป็นรอบเดือน รอบปี ว่าไปบินไปต่างประเทศกี่ครั้ง ในประเทศกี่ครั้ง รับญาติกี่ครั้ง เห็นมั้ยครับเราไม่ต้องเป็นตรวจคนเข้าเมืองก็สร้าง feature ที่ powerful ขนาดนี้ได้ และผมคิดว่า ขออนุญาตย้ำอีกครั้ง นี่คือหัวใจที่สำคัญที่สุดของการเป็น data scientist ครับ Feature extraction
Feature extraction ในสายงานของ Data scientist ไม่สามารถที่จะเรียนจากมหาวิทยาลัยได้ ไม่เหมือนกับสาย Computer Vision หรือ NLP จะต้องอาศัยประสบการณ์จากการทำงานจริง ๆ และการขอความรู้จากผู้เชี่ยวชาญในแต่ละธุรกิจเพื่อให้เรามีไอเดียประยุกต์ดัดแปลง
ในบทความต่อ ๆ ไปถ้ามี (Feature extraction) ก็จะเป็นไอเดียต่าง ๆ เกี่ยวกับการสร้าง feature นะครับ แต่วันนี้ขอเล่า Feature extraction ของ Titanic dataset ให้ฟังก่อน
Sex Feature
จากข้อมูลนี้ ที่เตะตาผมที่สุด ดูแล้วรู้เลยว่าต้องทำอะไรก่อน ก็คือ Sex หรือเพศครับ อย่างที่ Jack เสียสละให้ Rose รอด ซึ้งมากครับ ผู้ชายก็ต้องเสียสละอยู่แล้วหล่ะครับ เป็น gentlemen กัน
ตอนนี้ attribute Sex ยังเป็น text อยู่ เราต้องแปลงให้เป็นตัวเลข column Sex มันเป็น binary นั่นก็คือมีแค่ 2 ทางเลือก ไม่เป็นชายก็หญิง เราก็เขียนฟังก์ชั่น ที่รับค่าของ dataframe รับชื่อ column แล้วก็รับ ค่าของ attribute ที่อยากให้เป็น 1
เห็นมั้ยครับ เราก็จะได้ attribute ใหม่ที่ column ขวาสุด ถ้าเป็นผู้ชายก็เป็น 1 ผู้หญิงก็เป็น 0
ไหนลองรันใหม่ซิ หลังจากแก้ฟังก์ชั่น feature extraction โดยใส่ feature male เข้าไป แล้วก็รัน pipeline()
เยี่ยมไปเลยครับ จาก 69% กลายเป็น 81%
Embarked Feature
ทีนี้เราจะทำอะไรกันต่อดี มันจะมี column Embarked ก็คือสถานที่ขึ้นเรือ ไม่รู้ว่าจะเกี่ยวมั้ย สมัยก่อนจะมีการแบ่งชนชั้นมั้ยคนจากเมืองนี้เป็นไฮโซ ได้สิทธิ์ขึ้นเรือกู้ชีพก่อน ก็ลองดูก็แล้วกัน
คล้าย ๆ column Sex แต่ตอนนี้มันไม่ได้มีแค่ 2 ค่า เราจึงต้องแปลงอีกแบบ คือสร้างหลาย column เลย แต่ละ column ก็แทนค่าที่ปรากกฎเป็น 1 เค้าเรียกว่าการ get dummies ซึ่ง Pandas ก็มีฟังก์ชั่นให้ใช้อยู่แล้ว
ดู 3 column สุดท้ายนะครับ หลังจากที่ทำ dummie variable ให้ Embarked สังเกตว่าในฟังก์ชั่นผมได้ตัด column สุดท้ายออกที่เป็น S ออก ใช้คำสั่ง .iloc[:,0–1] จริง ๆ ก็ไม่จำเป็นที่จะต้องตัดหรอกครับ มันก็แค่จะช่วยลดจำนวน column ลงเท่านั้นเอง ถ้าเรามีข้อมูลเป็นล้าน ๆ บันทัด ก็จะช่วยประหยัดเนื้อที่ แล้วก็ทำให้ train model ง่ายขึ้นอีกหน่อย ก็ fit ใน ram ได้มากขึ้นน่ะครับ ทำไมถึงตัดได้ ทุกคนดูออกมั้ยครับ ว่าแค่บอกว่า C=0 Q=0 ก็แสดงว่า ต้องเป็น S แน่นอน information อยู่ครบครับ แค่ใช้ 2 ค่าเท่านั้น
ทีนี้ลองมารัน pipeline ดูว่าช่วยหรือเปล่า ปรากฎว่าไม่เลย ก็ตัดออกไปไม่ใช้ ก็เป็นเรื่องธรรมดาครับ ลองสิบอย่าง อาจจะได้ซักอย่าง ก็ต้องลองไปเรื่อย ๆ ครับ
Drop PassengerID
มาดูข้อมูลอีกที่ PassengerID เป็นตัวเลขก็จริง แต่ว่ามันไม่น่าจะเอามาใส่ได้นะครับ เพราะว่า มันไม่น่าจะมีความสัมพันธ์กันเลย ผมเป็นผู้สมัครหมายเลขต้น ๆ หรือท้าย ๆ ก็ไม่ได้แปลว่าผมจะสอบผ่านหรือไม่ผ่าน งั้นเราก็ตัดออกไปก็แล้วกัน ใช้ฟังก์ชั่น featMat.drop(‘PassengerId’,axis=1) ไชโย ได้ผลตอนนี้ได้เป็น 83% แล้วครับ
บทความชักจะยาวไปแล้ว ผมขอลองอีกอันนึง ผมเห็นว่าสถานะ Sex ค่อนข้างมีผล ผมสังเกตว่าให้ column Name มี นามสกุล, คำนำหน้า ตามด้วยชื่อ ทีนี้มันก็มี Mr. Miss, แล้วก็ Mrs. แล้วก็มี Master ด้วยผมว่าน่าสนใจทีเดียว โดยเฉพาะ Miss กับ Mrs. คิดว่าใครจะได้ขี้นเรือชูชีพ ไม่รู้เหมือนกันก็ลองดู ทีนี้มันเป็น string ก่อนอื่นก็ต้องตัด string ไปถึงคำนำหน้า แล้วค่อยแปลงเป็น dummie ให้ทำอย่างนี้ครับ ให้เป็นการบ้านไปแกะเอานะครับ แต่ละบันทัดทำอะไรกัน
พอรันแล้วจะได้เป็นอย่างนี้ครับ
จะเห็นได้ว่า ไม่ได้มีแต่ Mr, Miss, Mrs หน่ะสิครับ ดีเลยครับ model เราจะได้มี information เพิ่มขึ้นอีก ถ้าให้ผมเดาผมว่าน่าจะได้เพิ่มอีกซัก 1% น่า ก็ลองมารัน pipeline ดู ได้มา .7 ครับ ตอนนี้ได้มา 83.7%
Cabin letter
สุดท้ายครับจำได้มั้ยว่า ตอนต้นผมคิดว่า ตัวเลข Cabin อาจจะมี information ว่าอยู่ตำแหน่งไหนของเรือหัวเรือหรือท้ายเรือ หัวเรืออาจจะมีเวลามากกว่าท้ายเรือหรือเปล่าก็เลยสกัดเอาตัวอักษรออกมา แล้วสร้าง dummie แล้วก็ได้มาเป็น …
85.4%
แต่กว่าจะได้มาก็ต้องลองไปเรื่อย คิดโน่นคิดนี่ไปเรื่อย ขอยืมประโยคของเพื่อนที่เข้าเรียนคลาส เค้าบอกว่า
คำว่า scientist ก็บอกอยู่แล้วว่าจะต้องทดลองโน่นทดลองนี่อยู่แล้วหล่ะ
ก็หวังว่าทุกคนจะได้ไอเดียในการทำ feature extraction นะครับ อยากให้ลองหัดทำกันดูสนุกดี น่าจะยังมีอะไรให้ลองเล่นอีกในส่วน feature extraction แบบว่าความยาวชื่อจะมีผลมั้ยนะ แบบตระกูลใหญ่ ๆ นามสกุลจะยาวหรือเปล่า หรือไม่เกี่ยว หรือว่าจะสกัดเอาขนาดของครอบครับ แบบว่าถ้ามีลูกชายคนเดียวก็จะให้ลูกชายรอดเพื่อสืบสกุล อันนี้แบบหนังจีน ก็ต้องลองครับ ใครสกัดได้ feature ใหม่ ๆ ดี ๆ แล้วทำให้ได้มากกว่า 85.4 บอกด้วยนะครับ ให้ใช้ pipeline dataset classifier เหมือนกัน ให้เปลี่ยนได้แต่ในส่วนของ feature ครับ
Source โค้ดก็อยู่ใน Google Drive แล้วเจอกันตอนหน้านะครับ ถัดจาก Feature extraction ตอนต่อไปจะพูดถึง Dimensionality reduction ก็แล้วกัน ชื่อคำศัพท์แต่ละชื่อเท่ห์ ๆ ทั้งนั้นเลยจริงมั้ยครับ
สนใจเรียน data science -> Botnoi Classroom
สนใจใช้บริการในสร้างแชทบอท หรือให้คำปรึกษาเกี่ยวกับ AI & data science ติดต่อได้ผ่านเวป -> Botnoi และ FB Page Botnoi Consulting นะครับ