Data Science Essential week 3: Prediction model(Colab)

Krirk Arunoprayote
botnoi-classroom
Published in
8 min readAug 25, 2020

บทความนี้เป็นการสรุปเนื้อหา พร้อมกับอธิบาย code ใน google colab ประกอบคลาส DSE by BotNoi week 3 เรื่อง Prediction model ครับ

Prediction model

การทำ Prediction model ด้วยวิธีการ supervised machine learning จะมี 2 ประเภทหลักๆ คือ Classification กับ Regression ซึ่งจะใช้ model ประเภทไหน ก็ขึ้นอยู่กับปัญหาที่เราต้องการหาคำตอบ

ถ้าเราต้องการจำแนกข้อมูลเป็นชนิด (class) ต่างๆ เช่น จำแนกว่าภาพถ่ายนี้เป็นภาพของหมาหรือแมว ก็จะใช้ classification model เช่น Logistic Regression

ถ้าเราต้องการทำนายตัวเลขจากข้อมูล เช่น ทำนายราคาบ้านจากคุณลักษณะต่างๆ ของบ้าน ก็จะใช้ regression model เช่น Linear Regression, Random Forest Regressor

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

ขั้นตอนการทำ Prediction Model

ก็จะเป็นไปตาม pipeline ในการทำ machine learning ตามที่สอนใน week 2 แต่ได้แตกย่อย task ให้ชัดเจนมากขึ้นเป็น 7 tasks ตามภาพ โดยในแต่ละ task เราก็จะสร้าง function ไว้สำหรับ task นั้น แล้วนำ function สำหรับ ทำ task ทั้งหมด มารวมกันใน function pipeline

สาเหตุที่ต้องทำเป็น pipeline ไว้ เพราะว่า กระบวนการทำ machine learning นั้น จะต้องมีการทำซ้ำหลายๆ ครั้ง โดนหลายๆ task นั้นก็ยังคงทำเหมือนเดิม แต่บาง task ก็มีการเปลี่ยนแปลงรายละเอียด ซึ่งการทำ task ย่อยต่างๆ ให้อยู่ในรูป function จะช่วยให้เราทำซ้ำขั้นตอนต่างๆ ได้ง่าย และถ้าอยากปรับจูนรายละเอียดอะไร ก็ไปแก้ไขใน function ย่อยๆ นั้น แล้วกดรัน pipeline ครั้งเดียว ก็ได้ผลลัพธ์ออกมาเปรียบเทียบได้เลย ช่วยให้การทำงานราบรื่นรวดเร็วมากขึ้น

Install และ import module ต่างๆ ที่ต้องการใช้งาน

เนื่องจากเราจะทำงานกับไฟล์ google sheet ที่ได้เก็บข้อมูลจากแบบสอบถาม ก็จะ ต้อง install pygsheets มาเพื่อให้ใช้งานไฟล์ google sheet ได้

และเนื่องจากข้อมูลที่เก็บมาเป็นภาษาไทย จึงจะ install googletrans มาเพื่อช่วยแปลข้อความภาษาไทยให้เป็นภาษาอังกฤษ เพื่อให้เขียน code สะดวก ไม่ต้องสลับภาษาบ่อย

เราต้องการจะใช้งาน dataframe เนื่องจากสะดวกในการวิเคราะห์และประเมินผล จึง import pandas, gspread เพื่ออ่านข้อมูลจาก googlesheet และนำมาเก็บข้อมูลเป็น dataframe และ import auth, GoogleCredentials เพื่อให้เข้าถึง file googlesheet ที่เก็บไว้ใน drive ได้

1. get data : function load_data()

เราจะสร้าง function สำหรับ เก็บข้อมูลจาก google sheet ให้อยู่ในรูป dataframe ดังนี้

อธิบาย code ตามบรรทัด
2 : สร้าง function load_data()
3 : ใช้ gc.open_by_url() เพื่ออ่านไฟล์ google sheet มาเก็บไว้ใน spreadsheet
4 : ใช้ method get_worksheet(0) เพื่ออ่าน sheet แรกในไฟล์มาเก็บไว้ใน sheet
5 : ใช้ method get_all_records() เพื่อเอาข้อมูลทุก record ใน sheet แล้วแปลงเป็น dataframe เก็บไว้ใน survey_df
6 : return ด้วย survey_df

ลองเรียกใช้ function และเรียกดูข้อมูลใน dataframe 5 ตัวแรกดังภาพ

