ของปลอมกับ e-commerce

Jessada Jack Pranee
4 min readJun 21, 2022

ช่วงก่อนหน้านี้เนื่องจากมีสถานการณ์โควิด จึงมีการซื้อของผ่านช่องทางออนไลน์กันมากขึ้น ซึ่งการซื้อของผ่านช่องทางออนไลน์จะเป็นการเลือกดูผ่านทางสมาร์ทโฟน ซึ่งเราจะไม่ได้เจอหรือจับตัวของจริง ๆ ซึ่งการซื้อของผ่านช่องทางออนไลน์ก็มีโอกาสที่จะเจอสินค้าปลอม แม้จะมีการคัดกรองจากผู้ให้บริการมาบ้างแล้วก็ตาม

ภาพจาก Disruptive Advertising

จากการสำรวจของ intelligencenode พบว่าในช่วงการระบาดของโควิดพบสินค้าปลอมมากถึงร้อยละ 38

ภาพจาก intelligencenode

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

ซึ่งผู้ซื้อเองก็มีโอกาสที่จะพลาดซื้อของปลอม หรือ อาจจะไม่ทราบว่าที่ซื้อมานั้นเป็นของปลอม

จากการสำรวจของ Local Circle จากคนอินเดียพบว่ามีเพียงร้อยละ 16 เท่านั้นที่มั่นใจว่าสามารถระบุสินค้าว่าเป็นของปลอมหรือของแท้ได้

ภาพจาก LocalCircles

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

ภาพจาก intelligencenode

จากปัญหาข้างต้นเราได้มีการให้ตัว Machine learning เรียนรู้การแยกของปลอม หรือ ของแท้โดยใช้หลักการเดียวกันกับมนุษย์ในการแยกก็คือการดูองค์ประกอบโดยรวม
โดยให้ชุดข้อมูลเรียนรู้และอ้างอิงค์จากข้อมูลดังนี้
1.ราคา
2.จำนวนสินค้าที่ถูกขาย
3.จำนวนรีวิวสินค้า
4.จำนวนคนที่ริวร้านค้าทั้งหมด
5.จำสินค้าที่ร้านค้าขายทั้งหมด
6.อัตราการตอบกลับของร้านค้า
7.จำนวนผู้ติดตามร้านค้า
8.ระยะเวลาที่เปิดร้านค้ามา
9.เรตติงของสินค้า

ซึ่งจะเก็บข้อมูลเหล่านี้ด้วยการใช้ selenium ในการเก็บข้อมูล ซึ่งเราเลือกเก็บเป็นเว็บสินค้า shopee โดยการเก็บข้อมูลมีโอกาสที่ข้อมูลจะซ้ำกัน ดังนั้นเราจึงเคลียร์ตัวที่ซ้ำกันออกโดยใช้ชื่อของสินค้า เป็นตัวบ่งบอกว่าซ้ำกันหรือไม่ แบ่งออกเป็น
ของแท้ทั้งหมด 3,916 หน่วย
ของปลอมทั้งหมด 462 หน่วย
ของโนแบรนด์ทั้งหมด 579 หน่วย

ตัวข้อมูลผมได้ทำการ label มือเองทั้งหมดถึง 4,957 ตัวและได้ทำการเปลี่ยนข้อมูลบางประเภทให้กลายเป็นตัวเลขที่สามารถคำนวณทางคณิตศาสตร์ได้ เช่น มีการเปลี่ยนหน่วย k และ m ต่อท้ายให้นำมาคูณ 1,000 และ 1,000,000 และ มีการเปลี่ยนหน่วย ปี เดือน สัปดาห์ ให้กลายเป็นหน่วย ชั่วโมงให้หมด

ซึ่งเราต้องการอัตราส่วนประมาณนี้ในการสอน
ของแท้ร้อยละ 55
ของปลอมร้อยละ 20
ของโนแบรนด์ร้อยละ 25
โดยอ้างอิงค์จากผลสำรวจจาก Local Circle และ incoproip ว่าพบของปลอมร้อยละเท่าใด ในช่วง 6 เดือนและ 12 เดือน จากความเป็นจริงเพื่อให้โมเดลเรียนตามความเป็นจริง

ภาพจาก Local Circle และ incoproip

หลังจากเก็บข้อมูลมาแล้วในครั้งแรกก่อนที่จะนำไปเทรนเพื่อที่จะได้อัตราส่วนที่ต้องการจึงใช้ Imbalance-learn (ห้ามไปใช้กับ test set เด็ดขาด) ไม่งั้นค่ามันจะเพี้ยน ซึ่งผมเคยทำในครั้งแรก โดยเราเลือกการ oversampling(smote)ในการเพิ่มจำนวนข้อมูลเพื่อให้ได้อัตราส่วนดังกล่าว

อัตราส่วนหลังการ smote

