Partial Least Squares regression (PLS) ดีกว่า PCA ยังไง

Sasiwut Chaiyadecha
3 min readDec 2, 2020

--

Partial Least Squares Regression pls python pcr

ยังต่อเนื่องสำหรับการทำโมเดลที่เกี่ยวกับการ Decomposition ตัวแปร 2 ตอนก่อนหน้านี้ได้มีการพูดถึงการทำ PCA เพื่อลดมิติของข้อมูล และการนำ Component ที่ Decompose เสร็จแล้วไปใช้ต่อสำหรับงาน Regression สามารถย้อนกลับไปอ่าน 2 ตอนก่อนหน้านี้ เพื่อความต่อเนื่อง เพราะข้อมูลที่นำมาประกอบ Blog เป็นข้อมูลชุดเดียวกัน ซึ่งสามารถอ่านได้จาก Link ด้านล่าง

What is the PLS?

ก่อนจบตอนที่แล้วได้มีการพูดถึงโมเดลอีกประเภทหนึ่งชื่อว่า Partial Least Squares regression (PLS) ที่เป็นโมเดลสำหรับการ Decomposition และทำการ Prediction ตัวแปร เช่นเดียวกับ PCR แต่แตกกันที่ PLS เป็น Supervised learning ที่แตกต่างจาก PCR ที่มีที่มาจาก Unsupervised learning ในที่นี้คือ PCA

ความแตกต่างของการ Learning ทั้งสองอย่างนี้คือ Unsupervised learning อย่าง PCA ที่มีพิจารณาเฉพาะข้อมูลที่เป็น Features อย่างเดียว ดังนั้นจึงมีการหาค่า Covariance จากตัวแปร X ด้วยกันเท่านั้น

ในขณะที่ Supervised learning เป็นการเรียนรู้ที่นำตัวแปร Dependence variable หรือ Target มาเป็นส่วนหนึ่งในการพิจารณา ซึ่งมีความแตกต่างจาก Unsupervised learning คือ มีการหาค่า Covariance จากตัวแปร X และตัวแปร Y จึงทำให้โอกาสที่จะสูญเสียค่า Correlation เกิดขึ้นยากกว่าจากวิธีการเรียนรู้แบบนี้

Code

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

ก่อนเริ่มเข้าสู่โมเดล ลองหา Correlation ของข้อมูลทั้งหมดว่ามีความสัมพันธ์กับ Target (Y) ในลักษณะใดบ้าง

Partial Least Squares Regression pls python pcr correlation

ความสัมพันธ์ของ Features ที่มีกับ Target อยู่ในระดับที่ค่อนข้างสูง สามารถสังเกตเร็ว ๆ ได้จากสีที่ออกโทนเข้มไปเกือบทั้งภาพ ดังนั้นความแตกต่างของโมเดล PCR และ PLS อาจยังไม่ชัดมากกับข้อมูลลักษณะนี้

R-Square: 86.33%
MSE: 12.61%

ขั้นตอนของการทำโมเดล PLS ยังเหมือนกับ PCR ที่ต้องมีการ Standardised ข้อมูลก่อน ซึ่งค่า R-Square และ MSE ที่ออกมามีค่าเท่ากับโมเดลจากตอนก่อนหน้านี้

จริง ๆ แล้วตามหลักการที่ถูกต้อง ควรมีการ Standardised ข้อมูล Target เพื่อให้ข้อมูลอยู่ในระนาบเดียวกันก่อนทำการ Fit โมเดล แต่ครั้งนี้ต้องการเทียบผลกับ PCR โมเดลที่ตัวแปร Y ไม่ได้มีการ Transform ใด ๆ ดังนั้นจึงขอไม่ Transform ตัวแปร Y สำหรับ PLS เช่นกัน

การทำโมเดล PLS เริ่มต้นด้วยการประกาศตัวแปร pls เพื่อรับ PLSRegression() และกำหนดให้การ Decompose เท่ากับ 1 เพื่อทำการเปรียบเทียบกับโมเดล PCR ก่อนหน้านี้ จากนั้นสามารถ .fit() โมเดลตามหลักการทำงานของ Library จาก Scikit learn

R-Square: 86.38%
MSE: 12.56%