2. clean data : function clean_data(df)

ก่อนจะนำข้อมูลไป train ใน model ก็จะต้อง clean data เสียก่อน โดยจะต้องจัดการกับ missing data, outlier หรือ ตรวจความผิดปกติอื่นๆ เพื่อลดความผิดพลาด และทำให้ model ของเราสามารถเรียนรู้ได้อย่างมีประสิทธิภาพมากขึ้น

โดยอาจเริ่มจากการเช็ค datatype ว่ามีความเหมาะสมหรือยัง โดยใช้ method info()

พบว่าข้อมูลที่เป็นอายุ เก็บไว้เป็นตัวเลข โดยอายุเป็น int น้ำหนักตัว เป็น float ซึ่งก็เหมาะสมกับข้อมูลดีแล้ว จึงไม่ได้จัดการอะไรกับ datatype เพิ่มเติม

จากนั้นก็อาจจะดูภาพรวมของ data คร่าวๆ โดยใช้ method describe()

ก็พบว่าข้อมูลอายุน่าจะมีปัญหา เพราะมีค่า -20 กับ 9999 ด้วย อาจเป็นเพราะผู้ตอบแบบสอบถามกรอกข้อมูลผิด จึงต้องจัดการกับข้อมูลผิดปกติเหล่านี้ด้วย

จากนั้นเราอาจ plot graph เพื่อดูว่าข้อมูลมีการกระจายตัวอย่างไร มีตรงไหนผิดปกติหรือไม่ ดังภาพ

จากการเช็คข้อมูลนักเรียนในคอร์สซึ่งเป็นผู้ตอบแบบสอบถามนี้ ไม่มีใครที่อายุ 98 จริงๆ น่าจะเป็นการกรอกข้อมูลผิด ก็จะตัดข้อมูลออก รวมไปถึงคนที่อายุ -20 และ 2 ปีด้วย

ข้อมูลน้ำหนักตัวดูจะไม่มีปัญหามากนัก ข้อมูลดูสมเหตุสมผลดีอยู่ จึงไม่ต้องจัดการอะไรเพิ่ม

ส่วนข้อมูลเพศ เป็นข้อมูล category ก็อาจดูได้โดยการใช้ method value_count()

พบว่ามีผู้ตอบแบบสอบถามโดยไม่ระบุเพศ 20 คน ตรงนี้ก็ถือเป็น missing data เราก็อยากจะแทนค่าด้วยตัวเลขบางอย่าง ซึ่งก็แล้วแต่เคสว่าเป็นปัญหาเรื่องอะไร ไม่มีหลักการที่ตายตัวแน่นอน บางปัญหาอาจใช้ค่า mean มาแทนค่า บางปัญหาอาจใช้ค่า mode มาแทนค่า หรืออื่นๆ

สำหรับเคสนี้ เราอาจสำรวจเพิ่มเติมว่าข้อมูลไม่ได้ระบุเพศเหล่านี้ ส่วนใหญ่มีน้ำหนักและอายุเท่าไหร่ โดยการใช้ method loc[] กำหนดเงื่อนไขในการเลือก dataframe ก็จะแสดงข้อมูลออกมาดังภาพ

เราก็จะเห็นข้อมูลอายุและน้ำหนักของคนที่ไม่ได้ระบุเพศออกมา เบื้องต้นเราเห็นคนที่น้ำหนัก 37 kg เราก็คิดว่า คนที่หนัก 37 kg น่าจะเป็นเพศหญิงมากกว่า นำไปสู่สมมติฐานว่า คนที่หนักกว่า 60 kg น่าจะเป็นเพศชาย เราก็จะเลือกแทนค่าคนที่ไม่ระบุเพศที่หนักเกิน 60 kg ให้เป็นเพศชาย ที่เหลือก็จะให้เป็นเพศหญิงไป ซึ่งน่าจะถูกต้องกว่าการแทนค่าด้วย mode ซึ่งตรงนี้ก็จะเขียนไว้ในตอนท้ายของ function clean_data(df)

แปลชื่อคอลัมน์ให้เป็นภาษาอังกฤษ

นอกจากนี้ ตอนนี้ชื่อคอลัมน์ของเรายังเป็นภาษาไทยอยู่ ทำให้เขียน code ไม่สะดวก ดังภาพ

เราจึงจะใช้ google translate มาช่วยแปลชื่อคอลัมน์เหล่านี้ ให้สะดวกต่อการเขียน code ต่อไป

