มาเปิด Black Box : Machine Learning Model เพื่อความเข้าใจโมเดล ด้วย LIME, ELI 5 และ SHAP กันเถอะ [2]

Pannawit Athipatcharawat
4 min readFeb 8, 2021

--

บทความนี้จะเป็นบทความที่มีเนื้อหาต่อเนื่องมาจากบทความที่แล้ว ซึ่งอ่านได้ที่ลิ้งนี้ PART1 โดยจะเป็นการพูดถึง SHAP values หรือก็คือเป็นวิธีนึงที่เราสามารถนำมาใช้หา feature importances ทั้งระดับ global และ local ได้นั่นเอง

What is SHAP ?

SHAP ย่อมาจาก SHapley Additive exPlanations ซึ่งเป็นวิธีนึงที่สามารถใช้หา feature importances ได้ โดยใน SHAP feature importances จะถูกคำนวณมาจากค่า Shapley values ที่มีจุดกำเนิดจาก game thoery

What is Shapley values?

โดยการจะเข้าใจ Shapley values ผมขอยกตัวอย่างสถานการณ์ ดังต่อไปนี้

สมมติว่าเราเล่นเกมส์ออนไลน์เกมหนึ่ง โดย ผู้เล่น (Players) ในปาร์ตี้มีทั้งหมด 3 คน ชื่อนาย A,B,C โดยปาร์ตี้นี้กำลังทำการตีมอนส์เตอร์ในเกมดังในรูป

ที่มา : Ragnarok: Battle Academy (extreme.game)

โดยผมขอยกตัวอย่างสถานการณ์เป็นดังนี้

  1. ถ้า A ตีบอสคนเดียว A จะสามารถลดเลือดบอสได้ 10 หน่วย
  2. ถ้า B ตีบอสคนเดียว B จะสามารถลดเลือดบอสได้ 20 หน่วย
  3. ถ้า C ตีบอสคนเดียว C จะสามารถลดเลือดบอสได้ 25 หน่วย
  4. แต่ถ้า A และ B ช่วยกันตีบอสจะสามารถลดเลือดได้ถึง 40 หน่วย
    โดยจะสังเกตเห็นว่ามากกว่าการบวกกันตรง ๆ โดยอาจจะเป็นเพราะความสามารถส่งเสริมกัน
  5. แต่ถ้า B และ C ช่วยกันตีบอสจะสามารถลดเลือดได้แค่ 30 หน่วย
    โดยจะสังเกตเห็นว่าน้อยกว่าการบวกกันตรง ๆ โดยอาจจะเป็นเพราะความสามารถของ B และ C ไม่เข้ากัน
  6. แต่ถ้า A และ C ช่วยกันตีบอสจะสามารถลดเลือดได้ถึง 50 หน่วย
    โดยจะสังเกตเห็นว่ามากกว่าการบวกกันตรง ๆ โดยอาจจะเป็นเพราะความสามารถส่งเสริมกัน
  7. ถ้า A,B,C ช่วยกันตีบอสจะสามารถลดเลือดได้ถึง 80 หน่วย
    โดยจะสังเกตเห็นว่ามากกว่าการบวกกันตรง ๆ โดยอาจจะเป็นเพราะความสามารถส่งเสริมกัน

โดยรายละเอียดเป็นไปตามตารางด้านล่างที่แสดง โดย V(S) คือ total contribution ที่ member ใน S ร่วมมือกัน หรือก็ค่าเลือดของบอสที่ลดลงที่เกิดจากสมาชิกที่ทำนั่นเอง

ตารางที่ 1 : Contribution ของแต่ละสมาชิกที่ลดเลือดมอนส์เตอร์