ชุดที่ใช้เรียน
ของแท้ 3,916 หน่วย
ของปลอม 1,424 หน่วย
ของโนแบรนด์ 1,780 หน่วย

ชุดที่ใช้ทดสอบ
ของแท้ 781 หน่วย
ของปลอม 97 หน่วย
ของโนแบรนด์ 114 หน่วย

ได้มีการนำโมเดลมาลองผ่าน cross validation
โดยเราได้คัดเลือกและทดสอบทั้งหมด 3 model
1.KNeighborsClassifier
2.RandomForestClassifier
3.xgboost

1.KNeighborsClassifier ที่เพื่อนบ้าน 4 ตัวใกล้ที่สุดจะมีผลออกมาดีที่สุด ที่ต้องเป็น 4 ตัวที่ใกล้ที่สุดเพราะ เรามีค่า y 3 ค่าคือของปลอม ของแท้ และของโนแบรนด์เวลามีการเช็คเกิดขึ้นจะได้ไม่เกิดกรณีที่มีโอกาสเท่ากัน

2.RandomForestClassifier ที่ความลึกสูงสุดที่ 10 ผลจะออกมาดีที่สุด ซึ่งโมเดลตัวนี้เป็น ensemble model หรือการนำหลายโมเดลมารวมกัน เป็นชนิด Bagging มีการสุ่มข้อมูล หรือ features ส่วนหนึ่งขึ้นมาสร้างโมเดล

3.xgboost โมเดลที่เทพที่สุดในตอนนี้เป็นโมเดล ensemble model แบบเดียวกับ RandomForestClassifier แต่นอกจากมีการ Bagging แล้วตัวโมเดลนี้ยังมีการ Boosting คือการนำผลของการทำนายครั้งก่อน มาปรับปรุงให้ดีขึ้น

(4.LogisticRegression เราเคยที่จะใช้มันในความคิดแรก ๆ เพราะว่ามันเหมาะกับคำตอบแบบ สองคำตอบหรือ binary ก็คือตอนแรกเราวางแผนให้มีแค่ 2 Label ก็คือ
1.ของปลอม 2.ของแท้ แต่ว่าระหว่างที่กำลัง Label ข้อมูลก็พบกับสินค้าอีกจำพวกหนึ่งที่ไม่สามารถระบุได้ทั้งของแท้และของปลอมจึง มีของโนแบรนด์ขึ้นมา จึงทำให้โมเดลนี้ไม่เหมาะกับงานของเรา)

ผลสรุปเราเลือก RandomForestClassifier เพราะดีกว่าทั้ง KNeighborsClassifier และ LogisticRegression ส่วนเหตุผลที่ไม่เลือก xgboost เป็นเพราะตัวโมเดลค่อนข้างที่จะช้าอยู่แล้วพอนำมารวมกับตัวเก็บข้อมูลที่ช้า ทำให้กว่าที่ผลลัพธ์จะออกมาก็ช้ากว่ากันพอสมควร ในขณะที่ทำได้ดีกว่าประมาณร้อยละ 1

เราเคยทดลองการนำ NLP มาใช้ในการทำนายเหมือนกัน โดยใช้เป็น TfidfVectorizer เพื่อเปลี่ยน คอมเมนต์ เป็นตัวเลขแล้วนำมาทำนายผล ผลที่ได้นั้นมีโอกาสที่แย่มากขึ้นในหลายโมเดลซึ่งแย่ลงสูงสุดมากถึง 15% เลยทีเดียว ในทางกลับกันมีโอกาสดีแค่บางโมเดลคือ KNeighborsClassifier เพิ่มเพียง 1% เท่านั้น ในส่วนที่ลดไปนั้นลดในส่วนของค่า recall ทั้งของปลอมและก็ของโนแบรนด์ซึ่งเป็นค่าสำคัญที่เราสนใจ
ซึ่งการเก็บข้อมูลประเภท คอมเมนต์ใช้เวลานานมากและยากกว่ามากถ้าเทียบกับตัวแปรอื่น ซึ่งไม่คุ้มค่าพอจะนำมาใช้ แต่ปัจจัยที่ทำให้โมเดลแย่ลงคิดว่าเป็นที่ผมไม่ได้คลีนคอมเมนต์ทำให้เจอ

1.โมเดลไม่รู้จักคอมเมนต์ปลอม
2.มีคอมเมนต์ประเภทที่พิมพ์ยาวไว้ก่อน เน้นได้สิทธิพิเศษ
3.คอมเมนต์ที่ไม่เกี่ยวข้องกับเนื้อหา

ได้มีการนำ shap มาใช้เพื่อวิเคราะห์ข้อมูลว่าตัวแปรใดมีผลต่อผลลัพธ์มากที่สุด