อธิบาย code ตามบรรทัด
1–2 : import module ที่ต้องใช้ในการแปลภาษา
3 : สร้าง function rename_column() รับค่า column_names
4 : สร้าง translator object
5 : สร้าง list เปล่า ชื่อ res สำหรับเตรียมเก็บ result จาก loop ข้างล่าง
6 : สร้างตัวแปร name ไว้เตรียมเก็บค่า string ใน loop ข้างล่าง
7–12 : loop โดยดูข้อมูลทีละตัวใน column_names โดยเช็คว่า ถ้าชื่อคอลัมน์มี square bracket [] อยู่ ก็ให้เก็บข้อความใน square bracket มาใส่ใน name จากนั้นก็นำไปแปลเป็นภาษาอังกฤษ แล้วเขียนต่อกันใน res เสร็จแล้วก็เข้าลูปข้อมูลตัวต่อไป 13 : return res ซึ่งเป็นชื่อคอลัมน์ที่แปลเป็นภาษาอังกฤษแล้วออกมา
14–15 : เรียกใช้ function และแสดงผลข้อมูลออกมา

map category data ให้เป็นตัวเลข

เนื่องจากในแบบสอบถามเรื่องความชอบอาหาร ได้แบ่งคำตอบออกเป็น เกลียด, ไม่ชอบ, เฉยๆ , ชอบ, รักเลย ซึ่งยังเป็น category data อยู่ ตัวโมเดลต่างๆ จะไม่สามารถทำความเข้าใจ data แบบนี้ได้ จึงต้องแปลงข้อมูลเหล่านี้ให้เป็นตัวเลขก่อน โดยอาจใช้ method map(dict) เข้ามาช่วย โดยรับค่า dict แล้วจะ map data ของเราเข้ากับ dict ที่ใส่เข้าไป เราจึงเริ่มจากการสร้าง dict ชื่อ feature_map โดยจะ map คำตอบกับตัวเลข 1 ถึง 5

method map นี้จะทำงานได้ทีละ series จึงได้สร้าง loop ขึ้นมาเพื่อ map ทีละ series ดัง code ในภาพ

สำหรับข้อมูลเพศก็เช่นกัน เราก็สร้าง dict ชื่อ gender_map ไว้ map เพศชายเป็น male และ เพศหญิง เป็น female

ถึงตอนนี้เราก็จะนำทุกอย่างมารวมกันอยู่ใน function clean_data(df)

อธิบาย code ตามบรรทัด
1 : สร้าง function clean_data รับค่า df
2 : copy df เก็บไว้ใน clean_df เพื่อป้องกันการแก้ไข dataframe ตัวต้นฉบับ
3 : drop column ‘Timestamp’ ตามแนวตั้ง เพราะไม่ได้มีความสำคัญต่อการวิเคราะห์
6 : เก็บชื่อ column ไว้ใน column_names
7 : ใช้ function rename_column แปลชื่อ column เป็นภาษาอังกฤษ
8 : เปลี่ยนชื่อ column ของ clean_df ให้เป็นภาษาอังกฤษ
10 : สร้าง dict feature_map
11–12 : วนลูปเพื่อใช้ method map ทำทีละคอลัมน์
14 : สร้าง dict gender_map
15 : ใช้ method map เปลี่ยนค่าในคอลัมน์ sex
17 : ตัดข้อมูลคนที่มีอายุน้อยกว่า 15 และมากกว่า 70 ซึ่งเป็น outlier ออก
19–20 : แทนค่าข้อมูลคนที่ไม่ได้กรอกเพศ ถ้ามีน้ำหนักน้อยกว่า 60 ให้เป็นเพศหญิง ถ้ามากกว่าหรือเท่ากับ 60 ให้เป็นเพศชาย
22 : return clean_df

ลองเช็คความถูกต้องของข้อมูลในคอลัมน์ sex โดยใช้ method value_counts()

จากนั้นเช็คว่ามีข้อมูล NA อยู่อีกหรือไม่โดยใช้ method isna() ซึ่งจะได้ค่า True หรือ False ออกมา และ sum() ออกมา ถ้าได้ค่า 0 ก็คือไม่มีข้อมูล NA แล้ว

3. Train & Test split : function split_train_test(df)

