ทฤษฎี Logistic Regression เบื้องต้น

หมายเหตุ ผู้อ่านสามารถดู table of contents ของ machine learning ได้ที่ https://goo.gl/BExvUQ

ก่อนจะเข้าเนื้อหาผมขออนุญาติทำความเข้าใจกับสัญลักษณ์ที่ผมใช้ในบทความของผมก่อนนะครับ เนื่องจากบังเอิญได้รับ feedback ว่าสัญลักษณ์อาจจะทำให้เกิดความสับสนกับผู้อ่านได้

สัญลักษณ์ที่ใช้

จากรูปด้านบนจะเห็นว่าได้ bar symbol และ hat symbol ถึงแม้ผมไม่ได้ใส่ไว้บนตัวอักษรอย่างที่มันควรจะเป็นแต่อยากให้เข้าใจตรงกันว่ามันคือตัวเดียวกันนะครับ ซึ่งเหตุผลที่ผมพิมพ์ไปแบบนั้นก็เพราะผมยังหาวิธีใส่ symbol บนตัวอักษรไม่ได้เลยครับ T_T ท่านใดทราบวิธีการทำดังกล่าวใน medium รบกวนชี้แนะผมด้วยนะครับ

ในบทความที่แล้วเราได้ทำความรู้จักกับ supervised learning ที่ใช้ในงาน quantitative กันไปแล้ว( https://goo.gl/j9FcaJ) ในบทความนี้เราจะมาทำความรู้จักกับ algorithm อีกประเภทใน supervised learning กันนั้นคือ algorithm แบบ quantitative หรือ classification กันนั้นครับ ซึ่ง algorithm แนวนี้ตัวผลลัพธ์ที่ได้จะออกมาในรูปแบบการแบ่งกลุ่ม ตัวอย่างการนำไปใช้งานเช่น ในธนาคาอาจจะนำไปใช้ในแผนกสินเชื่อเพื่อตัดสินว่าลูกค้าคนนี้ควรอนุมัติสินเชื่อหรือไม่ โดยผลลัพธ์จะออกมาในแนว binary classification คือผ่านหรือไม่ผ่าน โดยหนึ่งใน algorithm ในงานลักษณะนี้คือ logistic regression เราสามารถเขียนออกมาได้ว่า

ความน่าจะเป็นที่ Y = 1

จากด้านบน p(X) ใช้สำหรับแสดงว่าเมื่อใส่ค่า X เข้าไปในสูตร ค่าความน่าจะเป็นที่Y มีค่าเท่ากับ 1 มีค่าเป็นเท่าไร ถ้าอ้างอิงจากตัวอย่างของแผนกสินเชื่อที่เราคุยกันไปก็จะออกมาได้ว่า เมื่อใส่ข้อมูลการเงินของลูกค้าเข้าไปใน model แล้ว เปอร์เซ็นของความน่าจะเป็นที่ลูกค้าคนนี้จะผิดสัญญาหรือ เรียกง่ายๆว่าไม่จ่ายเงินสินเชื่อคืนธนาคารนั้นมีค่าความน่าจะเป็นเท่าไร โดยแทนว่า 1 คือผิดสัญญาและ 0 คือไม่ผิดสัญญาซึ่งสามารถเขียนออกมาได้ว่า

ความน่าจะเป็นที่ลูกค้าจะผิดสัญญา

ทีนี้สูตรของ logistic regression ที่เราจะใช้เพื่อหาค่าความน่าจะเป็นที่ Y = 1 เมื่อใส่ X เข้าไป สามารถเขียนออกมาได้ตามสูตรด้านล่างนี้ซึ่งความน่าจะเป็นดังกล่าวจะได้ output เป็นค่าที่อยู่ระหว่าง 0 ถึง 1 โดยยิ่งค่าความน่าจะเป็นดังกล่าวเข้าใกล้ 1 มากเท่าไร นั้นหมายความว่าโอกาสที่ลูกค้าธนาคารจะผิดสัญญาหลังจากที่ได้รับเงินสินเชื่อไปแล้วยิ่งมีสูง

logistic function

จากสูตรจะเห็นว่า B0 และ B1 ตามมาหลอกหลอนเราอีกแล้ว 555+ และ coefficient 2 ค่านี้ละครับที่เราจำเป็นต้องทำการคำนวนหาจาก dataset ที่เรามีอยู่ แต่หลังจากทำการค้นคว้าหาสูตรสำหรับคำนวนค่าดังกล่าวกลับพบว่าเป็นเรื่องที่เกินความสามารถของผม(ณ ตอนนี้) ที่จะอธิบายสูตรดังกล่าวแล้วทำการแสดงตัวอย่างการคำนวนให้ออกมาง่ายเหมือนที่เราทำไปใน Linear Regression แต่อย่างไรก็ตามในบทความนี้ผมจึงขอแสดงวิธีการหาค่า coefficient ดังกล่าวโดยใช้ programming library กันนะครับ โดยในบทความนี้จะแสดงการหาค่าดังกล่าวโดยใช้ภาษา Python

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

dataset จำลองประวิตการขอสินเชื่อ

จาก dataset จะเห็นได้ว่าผมได้ทำการกำหนดเงื่อนไขเล็กๆเข้าไปในการสร้าง dataset นี้ นั้นคือถ้าเงินเดือนเกิน 22000 และมีประวัติชำระเงินคืนตามกำหนด จะถูกกำหนดให้ลูกค้าคนนั้น จะได้รับการอนุมัติการขอสินเชื่อทันที ซึ่งต้องขอชี้แจ้งตรงนี้เลยว่า ข้อมูลดังกล่าวผมพยายามจะสร้างขึ้นเพื่อให้ง่ายต่อการคำนวนและเห็นภาพการทำงานของ logistic regression ไม่ได้มีความเชื่อหรืออยากชี้นำใดๆระหว่างเงินเดือนและประวิตการขอสินเชื่อ เพราะท่านผู้อ่านคงทราบกันดีแล้วว่าการจะชำระเงินสินเชื่อคืนธนาคารตรงตามสัญญานั้น มันไม่ได้ขึ้นกับว่าคนคนนั้นจะมีเงินเดือนเท่าไร แต่มันขึ้นกับว่าคนคนนั้นมีวินัยและความรับผิดชอบมากแค่ไหน

ก่อนที่เราจะนำ dataset มาคำนวนมีสิ่งหนึ่งที่เป็นขั้นตอนที่สำคัญมากในการทำงานด้าน ML นั้นคือการ clean data หรือทำให้ข้อมูลอยู่ในรูปแบบที่เหมาะสมสำหรับการให้ computer คำนวน จะเห็นได้ว่าใน dataset ช่อง column ประวัติการชำระเงินคืนธนาคารและผลการอนุมัติ เป็นตัวหนังสือซึ่งมันไม่สามารถนำมาคำนวนได้ สิ่งที่เราต้องทำคือแปลงตัวหนังสือนั้นให้อยู่ในรูปแบบตัวเลข โดยใน dataset ประวัติการชำระเงินคืนแสดงผลอยู่แค่ 2 รูปแบบนั้นคือ “ตามกำหนด” และ “ล่าช้ากว่ากำหนด” ในกรณีนี้เราจึงสามารถแปลงตัวอักษรดังกล่าวให้เป็นตัวเลขได้ว่าถ้า “ตามกำหนด” จะแทนค่าด้วยตัวเลข 1 และจะใช้เลข 0 แทนและค่า “ล่าช้ากว่ากำหนด” และผลการอนุมัติที่ผ่านจะแทนค่าด้วย 1 และใช้ตัวเลข 0 แทนการที่ไม่ผ่านการอนุมัติ

dataset จำลองประวัติการขอสินเชื่อหลัง clean data

เมื่อได้ dataset ที่เหมาะสมแล้วเราก็มาเริ่มต้นการ code กันเลย

import library ที่จะทำการใช้งาน
load ข้อมูล dataset
แสดงตัวอย่าง dataset
แยกข้อมูลออกจาก label
ข้อมูลสำหรับ train ML และ test ผลลัพธ์
ผลการทำนาย
แสดงผลค่า coefficient ใน model

ถึงแม้ผลการทดสอบตัวอย่างของเราจะได้คะแนนที่สูงมากแบบ 100% ความแม่นยำแต่นั้นก็เพราะข้อมูลเรามีการดัดแปลงให้ง่ายต่อการทำนายอยู่ก่อนแล้ว ซึ่งจะตรงข้ามกับการทำงานจริงที่ผลการทำนายดังกล่าวแค่ได้เกิน 90% ส่วนตัวผมก็ถือว่าสูงแล้วครับ และไม่มีทางที่จะมีระบบ ML ใดในปัจจุบันไปได้ถึง 100%

ข้อมูลในรูปสุดท้ายแสดงค่า coefficient ที่ได้จากการคำนวน โดยจะประกอบไปด้วย B0, B1 ที่สัมพันธ์กับ feature 1 นั้นก็คือจำนวนเดือนเงิน และ B2 ที่สัมพันธ์กับ feature 2 นั้นก็คือ ประวัติการชำระเงิน ทีนี้เราก็จะสามารถแทนสูตรในข้างต้นได้แล้วครับ

สุดท้ายนี้ถ้าท่านใดมีข้อสงสัยหรือคำชี้แนะใดๆสามารถฝากข้อความได้ที่ https://www.facebook.com/coeffest/ นะครับ ขอบคุณมากครับที่ติดตาม