ที่จำนวน Component ที่เท่ากันที่ 1 ค่า R-Square และ MSE จาก PLS มีค่ามากกว่าเล็กน้อย (PCR: 86.33%, PLS 86.38%) หากลองเปลี่ยนค่า n_components ในโมเดลแล้วทำการ .fit() โมเดลใหม่ ค่า R-Square และ MSE ที่ออกมา PLS จะมีค่ามากกว่าตลอด จนไปเท่ากันที่จำนวน Component ที่เยอะที่สุด (เท่ากับจำนวน Features) และเมื่อไม่มีการ Decompose ใด ๆ ค่า R-Square และ MSE จะมีค่าเท่ากับโมเดลที่ได้ออกมาจาก Linear regression

เขียนเป็นฟังก์ชั่นเพื่อให้เปรียบเทียบค่าได้สะดวก และทำการวนลูปเพื่อหาโมเดลจากทุก ๆ Components ออกมา

จากตัวที่อย่าง 1 Component อาจยังไม่เห็นความแตกต่างจากทั้ง 2 โมเดล ดังนั้นขอหยิบโมเดลจาก Component ที่ 3 ออกมาเพื่อเทียบความแตกต่าง

Partial Least Squares Regression pls python pcr
PCR R-Square: 86.45%, MSE: 12.50%
PLS R-Square: 87.77%, MSE: 11.28%

เห็นได้ว่าเส้นสีเขียวที่แทนด้วย PCR เริ่มมี Pattern ที่ไม่เหมือน PLS ที่ถูกแทนด้วยสีแดง แต่จริง ๆ แล้วอาจมองไม่เห็นความแตกต่างกันมากเท่าไหร่ เพราะตัวแปร Features มีค่า Correlation ที่สูงมาก ๆ กับตัวแปร Target อยู่แล้ว (อย่างที่บอกไปเมื่อตอนต้น) แต่ค่าที่ได้ออกมาจาก PLS โมเดลมีค่าที่ดีกว่าเล็กน้อย

Optimise PLS Regression

คำถามที่เกิดขึ้นสำหรับ PLS Regression คือ จำนวน Components ที่ควรใช้งาน ควรเป็นเท่าไหร่ดี? และแน่นอนว่าต้องน้อยกว่าจำนวน Features ทั้งหมด

เนื่องจาก PLS ไม่ได้มีค่าที่ใช้อธิบาย Variance เหมือนอย่าง PCA ที่สามารถบอกได้จากค่า Eigenvalues ดังนั้นการหาจำนวน Components ที่เหมาะสมสามารถนำเทคนิคอย่าง Cross validation (CV) มาใช้ได้ เทคนิคนี้ยังคงไม่ลงรายละเอียด ไว้โอกาสต่อ ๆ ไปคงได้เขียนถึงกันอีกรอบ เฉพาะตอนนี้ขอนำมาใช้งานในการทำ PLS โมเดลครั้งนี้ก่อน

เขียน Loop ฟังก์ชั่นขึ้นมาให้ Fitting model ด้วย Components ตั้งแต่ 1 ไปจนถึงจำนวน Features ทุกตัว โดย Fitting ผ่าน cross_val_predict() ซึ่งกำหนดให้ cv = 10 จากนั้นให้เก็บค่า R-Square และ MSE เอาไว้ในทุก ๆ การ Fitting

Optimised component (Highest R-Square): 4
Optimised component (Lowest MSE): 4

ค่าที่ Component ที่ออกมามีค่าเท่ากับ 4 (ต้อง +1 เพราะ Array เริ่มจาก Index ที่ 0) ที่มีค่า R-Square มากที่สุด และ MSE ต่ำที่สุด

Partial Least Squares Regression pls python pcr cross validation cv

โดย Component ที่ 4 มีค่า R-Square ที่ 84.61% และ MSE ที่ 14.20% ซึ่งต่ำที่สุดจากการทำ Cross validation แล้ว เมื่อได้ค่า Component ที่เหมาะสม ก็สามารถสร้าง PLS Regression ได้

Partial Least Squares Regression pls python pcr
PCR R-Square: 87.71%, MSE: 11.34%
PLS R-Square: 88.42%, MSE: 10.69%

ซึ่งเมื่อลอง Fitting กับข้อมูลทั้งหมดแล้ว PLS Model ได้ค่า R-Square ที่ 88.42% และ MSE ที่ 10.69% ซึ่งเยอะกว่า PCR Model ที่ Component เดียวกัน

Conclusion

จบแล้วสำหรับ Decomposition regression model ขอหยุดเรื่อง Decomposition ไว้สักพักหนึ่งก่อน ถ้ามีเทคนิคที่เกี่ยวข้องกับเรื่องนี้ ไว้โอกาสหน้าคงได้มาเขียนให้อ่านกันอีกรอบ

--

--

Sasiwut Chaiyadecha
Sasiwut Chaiyadecha

No responses yet