หลังจากได้ data ที่ clean แล้วก็จะมาแบ่งข้อมูลสำหรับ train ส่วนหนึ่ง และสำหรับ test ส่วนหนึ่ง โดยทั่วไปจะแบ่งข้อมูลส่วนใหญ่ไว้ train เพื่อให้โมเดลของเราเก่งที่สุดเท่าที่เป็นไปได้ ในที่นี้จะแบ่งข้อมูล 80% มา train ส่วนที่เหลือ 20% ใช้ test model ว่าสามารถทำนายจากข้อมูลใหม่ที่ไม่เคยเห็นได้ดีแค่ไหน

เราก็ import train_test_split มาใช้งาน โดยใน function เราได้ระบุ test_size = 0.2 หมายถึง แบ่ง data 20% มาเป็น test data และกำหนด random_state ไว้ โดยจะเป็นตัวเลขอะไรก็ได้ เพื่อให้การแบ่งแต่ละครั้งได้ data ที่เหมือนกัน เวลาทดสอบโมเดลแต่ละตัวจะได้ใช้ data เดียวกัน ในที่นี้เลือกใช้เลข 2020 และกำหนด shuffle=True เพื่อสับเปลี่ยนตำแหน่งของ data ก่อนจะ split

ลองเรียกใช้งาน function แล้วลองสำรวจดูว่า train_df ที่ได้ มีอะไรผิดปกติหรือไม่ โดยใช้ method info() ซึ่งก็ได้ผลที่ปกติดี จึงไม่ต้องจัดการอะไรเพิ่มเติม

4. Extract Feature : function extract_feature(df)

เราจะสร้าง function สำหรับแยก feature และ label ออกจากกัน และดรอปคอลัมน์ที่ไม่ใช้ออกไปดังนี้

อธิบาย code ตามบรรทัด
1 : สร้าง function extract_feature รับค่า df
2 : copy df และ drop NA ออก เก็บไว้ใน feat
4 : ใช้ get_dummies แตกค่าในคอลัมน์ sex เป็น 0 และ 1 เก็บไว้ใน dummies_df
5 : นำ dummies_df มาต่อกับ feat
8 : ให้คอลัมน์ Body weight (kg) เป็น label หรือคำตอบที่เราจะใช้เทรนโมเดล เก็บค่าไว้ใน label
9 : ดรอปคอลัมน์ Body weight (kg) ซึ่งเป็น label ออก และดรอปคอลัมน์ sex ซึ่งจะไม่ใช้แล้วเพราะได้ทำ dummies ไว้แล้ว ได้ออกมาเป็น features ทั้งหมด เก็บไว้ใน feat
10 : return ค่า feat และ label

5. Train Model : function train_model(feat, label)

เราจะสร้าง function สำหรับ train model ต่างๆ เพื่อให้สะดวกในการเรียกใช้งาน โดยใน function จะมี code สำหรับ model หลายๆ แบบไว้ เวลาจะรัน model ไหน ก็ให้ใส่ comment code model บรรทัดอื่นๆ ไว้ แล้วกดรัน pipeline() ครั้งเดียว ก็จะได้ผลลัพธ์เลย

เริ่มจาก import model ต่างๆ ในที่นี้จะใช้ RandomForestRegressoor, GradientBoostingRegressor และ DecisionTreeRegressor

อธิบาย code ตามบรรทัด
1 : สร้าง function train_model รับค่า feat กับ label
3 : สร้าง model โดยใช้ algorithm RandomForestRegressor กำหนด max_depth = 1000
6 : สร้าง model โดยใช้ algorithm GradientBoostingRegressor
9 : สร้าง model โดยใช้ algorithm DecisionTreeRegressor
11 : train model ด้วยข้อมูล feat,label (จาก Training data)
12 : return model ที่เทรนแล้ว

โมเดล 3 ตัวที่สร้างขึ้นนี้ ต่างก็เป็น regression model ซึ่งมี algorithm ที่แตกต่างกัน โดย RandomForestRegressor และ GradientBoostingRegressor เป็นการเอาผลลัพธ์ของหลายๆ โมเดลมารวมกัน จนได้โมเดลที่มี performance ดีขึ้น เรียกว่า ensemble โดย RandomForestRegressor เป็นการเอา tree หลายๆ modelมารวมกัน โดย ใช้ random training data, feature มาเทรนแต่ละ tree แล้วนำผลลัพธ์ของ แต่ละ tree มา average กัน
ส่วน GradientBoostingRegressor เป็นการสร้าง tree หลักขึ้นมาหนึ่งอัน แล้วค่อยๆ สร้าง tree ที่ทำให้ loss ลดลง ด้วยการใช้ gradient descent ในการ minimize loss จนได้หลายๆ tree รวมกันออกมาจนทำนายแล้วได้ผลลัพธ์ที่ดีขึ้น
ส่วน DecisionTreeRegressor ก็เป็นการใช้ DecisionTree มาทำนายผลลัพธ์จากข้อมูล