จากที่เห็นจะเห็นว่าจำนวนสินค้าที่ถูกขายไปนั้นมีผลมากที่สุดในการทำนาย ซึ่งเราก็ได้รู้ว่า sold, price, follower สำคัญมากในการประเมิณผล

ภาพข้างล่างจาก confusion matrix จาก RandomForestClassifier
โดยกำหนดว่า
ค่า 0 ของปลอม
ค่า 1 ของแท้
ค่า 2 คือของโนแบรนด์
จากที่ดูจาก confusion matrix จะเห็นว่าของปลอมมักจะมีโอกาสสับสนกับของโนแบรนด์สูง ส่วนของแท้ค่อนข้างที่จะแม่นยำอยู่แล้ว

ในส่วนของการ deploy เราเลือก cloud aws:Ec2 เพราะว่ามันสามารถพิมพ์ลงใน terminal ได้ ซึ่งเป็นเรื่องสำคัญมากเพราะว่า เราต้องให้ permission กับตัว geckodriver โดยการพิมพ์ไปที่ terminal ว่า chmod +x geckodriver และอีกทั้งตัว aws ยังสามารถปรับแต่ง server ได้ตามต้องการ

ในการสร้างเว็บไซด์เราเลือกใช้ library จาก python เพื่อความง่ายในการสร้างเหมาะสำหรับคนที่สร้างเว็บไม่เป็น หรือ เวลาน้อยซึ่ง library นั้นก็คือ streamlit

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

ลิ้งสินค้า

จะเห็นว่ามันทายออกมาเป็นของแท้ 100% ซึ่งมันผิดมันเป็นของปลอม ซึ่งครั้งแรกที่ผมเห็นผลนี้คือก่อนต้องส่ง 3 วัน ซึ่งในช่วงแรกผมเครียดแล้วก็ลนมาก แต่ก็ต้องยอมรับแล้วมาหาว่าอะไรคือสาเหตุ
1.สาเหตุแรกที่ผมคิดคือ model ผมไม่รู้จักข้อมูลประเภทนี้จึงไปดู dataset พบว่าข้อมูลที่มีจำนวนสินค้าที่ถูกขายหรือตัวแปร sold ที่มีค่าเป็น 0 มีเพียงข้อมูลเดียว
อาจเป็นเพราะข้อมูลไม่เพียงพอ

2.สาเหตุที่สองที่ผมคิด ได้มาจากการดู explainer ต่าง ๆ ซึ่งด้านล่างนี้เป็นการบอกว่าอะไรคือปัจจัยในการบอกว่าเป็นของแท้มากที่สุด

พอมาดู mean ของ sold ที่เป็นของแท้คือ 550 จาก dataset
พอมาดู mean ของ sold ที่เป็นของปลอมคือ 1768 จาก dataset
จึงไปดูที่ Decision Path Table index ที่ 656 Tree ที่ 49 จะเห็นว่ามี condition
บอกว่า 4.0<56.36~ มีโอกาส +43.86% ที่จะเป็นของแท้

มาดูใน index ที่ 3810 Tree ที่ 13 จะเห็นว่า condition บอกว่า sold 257>70
มีโอกาส -23.87% ที่จะเป็นของแท้

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

ซึ่งตัวที่เราทดลองมี sold เป็น 0 เลย ก็อาจจะมีผลมากในการทำนายว่าเป็นของแท้ซึ่งมันผิด

และยังมีอีกหลายตัวแปรเลยที่ใช้ในการคำนวณครั้งนี้แล้วโมเดลไปจำมาแบบผิด ๆ

ซึ่งทั้ง 2 ข้อที่ผมกล่าวมาคิดว่ามันเกิดจาก bias ของตัวโมเดล ที่เป็นแน่ ๆ คือ
1.Representation bias หรือ อคติจากข้อมูล จากที่เห็นจะเห็นว่าข้อมูลของผมในส่วนของ ของปลอม และ ของโนแบรนด์น้อยกว่ามากจึงทำให้เวลาไปทายตอนใช้จริงไม่ได้

2.Evaluation bias หรือ อคติจากการประเมิณคุณภาพ คือตัวข้อมูลที่ใช้ประเมิณมีของแท้มากกว่ากว่าตัวของปลอมและของโนแบรนด์ ซึ่งโมเดลเราเรียนของแท้เป็นหลัก
ดังนั้นค่าจึงออกมาสูง

ในขั้นตอนต่อไปหลังจากนี้เพื่อที่จะทำให้มันเก่งขึ้น
1.เพิ่มชุดข้อมูลในการเรียนรู้เพิ่มมากขึ้น
2.อาจจะเพิ่ม NLP มาช่วยในการเช็คคอมเมนต์ปลอม และ เช็คในการวิเคราะห์คอมเมนต์ที่บ่งบอกว่าเป็นของปลอม
3.อาจจะมีการลองใช้โมเดลตัวอื่น ๆ

github
Ai-Builder

--

--