บทความนี้จะเป็นบทความที่มีเนื้อหาต่อเนื่องมาจากบทความที่แล้ว ซึ่งอ่านได้ที่ลิ้งนี้ PART1 โดยจะเป็นการพูดถึง SHAP values หรือก็คือเป็นวิธีนึงที่เราสามารถนำมาใช้หา feature importances ทั้งระดับ global และ local ได้นั่นเอง
SHAP ย่อมาจาก SHapley Additive exPlanations ซึ่งเป็นวิธีนึงที่สามารถใช้หา feature importances ได้ โดยใน SHAP feature importances จะถูกคำนวณมาจากค่า Shapley values ที่มีจุดกำเนิดจาก game thoery
โดยการจะเข้าใจ Shapley values ผมขอยกตัวอย่างสถานการณ์ ดังต่อไปนี้
สมมติว่าเราเล่นเกมส์ออนไลน์เกมหนึ่ง โดย ผู้เล่น (Players) ในปาร์ตี้มีทั้งหมด 3 คน ชื่อนาย A,B,C โดยปาร์ตี้นี้กำลังทำการตีมอนส์เตอร์ในเกมดังในรูป
โดยผมขอยกตัวอย่างสถานการณ์เป็นดังนี้
- ถ้า A ตีบอสคนเดียว A จะสามารถลดเลือดบอสได้ 10 หน่วย
- ถ้า B ตีบอสคนเดียว B จะสามารถลดเลือดบอสได้ 20 หน่วย
- ถ้า C ตีบอสคนเดียว C จะสามารถลดเลือดบอสได้ 25 หน่วย
- แต่ถ้า A และ B ช่วยกันตีบอสจะสามารถลดเลือดได้ถึง 40 หน่วย
โดยจะสังเกตเห็นว่ามากกว่าการบวกกันตรง ๆ โดยอาจจะเป็นเพราะความสามารถส่งเสริมกัน - แต่ถ้า B และ C ช่วยกันตีบอสจะสามารถลดเลือดได้แค่ 30 หน่วย
โดยจะสังเกตเห็นว่าน้อยกว่าการบวกกันตรง ๆ โดยอาจจะเป็นเพราะความสามารถของ B และ C ไม่เข้ากัน - แต่ถ้า A และ C ช่วยกันตีบอสจะสามารถลดเลือดได้ถึง 50 หน่วย
โดยจะสังเกตเห็นว่ามากกว่าการบวกกันตรง ๆ โดยอาจจะเป็นเพราะความสามารถส่งเสริมกัน - ถ้า A,B,C ช่วยกันตีบอสจะสามารถลดเลือดได้ถึง 80 หน่วย
โดยจะสังเกตเห็นว่ามากกว่าการบวกกันตรง ๆ โดยอาจจะเป็นเพราะความสามารถส่งเสริมกัน
โดยรายละเอียดเป็นไปตามตารางด้านล่างที่แสดง โดย V(S) คือ total contribution ที่ member ใน S ร่วมมือกัน หรือก็ค่าเลือดของบอสที่ลดลงที่เกิดจากสมาชิกที่ทำนั่นเอง
คำถามต่อมาก็คือ เราจะสามารถรู้ได้อย่างไรว่า players คนไหนช่วยลดเลือด (มี contribution) มอนส์เตอร์มากที่สุด ?
คำตอบก็คือ เราสามารถหาได้จากความแตกต่างของเลือดมอนส์เตอร์ที่ลดลง แบ่งตามเคสต่าง ๆ เช่น เมื่อ A เล่นคนเดียว หรือเมื่อ A ไปเป็นสมาชิกในปาร์ตี้กับ B หรือเคสอื่น ๆ ดังตารางข้างต้น โดยค่า final contribution ของ A สามารถหาได้จากค่าเฉลี่ยที่ A ทำการลดเลือดได้ในแต่ละเคส โดยคิดเพียงแค่นั้นยังไม่พอลำดับของการร่วมมือกันหรือ permutations ก็ส่งผลด้วย เช่น
ในกรณีที่ลำดับเป็น A,B,C กับ C,A,B จะให้ค่าที่ไม่เท่ากัน อาจเป็นเพราะว่าหากลำดับการเข้าโจมตีของ A,B,C อาจจะช่วยส่งเสริมกันมากกว่า (ในที่นี้จะขอละเว้นในส่วนของคณิตศาสตร์ออกไป)
ดังนั้นค่า Shapley Value ของ A ก็คือค่าเฉลี่ยที่ A ทำเลือดมอนส์เตอร์ลดได้ ในทุก possible combination นั่นเอง
โดยหากเราลองเทียบกับใน machine learning ในส่วนของ players ก็คือ features นั่นเอง และเลือดของมอนส์เตอร์ก็คือ loss function หรือก็คือบ่งบอกถึง model performance นั่นเอง ดังนั้นค่านี้ก็คือค่าที่บ่งบอกได้ว่า feature ที่เราสนใจส่งผลต่อโมเดลมากแค่ไหนนั่นเอง
หากเราลองคิดย้อนกลับไป ลำดับของผู้เล่นให้ค่าที่แตกต่างกัน ก็เพราะว่า สมมติโมเดลของเราเป็น tree based หากเราลำดับในการพิจารณาการแตกกิ่งเป็น feature A,B และ C ตามลำดับ เมื่อเปรียบเทียบกับการใช้ C แตกก่อน และตามด้วย A และ B แน่นอนว่าก็จะให้ผลที่แตกต่างกันนั่นเอง
ดังนั้นโดยสรุปแล้ว Shapley values ก็คือค่าเฉลี่ยของ marginal contributions ของ feature นั้น ๆ ที่เกิดขึ้นทั้งหมดนั่นเอง
- SHAP สามารถนำไปใช้อธิบาย global interpretation ได้ โดย SHAP values สามารถบอกได้ว่า features แต่ละตัว มี contribution ต่อโมเดลเป็นอย่างไร โดยสามารถบอกได้ถึงว่า features ส่งผล positive หรือ negative ต่อ target ของเรา หรือก็คือการหา feature importances ที่ระดับโมเดลนั่นเอง
ขั้นตอนในการทำ SHAP นั้นสามารถทำได้ง่าย ๆ ดังรูปที่ 1 ด้านล่างนี้ โดย dataset ที่ใช้จะเป็น dataset wine เหมือนเดิมดังบทความที่แล้ว
สำหรับใครที่ยังไม่มี SHAP ก็สามารถลงได้ง่าย ๆ ด้วยคำสั่ง !pip install shap
โดยจากรูปที่ 1 จุดที่อยู่ในกราฟแต่ละจุดเป็นตัวแทนของแต่ละ data point แบ่งตาม feature เลย และมีวิธีอ่านกราฟดังนี้
- Feature Importance : ความสำคัญของ feature สามารถดูได้จากลำดับในทางซ้าย โดย feature ที่สำคัญที่สุดจะอยู่ด้านบน และ feature ที่สำคัญน้อยที่สุดจะอยู่ข้างล่างนั่นเอง ดังนั้น ในกรณีนี้คือ Alcohol สำคัญที่สุด และ residual sugar สำคัญน้อยที่สุดนั่นเอง
- Feature value : โดยสีของ data จะแสดงถึงค่าของตัวแปรนั้นในแต่ละ observation ว่ามีค่าสูงหรือต่ำ โดยจากกราฟสีแดงจะหมายถึงมีค่าสูง และสีฟ้าจะหมายถึงมีค่าต่ำ
- Impact on model output : ดูว่าค่าของ feature แต่ละ feature ส่งผลต่อค่า prediction มากน้อยแค่ไหนได้จากแกนนอน (SHAP value) โดยสามารถดูได้ด้วยว่า feature นั้นส่งผลทำให้ prediction มีค่ามากขึ้นหรือน้อยลง เช่น feature alcohol จะเห็นว่าจุดสีแดงส่วนใหญ่อยู่ฝั่งขวา และจุดสีฟ้าส่วนใหญ่อยู่ฝั่งซ้าย ซึ่งสามารถแปลความหมายได้ว่า ถ้า alcohol มีค่ามากจะส่งผลให้ ค่า SHAP value มากขึ้น หรือก็คือ predict class 1 มากขึ้นนั่นเอง
- Correlation : โดยจากตัวอย่าง alcohol จะเห็นได้ว่าถ้า alcohol มีค่ามากจะทำให้ predict class 1 ออกมา เป็นต้น
โดยหากเราคิดว่ากราฟแบบนี้อ่านยาก เราก็ยังสามารถ plot เป็น bar chart ออกมาเพื่อง่ายต่อการดูความสำคัญของ feature ดังรูปที่ 2 ด้านล่าง
นอกจากนี้ในระดับ Global interpretation เรายังสามารถใช้ SHAP เพื่อ plot หาความสัมพันธ์ระหว่าง feature และ SHAP value ได้ด้วยการเรียกใช้ SHAP dependence plot โดยใช้คำสั่ง shap.dependence_plot("alcohol",shap_values,x_test)
โดยฟังก์ชันนี้จะเรียกอีกตัวแปรที่สัมพันธ์กับ variable ที่เราเลือก (alcohol) อีกด้วย
2. SHAP สามารถนำไปใช้อธิบาย local interpretation ได้ หรือก็คือสามารถดูเฉพาะ observation ที่สนใจได้เลย ว่าแต่ละ feature มีผลยังไงต่อค่าการทำนายใน observation นั้น
โดยสามารถทำได้ดังนี้ สมมติว่าเราสนใจว่า โมเดลเราจะทำนาย class อะไรออกมา สำหรับ observation 1 ใน test set โดย row แรกของ test set มีหน้าตาดังรูปที่ 4 ต่อไปนี้