ในครั้งแรกเราจะ train ด้วย RandomForestRegressor ก่อนจึงได้ทำ comment คลุม code โมเดลอื่นๆ ไว้ก่อน ครั้งต่อๆ ไปถ้าจะเรียกใช้ model อื่นตัวไหน ก็มา uncomment โมเดลตัวนั้นแทน

หลังจากลองเรียกใช้ function ดู เราก็สามารถดูความสำคัญของแต่ละ feature ได้โดยใช้ code ดังภาพ

หรืออาจ plot graph ดูได้ดังภาพ

พบว่า feature ที่สำคัญที่สุดก็คือ feature ที่ 12 ซึ่งก็คือข้อมูลอายุ

6. Evaluation : function eval_rmse(), eval_r2()

เมื่อเทรนโมเดลเรียบร้อยแล้ว ก็มาทดสอบโมเดลด้วยข้อมูลใหม่ที่โมเดลไม่เคยเห็นมาก่อน ก็คือข้อมูล testing data ที่เราได้แบ่งไว้ตอนต้น เราสามารถรู้ค่า prediction ได้โดยใช้ method predict()

จากนั้นเราจะสร้าง function สำหรับ evaluate model ในที่นี้สร้างไว้ 2 function คือ evaluate ด้วย root mean square (rmse) หนึ่งตัว และอีกตัวหนึ่ง evaluate ด้วย r square เขียน code ได้ตามภาพ

เราสามารถ plot ดูค่า prediction เทียบกับ test label ได้ดังภาพ

จะเห็นว่า ค่าของข้อมูลจริง (test label) มีการกระจายที่ไม่ได้มีแนวโน้มเป็นเส้นตรง แต่โมเดลของเราใช้ทำนายออกมาเป็นเส้นสีแดง ความแตกต่างระหว่างค่าของข้อมูลจริงกับค่าที่ทำนายออกมาจึงมีสูง ส่งผลให้ error สูง โมเดลของเราจึงมี performance ที่ไม่ค่อยดีนัก โดยค่า r square ติดลบถึง -3.91 (ค่าที่ดีควรอยู่ระหว่าง 0 ถึง 1 โดยยิ่งใกล้ 1 ยิ่งดี)

ตอนนี้เราอาจทดลองด้วยข้อมูลใหม่ โดยสอบถามข้อมูลจากเพื่อนในห้อง แล้วใส่ข้อมูลใหม่เข้าไปให้ โมเดล predict ออกมา

ในความเป็นจริงเพื่อนของเราคนนี้หนักเพียง 70 kg แต่ทำนายออกมาได้ 83 kg ก็แสดงว่าโมเดลทำนายได้ไม่แม่นยำเท่าไรนัก

วิเคราะห์หาสาเหตุ

เราลองลด dimension ของ feature ทั้งหมดของ testing data ให้เหลือแค่ 1 dimension โดยใช้ PCA เพื่อดูการกระจายตัวของข้อมูลระหว่าง feature ทั้งหมดที่ลด dimension แล้ว (test_pca) เทียบกับค่าน้ำหนักของข้อมูลจริง (test_label) และ ค่าน้ำหนักที่ predict ออกมาได้ โดย plot ออกมาได้ดังภาพ

จุดสีน้ำเงินคือ การ plot ค่าของ test_label กับ test_pca
จุดสีส้ม คือการ plot ค่าของ prediction กับ test_pca
ก็จะเห็นได้ว่ามีการกระจายตัวที่แตกต่างกันอยู่พอสมควร โดยเมื่อใช้ feature ทั้งหมดใน testing data มาทำนาย พบว่าค่าน้ำหนักที่ทำนายได้ (predict) ไม่ได้มีการกระจายตัวเหมือนกับค่าน้ำหนักของข้อมูลจริง (test_label)

เรากลับไปเช็คดูที่ training data โดย plot ดูการกระจายตัวของ train_pca กับ train_label

