Fraud detection #1: สร้างโมเดลจับการโกงบัตรเครดิต
วันก่อนไปคุยกับลูกค้า เค้าเล่าให้ฟังว่าตอนนี้กำลังพัฒนาโมเดล Fraud detection อยู่ ฟังรายละเอียดแล้วน่าสนใจดี เลยอยากลองทำเองดูบ้าง แต่ว่าลูกค้าไม่ได้ลง Details อะไรเกี่ยวกับโมเดลที่ทำอยู่ ซึ่งเข้าใจดีมาก ๆ ว่าเป็น Confidential ดังนั้นวันนี้ลองมาหา Dataset แล้วก็วิธีการลองสร้างโมเดลง่าย ๆ ขึ้นมาก่อนดีกว่า
ก่อนอื่นเลย… ถ้าคนไม่ได้ทำงานเกี่ยวกับสาย Banking คงสงสัยว่า Fraud detection คืออะไร?
What is the fraud detection?
คำตอบที่ง่ายที่สุดของคำถามนี้คือ การตรวจสอบการทุจริต ที่เกิดขึ้นในองค์กรหรือธุรกิจ ซึ่งสามารถทำได้หลายวิธีมาก ซึ่งแต่ละหน่วยงานก็มีวิธีการที่ต่างกันออกไป อาจมีตั้งแต่การขอดูเอกสาร หรือข้อความแชทส่วนตัว (ถ้ามีการยิมยอม) รวมไปถึงการใช้ Data ที่เกิดขึ้นไปแล้ว หารูปแบบการกระทำความผิด แต่ใจความสำคัญคือ การทำผิดย่อมทิ้งร่องรอยไว้เสมอ ดังนั้นถ้าเราหารูปแบบเจอ เราก็สามารถสืบต่อไปได้เรื่อย ๆ
การทำผิดความย่อมทิ้งร่องรอยไว้เสมอ
จากสายงานที่ทำอยู่นั้น การกระทำความผิดมักปรากฎอยู่ในรูปแบบ Transaction หรือข้อมูลการทำรายการของลูกค้ารายนั้น ๆ โจทย์ต่อไปคือจะคนที่ทำการทุจริตจากอะไรดี? หรือหาอย่างไรดี?
How to detect fraud?
สิ่งหนึ่งที่พบเจอบ่อย ๆ และอาจเป็นปัญหาที่เกิดขึ้นกับ Data ที่นำมาทำ Fraud detection model ก็คือข้อมูล Target ที่เราสนใจ ในนี้แน่นอนว่าคือ คนโกง (Fraud) ซึ่งร้อยทั้งร้อยจะมีปริมาณที่น้อยอย่างมีนัยยะสำคัญ หรือถ้าเรียกภาษาโมเดล เราเรียกข้อมูลประเภทนี้ว่า Imbalance data ถ้านึกภาพไม่ออกว่ามันเป็นยังไง ขอยกตัวอย่างให้ดูเช่น
ข้อมูลลูกค้าทั้งหมด 1 แสนราย อาจมีลูกค้าที่โกงเพียงแค่ 20 ราย
ซึ่งถ้ามองในมุมของ Business มันคงสมเหตุสมผล เพราะถ้าธุรกิจหรือองค์กร มีคนโกงเยอะอย่างมีนัยยะสำคัญ การโมเดลประเภทนี้คงไม่ยากมาก (หรือไม่อาจไม่ต้องทำโมเดลเลยด้วยซ้ำ) แต่แน่นอนว่าธุรกิจไปไม่รอดแน่ ๆ แต่ถ้าในเชิง Modelling แล้ว ข้อมูลประเภทนี้มีปัญหาอย่างมาก เพราะจะแก้ปัญหา Classification (แยกคนปกติออกจากคนโกง) มันแทบเป็นไปไม่ได้เลย ดังนั้นการออกแบบโมเดล จึงมันนิยมใช้วิธีการ Reconstruction error
Autoencoder
ก่อนไปถึงเรื่อง Reconstruction error ควรมาทำความรู้จักกับ Autoencoder กันก่อนว่ามันคืออะไร
Autoencoder คือการบีบอัดข้อมูลด้วย Neural Network ถือว่าเป็นเทคนิคในการลดมิติ (Dimension) ของข้อมูลอย่างหนึ่ง จากนั้นทำการ Reconstruct (Decoder) ใหม่ เพื่อให้ได้ขนาดมิติข้อมูลเท่าเดิม
อาจฟังดูงง ๆ ว่าทำแบบนี้ไปเพื่ออะไร ทำไมต้องมาบีบข้อมูลให้เล็กลง และทำมันกลับมาให้ได้ขนาดเท่าเดิมด้วย? และสุดท้ายจะได้อะไรจากการทำแบบนี้
คำตอบคือ… สิ่งที่เราได้จากการทำ Autoencoder คือได้ Network ที่มีความสามารถในการเรียนรู้กับข้อมูล Input ที่เราใส่เข้าไป ดังนั้นเมื่อมี Input ใหม่ ๆ เข้ามานอกเหนือจาก Training data ตัว Network ที่เรา Train ก็สามารถทำงานของมันเองได้ ซึ่งความสามารถนี้สามารถนำไปใช้งานได้อย่างหลากหลาย ไม่ว่าจะเป็นการแยก Spam SMS ไปจนถึงการทำ Deepfakes หรือที่รู้จักในรูปแบบโมเดลการจำลองหน้า
How to use autoencoder with fraud detection?
มาถึงใจความสำคัญของการทำโมเดลแล้วคือ การใช้ Autoencoder กับงาน Fraud detection ได้ยังไง… สิ่งที่สังเกตได้จากข้อมูลที่เราต้องใช้ Train model มันเป็น Imbalance dataset ดังนั้นจึงถือว่า Event fraud เป็น Anomaly event
สิ่งที่ต้องทำคือการ Training model (Encode →Decode) ข้อมูลด้วย Normal event เท่านั้น เพราะสิ่งที่ต้องการคือ Network ที่มีความสามารถในการเรียนรู้ Event ปกติเท่านั้น เมื่อนำไปใช้งาน ถ้าข้อมูล Input ของเราเป็น Event ปกติ Autoencoder ควรจะสามารถ Reconstruct ข้อมูลออกมาได้ดี (เกิด Error น้อย) แต่หาก Input เป็น Anomaly event ตัว Network ที่สร้างขึ้นไม่ควรรู้จักข้อมูลในลักษณะนี้ ดังนั้นจึงส่งผลไปถึง Error ที่สูงขึ้นเมื่อ Reconstruct กลับมา ใช้ประโยชร์จากจุดนี้จึงสามารถ Detect ข้อมูลที่ไม่ปกติ หรือ Fraud นั่นเอง ด้วยวิธีการนี้ทำให้สามารถ Overcome เรื่องข้อมูลที่มีจำกัดได้
(ไม่ใช่ว่าวิธีนี้เป็นวิธีการที่ดีที่สุด เราสามารถใช้ Classification model ปกติ เช่น Logistic regression ในการทำได้เช่นกัน แต่ควรมีการจัดการเรื่อง Imbalance dataset ให้เหมาะสมก่อนเริ่มทำโมเดล)
Dataset
จากที่เกริ่นมาทั้งหมด ตอนนี้สามารถเริ่มทำโมเดลกันได้แล้ว Dataset ที่ใช้คือข้อมูล Credit card ที่มีการทุจริตเกิดขึ้น สามารถโหลดได้จาก Kaggle ลิงค์ข้างล่าง
เล่าถึงข้อมูลในเบื้องต้นก่อนว่า ข้อมูลชุดนี้คือข้อมูล Transaction ของ Credit card มีทั้งหมดประมาณ 280k transaction โดยที่ Features มีทั้งหมด 28 + 2 ตัว ซึ่ง 28 ตัวแรกผ่านการทำ PCA มาก่อนแล้ว ดังนั้นจึงไม่ใช่ข้อมูล Raw data แต่คงไม่ต้องสนใจในจุดนี้มาก เพราะการ Transforme ข้อมูลสามารถทำได้ด้วย Method ที่หลากหลาย และ PCA ก็เป็นหนึ่งในวิธีที่นิยม ส่วนข้อมูล 2 ตัวหลังคือข้อมูล Amount และ Time ที่ยังไม่ได้มีการ Transform ด้วย PCA
ต่อไปเป็น Target ที่เราสนใจ ซึ่งก็คือ Class (0 = Normal, 1 = Fraud) จากข้อมูลทั้งหมด มี Fraud อยู่เพียง 492 transaction เท่านั้น จากทั้งหมด 280k transaction ถือเป็นตัวอย่างที่ดีของ Imbalance dataset
Code
เขียน Code การเตรียมข้อมูลก่อน Training model ด้วย Neural network ที่จะมีรายละเอียดในตอนต่อไป ซึ่งวันนี้ทุกอย่างทำบน Google Colab ทั้งหมด ดังนั้นเปิดตัว GPU ไว้ตั้งแต่ตอนเริ่มได้เลย
Libraries หลัก ๆ ที่จำเป็นในวันนี้ส่วนมากเป็นพวกที่ใช้กับ DataFrame เป็นส่วนมาก ใครถนัดแบบอื่นก็สามารถใช้ Libraries อื่นได้เช่นกัน เพราะสุดท้ายแล้ว ความต้องการคือ Data ที่สามารถโยนเข้าไป Train กับ Neural network ได้เท่านั้น
สิ่งที่อยากให้ดูคือรูปร่างของ Dataset และความ Imbalance ของข้อมูลมากกว่า สามารถใช้ seaborn.countplot()
และผ่าน Column ที่ต้องการนับจำนวนเข้าไป ในที่นี้ก็คือ Class
ที่มีการทำ Normal cases และ Fraud cases ไว้ เห็นได้ว่าจำนวนเคสปกติมีทั้งหมด 284,315 และเคสทุจริตมีเพียง 492 เท่านั้น
ต่อมาเรามาเริ่มทำ Dataset ให้พร้อมกับการ Training ของ Network เริ่มต้นด้วยขอ Drop column Time
ไม่ขอนำมาเป็น Feature เพราะดูไม่ค่อยมีความสัมพันธ์มากเท่าไหร่ จากนั้นขอทำการ Scale column Amount
ด้วย StandardScaler()
เพื่อทำการกำจัด Mean ออกไปก่อน (ทำให้ Basis มันใกล้เคียง PCA)
จากนั้นทำการแบ่ง Dataset ด้วย train_test_split
โดยวันนี้ขอแบ่งเป็น 80/20 โดย 20% เอาไว้ทดสอบโมเดลด้วยการทำ Reconstruction error สิ่งหนึ่งที่ต่างออกไปจากการโมเดลปกติคือ Training dataset มีแค่ Features ของ Class ปกติเท่านั้น ไม่มี Dependence หรือตัวแปร Y เข้ามาเกี่ยวข้อง Dataset สุดท้ายจะได้ Shape ตามด้านล่างนี้
(227453, 29)
(56962, 29)
(56962,)
ตอนนี้ทุกอย่างพร้อมทำ Autoencoder แล้ว แต่ขอหยุดไว้ตรงนี้ก่อนเพื่อไม่ให้เนื้อหาเยอะจนเกินไป ตอนต่อไปคือการเริ่มเทรนโมเดล และการนำโมเดลไปลองใช้งาน