TechJam 2019 by KBTG, Deep Data First Round Summary EP 2: Label Transformation

Phiratath Nopratanawong
KBTG Life
Published in
3 min readNov 30, 2019

เนื่องจาก Label ของเราคือ Income ที่มีการกระจายค่อนข้างมากและเบ้ขวาทำให้โมเดลเราจะรับมือกับการกระจายตัวของข้อมูลประเภทนี้ได้ลำบาก

ในส่วนนี้เราจะทำการดัดแปลง Label หรือ Income กันเพื่อให้โมเดลเราทำงานได้ดียิ่งขึ้น โดยจะแบ่งออกเป็น 3 เทคนิคด้วยกัน

  1. Log Transformation
  2. Quantile Transformation
  3. Clipping

Log Transformation นั้นทำได้ง่ายมากแค่นำ Log Function ไปใส่กับ Income ก็จะทำให้การ กระจายตัวของ Income ลดลงซึ่งการใช้ Log จะใช้รับมือกับข้อมูลที่มีการเบ้ขวาได้เป็นอย่างดี

Quantile Transformation การแบ่งข้อมูลตามการกระจายตัวของความถี่ของข้อมูลเพื่อปรับให้การกระจายตัวของ Label เป็น ไปตาม Distribution ให้เป็น Normal หรือ Uniform โดยจะทำการ Binning ให้แต่ละ Bin มีความถี่ที่พอๆกัน

แต่ข้อควรระวังในการทำ Transformation ใด ๆ คือ ถ้าเราทำการ Scale ที่เกี่ยวข้องกับการกระจายตัวของข้อมูล เราไม่ควรนำ Validate Set เข้าไป Fit ใน Scaler เพราะจะทำให้เกิดการที่หน้าตา Train กับ Validate ไม่เหมือนกันซึ่งอาจทำให้โมเดลทำงานได้แย่ลง

การกระจายตัวของ income ก่อนเข้า quantile transformation (plot ด้วย kde)
การกระจายตัวของ income หลังเข้า quantile transformation แบบ uniform (plot ด้วย kde)

Clipping คือการกำหนดค่าสูงสุด ต่ำสุดของข้อมูล ดังตัวอย่างด้านล่าง

เมื่อนำทั้ง 3 เทคนิคมาเปรียบเทียบกันจะเห็นได้ว่า Performance ของโมเดลทำงานได้ดีขึ้น

แต่ทำไมโมเดลถึงทำงานได้ดีขึ้นกันล่ะ ในจุดนี้เราต้องเข้าใจกันก่อนว่าโมเดลของเรามี Loss Function หรือ Objective Function นั้นเป็นยังไง

โดยส่วนใหญ่ Regression Tree จะแบ่งช่วงโดยใช้ Mean Square Error เป็นเกณท์ โดยถ้าเราใช้โมเดลพวก Gradient Boosting (Xgboost, LightGBM,Catboost , GBT) โดยส่วนใหญ่เราจะไล่หาจุดแบ่งที่ทำให้หาค่า MSE ได้น้อยสุด

Loss Function โดยทั่วไปของ Regression Tree Reference: https://www.dataquest.io/blog/understanding-regression-error-metrics/

จากสมการเราจะเห็นว่ายิ่งค่า Y มีมากเท่าไหร่ เราจะยิ่งแยกช่วงตรงนั้นได้ยากเท่านั้นเพราะจะมี Loss ที่สูงเป็นผลให้โมเดลของเราจะทำแต่การแบ่งตรงส่วนของ Income ที่มีน้อย ๆ หรือก็คือโมเดลเราจะนิยมตอบแต่ค่าน้อยๆแทนที่จะเป็นค่ามากๆ

ดังรูปด้านล่าง เพราะการแบ่งแบบนี้จะทำให้ Loss น้อยที่สุดซึ่งทำให้โมเดลเราจะ Error มากขึ้นเมื่อ Income มากขึ้น

การกระจายตัวของ Predicted Income ในแต่ละ Transformation

ดังนั้นการที่เราทำการ Label Transformation จะช่วยให้โมเดลทำงานได้ดีขึ้นเพราะเราได้ทำการลด Variance ของข้อมูลที่มีค่ามากๆลงนั้นเอง

ผลของ Validate Score ในแต่ละช่วง Income จะเห็นว่าการใส่ Log หรือ Quantile Transformation ทำให้โมเดลทำงานได้ดีขึ้นเมื่อ Income มากขึ้น

สรุปคะแนน TechJam ในแต่ละ Transformation
การกระจายตัวจอง TechJam Score ในแต่ละช่วง Income

นอกจากนี้ Score ที่เราใช้คำนวนก็ไม่ได้สอดคล้องกับ Objective Function ของโมเดลสักเท่าไหร่นักในจุดนี้ถ้าเราใช้ MAPE (Mean Absolute Percentage Error) เป็น Objective Function ของโมเดล ก็จะช่วยให้โมเดลเราทำงานได้ดีขึ้นเช่นกัน

Reference: https://www.dataquest.io/blog/understanding-regression-error-metrics/

หลาย ๆ คนมักจะคิดว่า Tree based model นั้นใช้งานได้ง่าย ทำงานได้ดีกับ noise จนลืมไปว่าถ้าหาก label มี noise ค่อนข้างมาก หรือ มีการกระจายตัวค่อนข้างมาก Tree based model จะทำงานได้แย่ลงทำให้การทำ Label Transformation เป็นสิ่งสำคัญในการทำให้โมเดลทำงานได้ดีขึ้น

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

ซึ่งในการนำโมเดลมาใช้จริงนั้นจะไม่ได้มีแค่ความแม่นของโมเดลเพียงอย่างเดียวแต่ยังรวมไปถึงการเข้าใจผลลัพธ์ของตัวโมเดลว่าทำไมโมเดลถึงเลือกตอบแบบนี้ พฤติกรรมของโมเดลเป็นอย่างไร ทำให้ Random Forest เป็นที่นิยมมากเพราะตัวโมเดลเข้าใจง่ายกว่า Gradient Boosted Tree หรือ Neural Network อย่างมาก แต่ในส่วนการแข่งขันจะเน้นที่ความแม่นหรือ Score เพียงอย่างเดียว เราจะเจอการใช้งานโมเดลที่หลากหลายมา Ensemble กันถึงแม้จะช่วย Boost คะแนนได้ไม่เยอะแต่ก็เป็นตัวตัดสินผลแพ้ชนะได้แล้ว

สำหรับผู้ที่สนใจศึกษาการทำโมเดล ในแต่ละการแข่งขันใน Kaggle ได้มีคนวาง Guideline คราว ๆ ในลิงค์ด้านล่าง ซึ่งขั้นตอนนั้นสามารถนำมาประยุกต์ใช้กับการแข่ง TechJam ได้เป็นอย่างดี

ซึ่งในส่วนต่อไปจะเป็นการทำโมเดลว่า tuning ยังไงและการปรับแก้ parameter ต่าง ๆ นั้นทำได้อย่างไร

Reference: https://scikit-learn.org/stable/auto_examples/compose/plot_transformed_target.html#sphx-glr-auto-examples-compose-plot-transformed-target-py

https://www.dataquest.io/blog/understanding-regression-error-metrics/

--

--