คำถามต่อมาก็คือ เราจะสามารถรู้ได้อย่างไรว่า 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 นำไปใช้ทำอะไร ?

  1. SHAP สามารถนำไปใช้อธิบาย global interpretation ได้ โดย SHAP values สามารถบอกได้ว่า features แต่ละตัว มี contribution ต่อโมเดลเป็นอย่างไร โดยสามารถบอกได้ถึงว่า features ส่งผล positive หรือ negative ต่อ target ของเรา หรือก็คือการหา feature importances ที่ระดับโมเดลนั่นเอง

ขั้นตอนในการทำ SHAP นั้นสามารถทำได้ง่าย ๆ ดังรูปที่ 1 ด้านล่างนี้ โดย dataset ที่ใช้จะเป็น dataset wine เหมือนเดิมดังบทความที่แล้ว
สำหรับใครที่ยังไม่มี SHAP ก็สามารถลงได้ง่าย ๆ ด้วยคำสั่ง !pip install shap

รูปที่ 1 : การใช้ SHAP เพื่อหา feature importances ระดับ global

โดยจากรูปที่ 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 ด้านล่าง

รูปที่ 2 : feature importances ที่หาจาก SHAP โดยแสดงในรูป bar chart

นอกจากนี้ในระดับ Global interpretation เรายังสามารถใช้ SHAP เพื่อ plot หาความสัมพันธ์ระหว่าง feature และ SHAP value ได้ด้วยการเรียกใช้ SHAP dependence plot โดยใช้คำสั่ง shap.dependence_plot("alcohol",shap_values,x_test) โดยฟังก์ชันนี้จะเรียกอีกตัวแปรที่สัมพันธ์กับ variable ที่เราเลือก (alcohol) อีกด้วย

รูปที่ 3 : SHAP dependence plot โดยดู feature alcohol

2. SHAP สามารถนำไปใช้อธิบาย local interpretation ได้ หรือก็คือสามารถดูเฉพาะ observation ที่สนใจได้เลย ว่าแต่ละ feature มีผลยังไงต่อค่าการทำนายใน observation นั้น

โดยสามารถทำได้ดังนี้ สมมติว่าเราสนใจว่า โมเดลเราจะทำนาย class อะไรออกมา สำหรับ observation 1 ใน test set โดย row แรกของ test set มีหน้าตาดังรูปที่ 4 ต่อไปนี้

รูปที่ 4 : ข้อมูลของ observation ที่ 1 ใน test set

โดยเราอยากรู้ว่า feature เหล่านี้ส่งผลยังไงต่อค่าการทำนายของ observation 1 สามารถทำได้ดังรูปที่ 5

รูปที่ 5 : การหา feature importances ระดับ observation โดยใช้ SHAP

โดยจากกราฟจะสามารถอธิบายได้ว่าที่ observation 1

  • Output value : คือค่าที่โมเดลทำนายออกมา ในที่นี้มีค่า -4.59 ซึ่งหากต้องการ 2 class คือ class 0 และ 1 แสดงว่า ในที่นี้จะทำนาย class 0 ออกมานั่นเอง
  • Base value : คือค่า mean ของค่า prediction ที่โมเดลทำนายออกมาทั้งหมด โดยในที่นี้มีค่า -2.132
  • Feature importance : จะดูจากแถบความกว้างของกราฟ เช่น ในที่นี้ alcohol มีความยาวมากที่สุด ก็จะสำคัญมากที่สุดนั่นเอง
  • Red/Blue : โดย feature ที่ส่งผลให้โมเดลทำนายค่ามาก (เสมือนผลักโมเดลไปด้านขวา) ก็คือสีแดง ส่วน feature ที่ส่งผลให้โมเดลทำนายค่าน้อย (เสมือนผลักโมเดลไปด้านซ้าย) ดังนั้นจากรูปจะเห็นว่า feature alcohol มีผลทำให้ค่า predict ไปทางลบ นั่นเอง

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

บทความนี้ได้รับการสนับสนุนจากบริษัท Knowledge Discovery Co., Ltd.

--

--

Pannawit Athipatcharawat
Pannawit Athipatcharawat

No responses yet