พบว่า train_pca กับ train_label ไม่ได้กระจายตัวในรูปแบบ linear ทำให้ model ทำนายผลออกมาได้ไม่ตรง มี error สูง โจทย์ในครั้งนี้ของเราจึงไม่น่าจะใช้ model แบบ linear มาทำนาย ควรปรับไปใช้ model อื่นๆ

7. Pipeline : function pipeline()

ตอนนี้เราก็มี function สำหรับทุก task พร้อมแล้ว ก็จะนำทุกอย่างมารวมกันใน function pipeline()

อธิบาย code ตามบรรทัด
1 : สร้าง function pipeline()
3 : เรียกใช้ function load_data() เก็บข้อมูล dataframe ลงใน survey_df
6 : เรียกใช้ function clean_data(survery_df) เพื่อ clean ข้อมูล แล้วเก็บไว้ใน clean_df
9 : เรียกใช้ function split_train_test(clean_df) เพื่อ แบ่งข้อมูล train-test เก็บไว้ใน train_df กับ test_df
12 : เรียกใช้ function extract_feature(train_df) เพื่อแบ่ง feat กับ label ของ training data
13 : เรียกใช้ function extract_feature(test_df) เพื่อแบ่ง feat กับ label ของ testing data
16 : เทรนโมเดลด้วยข้อมูล training data เก็บไว้ใน model
19 : ใช้ model ที่ได้ทำนายค่าจาก testing data
20 : พิมพ์ผลลัพธ์ root mean square ของ model ที่ได้ออกมา

ต่อมาก็ลองรัน pipeline ดู ก็จะได้ค่า rmse ออกมา อยู่ที่ 22.81 ซึ่งถือว่าค่อนข้างมาก แสดงว่า model นี้ยังทำงานได้ไม่ค่อยดี ก็เก็บตัวนี้ไว้เป็น baseline แล้วหา model อื่นๆ มาเทรนแล้วเปรียบเทียบค่า rmse ที่ได้ ถ้า model ไหนได้ค่า rmse น้อยที่สุด ก็จะเป็น model ที่ performance ดีที่สุดนั่นเอง

ตอนใกล้จบ class ผู้สอนก็ได้ลองถามผู้เรียนว่า คิดว่าควรจะทำปัญหานี้ต่อไปไหม ผลที่ได้คือ 50:50 ผู้สอนจึงทดลองเปลี่ยน pipeline() ให้ train ด้วยข้อมูลที่น้อยลง (ด้วยการนำ training data หารด้วย 8 ตาม code บรรทัดที่ 15–16) ดังภาพ

เมื่อลองรัน pipeline2 ก็พบว่า ได้ค่า rmse ที่สูงกว่าตัวเดิม อย่างนี้หมายความว่า model ตัวนี้ เมื่อเทรนด้วยข้อมูลจำนวนน้อย (ใน pipeline2) ได้ผลลัพธ์ที่ไม่ค่อยดี (rmse = 26.46) แต่เมื่อเราเทรนด้วยข้อมูลมากขึ้น (ใน pipeline เดิม) เราได้ผลลัพธ์ที่ดีขึ้น (rmse = 22.81) แสดงให้เห็นว่าด้วย model ตัวเดิม แค่มีข้อมูลที่มากขึ้น ก็สามารถได้ performance ที่ดีขึ้น แปลว่าถ้าเราทำปัญหานี้ต่อไป น่าจะได้โมเดลที่ดีขึ้นเรื่อยๆ

ก็เป็นข้อเตือนใจให้กับผู้เรียนทุกคนว่า ควรจะทดลองทำหลายๆ แนวทาง ให้ได้มากที่สุด ดีกว่าที่จะรีบยอมแพ้เมื่อเห็นผลลัพธ์ที่ไม่ค่อยดีในตอนแรก ควรจะมองว่ามันเป็น baseline สำหรับการพัฒนาให้ดียิ่งขึ้นไปจะดีกว่า เพราะกระบวนการทำ data science นั้น ไม่มีใครที่รู้คำตอบที่ถูกต้องตั้งแต่แรก ทุกคนก็ต้องลองผิดลองถูกไป ถ้าเราไม่ยอมแพ้ ก็อาจจะได้คำตอบหรือผลลัพธ์ที่ดีขึ้นได้ในที่สุด

--

--

Krirk Arunoprayote
botnoi-classroom

AI enthusiast, currently working as Data Scientist at Botnoi Consulting Co., Ltd.