วันอาทิตย์ที่ 22 กันยายน พ.ศ. 2562

Simple Linear Regression


สวัสดีครับวันนี้จะมาแชร์เรื่อง Simple Linear Regression โดยการนำ Machine learning มาคำนวณเพื่อให้เห็นภาพและเข้าใจได้ง่ายถึงหลักการทำงานของ ML ที่เป็นรูปแบบของ Supervised Learning ครับ (Supervised Leaning คือการให้โปรแกรมเรียนรู้จากข้อมูลที่รู้ผลแน่ชัดอยู่แล้ว ถ้าให้เปรียบเทียบกับคนก็เหมือนกับให้โปรแกรมอ่านหนังสือก่อนที่จะนำเอาความรู้จากหนังสือที่ได้ไปประยุกต์ใช้งานนั้นเองครับ หรือหากอยากศึกษาเพิ่มเติมสามารถศึกษาได้ที่ นี่ ครับ)

แล้ว Simple Linear Regression คืออะไร

Linear Regression คือ การหาสมการเชิงเส้นเพื่ออธิบายข้อมูล ยกตัวอย่างเช่น เรามีข้อมูลราคาการเช่าหอแต่ละเดือนในกรุงเทพเมื่อเทียบกับพื้นที่ห้องดังนี้


พื้นที่ (m2)
ค่าเช่าหอต่อเดือน (บาท)
22.5
2100
24
2800
26
3250
26.5
3600
30
3800
32
4300
34.5
4600
36.5
5000
38
5800
42
7000



หากเรานำข้อมูลมาวาดเป็นกราฟจะได้ข้อมูลดังนี้ครับ



แล้วถ้าเราอยากจะรู้ว่าถ้าหอในกรุงเทพที่มีขนาดห้อง 40 ตารางเมตรจะมีราคาประมาณเท่าไร เราสามารถคาดคะเนได้โดยการเอาเส้นแนวโน้มมาวาดบนกราฟดังนี้ครับ

หลังจากเราวาดเส้นลงเราก็สามารถคาดคะเนได้ว่าถ้ามีขนาดห้อง 40 ตารางเมตร จะมีราคาประมาณ 6000 กว่าบาท


จะเห็นว่าที่เราวาดเส้นแนวโน้มของข้อมูลนั้นเราจะเรียกว่าเป็น Simple Linear Regression 



แล้วเราจะนำ Machine learning มาใช้งานร่วมกับ Simple Linear Regression อย่างไร

เราจะเอา Machine learning มาใช้ร่วมกับ Simple Linear Regression โดยให้ Machine learning มาทำการหาเส้นแนวโน้มในกราฟดังกล่าว แล้วนำไปใช้งานดังนี้


จากรูปด้านบนจะมีลำดับการนำไปใช้งานคือ
นำข้อมูลที่ต้องการประมวลผล (feature) มาเข้า Model แล้วทำนายออกมาว่าผล (Label) ที่ได้เป็นอย่างไร
ถ้าให้เปรียบเทียบการนำ ML ไปใช้ กับการคาดคะเนราคาห้องเช่าจะเป็นดังนี้
  • Feature คือข้อมูลที่ต้องการไปประมวลผล ในที่นี้จะหมายถึง ขนาดห้อง
  • Model คือสมการหนึ่งที่สามารถใช้ในการคาดคะเนว่าผลที่ได้จะเป็นอย่างไร ในที่นี้จะหมายถึง เส้นแนวโน้ม หรือสมการเส้นตรงของเส้นแนวโน้มนั่นเอง
  • Label คือผลที่ต้องการทำนาย ในที่นี้จะหมายถึงราคาห้อง

ซึ่งในการหา Model นั้นเราจะใช้ Machine Learning มาหาครับโดยมีหลักการทำงานที่จะได้ Model มาเป็นดังนี้


  • จากรูปหลักการทำงานด้านบนเราจะนำข้อมูลที่เรามีอยู่แล้ว(Feature)และรู้ผลัพธ์อยู่แล้ว(Label)ให้ Machine learning ทำการเรียนรู้
  • โดยในการเรียนรู้นั้นตอนแรก ML จะสร้าง Model ขึ้นมาก่อนซึ่ง Model ดังกล่าวยังไม่สามารถทำนายข้อมูลได้ถูกต้อง
  • จึงต้องเข้าสู่กระบวนการ Train ข้อมูลเพื่อทำการปรับ Model ให้ถูกต้องมากที่สุดโดยกระบวนการ Train จะทำงานโดยการนำ Model มาทำนายผลจากข้อมูล(Feature)
  • ซึ่งก็จะมีทั้งการทำนายที่คลาดเคลื่อนกับความเป็นจริงไปมาก หรือใกล้ความเป็นจริง (ในการดูข้อมูลว่าผลทำนายที่ได้คลาดเคลื่อนไปมากหรือใกล้ความเป็นจริงเราใช้ Cost Function ในการดู)
  • ก็นำเอาค่าความเคลื่อนที่ได้ ไปปรับ Model เข้าหาผลลัพธ์ที่ถูกต้อง
  • หลังจากนั้นจะทำการ Train ไปเรื่อยๆและปรับค่า Model ไปเรื่อยๆ
  • จนใกล้เคียงข้อมูลจริงมากที่สุด


เพื่อให้เข้าใจได้มากขึ้นหากลองการทำงานของ ML มาใช้ในการหากราฟแนวโน้มเชิงเส้นสำหรับเปรียบเทียบข้อมูลราคาเช่าห้องกับขนาดห้องสามารถทำได้ดังนี้ครับ


  • นำข้อมูลที่เรามีอยู่แล้ว(Feature ในที่นี้ของเราคือขนาดห้อง)และรู้ผลัพธ์อยู่แล้ว(Label ในที่นี้ของเราคือ ราคาห้อง)ให้ Machine learning ทำการเรียนรู้ ซึ่งจะได้เป็นกราฟด้านล่าง

  • โดยในการเรียนรู้นั้นตอนแรก ML จะสร้าง Model(ในที่นี้คือเส้นแนวโน้ม) ขึ้นมาก่อนซึ่ง Model ดังกล่าวยังไม่สามารถทำนายข้อมูลได้ถูกต้อง (ในที่นี้คือเส้นแนวโน้มที่ได้ไม่สอกคล้องกับข้อมูล) ซึ่งอาจจะได้เป็นกราฟด้านล่าง

  • จึงต้องเข้าสู่กระบวนการ Train ข้อมูลเพื่อทำการปรับ Model (ในที่นี้คือเส้นแนวโน้ม) ให้ถูกต้องมากที่สุดโดยกระบวนการ Train จะทำงานโดยการนำ Model มาทำนายผลจากข้อมูล(Feature)(จากรูปด้านล่างจะเห็นว่าเราต้องการทำนายราคาห้องที่มีพื้นที่ขนาด 43 ตารางเมตร ผลที่ได้ปรากฎว่า Model ทำนายราคาได้ประมาณเกือบ 3000 บาท)

  • ซึ่งก็จะมีทั้งการทำนายที่คลาดเคลื่อนกับความเป็นจริงไปมาก หรือใกล้ความเป็นจริง (ในการดูข้อมูลว่าผลทำนายที่ได้คลาดเคลื่อนไปมากหรือใกล้ความเป็นจริงเราใช้ Cost Function ในการดู)(จากรูปด้านล่างจะเห็นว่าเราต้องการทำนายราคาห้องที่มีพื้นที่ขนาด 43 ตารางเมตร ผลที่ได้ปรากฎว่า Model ทำนายราคาได้ประมาณเกือบ 3000 บาทแต่ราคาจริงอยู่ที่ 7000 บาทซึ่งมีความคลาดเคลื่อนกับความเป็นจริงมาก)

  • ก็นำเอาค่าความเคลื่อนที่ได้ ไปปรับ Model เข้าหาผลลัพธ์ที่ถูกต้อง

  • หลังจากนั้นจะทำการ Train ไปเรื่อยๆและปรับค่า Model ไปเรื่อยๆ

  • จนใกล้เคียงข้อมูลจริงมากที่สุด


สุดท้ายนี้หวังว่าโพสน์นี้จะมีประโยชน์สำหรับแนวทางในการเริ่มต้นศึกษา Machine learning ครับ






References






วันเสาร์ที่ 14 กันยายน พ.ศ. 2562

ระบบแนะนำ (Recommender Systems) โดยใช้ Cosine similarity


" ระบบแนะนำ(Recommender Systems) คืออะไร ? " 
ระบบแนะนำ (Recommender Systems) คือระบบที่ใช้แนะนำ บริการสินค้า 
ยกตัวอย่างเช่น เราดูหนังใน Netflix เดือนนึงหลายเรื่อง ซึ่งหนังที่เราดูส่วนมากคือหนัง Action และทุกครั้งที่เข้าไปในเว็บ Netflix สิ่งที่ทางเว็บแนะนำหนังกับเรา ส่วนมากก็เป็นแนว Action สะด้วย ซึ่งเว็บไซต์จะรู้เองว่าเราชอบหนังแนว Action แล้วแนะนำหนังมาให้เรา 
จากตัวอย่างแสดงว่าเว็บไซต์ Netflix มีระบบแนะนำ(Recommender System)
 " แล้วระบบรู้ได้ไงว่าต้องแนะนำอะไร ? "  
ระบบแนะนำส่วนมากจะแบ่งเป็น 2 แบบคือ “Content-Base” และ “Collaborative Filtering (CF)”
    • Collaborative Filtering (CF) คือ การหาความเหมือนกันของกลุ่มคนที มีความชอบหรือไม่ชอบหนังชนิดเดียวกัน ยกตัวอย่างเช่น
      นาย ก ชอบ Spider man, Superman ,Iron man
      นาย ข ชอบ Spider man, Superman
      จะเห็นว่า นาย ก กับนาย ข ชอบดูหนังคล้ายๆกัน เราจึงขอสรุปว่า หาก นาย ก ชอบดู Iron man นาย ข อาจจะชอบด้วยเช่นกันเราจึงแนะนำหนัง Iron man ให้นาย ข
    • Content-Base คือ การหาความเหมือนของสินค้า ยกตัวอย่างเช่น
      นาย ก ชอบ Spider man, Superman , Iron man
      จะเห็นว่า นาย ก ชอบหนังที่มีเนื้อหาเป็น แนวฮีโร่ แสดงว่า นาย ก อาจจะชอบดูหนังเรื่อง Ant man ด้วยเช่นกันเนื่องจาก Ant man เป็นหนังแนวฮีโร่เหมือนกัน

Collaborative Filtering (CF) ในโพสน์นี้เราจะพูดถึงระบบ Recommender System ในแบบ Collaborative Filtering (CF) กันเนื่องจากง่ายต่อการเข้าใจและใช้กันอย่างหลากหลาย โดยโพสน์นี้เราจะใช้สมการที่ชื่อว่า cosine similarity ในการคำนวณความเหมือนกัน

การคำนวณ Cosine similarity Cosine similarity คือการหาความเหมือนกันของข้อมูลซึ่งสูตรจะเป็นดังนี้

จากสมการดังรูปค่า cosine ที่ได้จะมีค่าอยู่ระหว่าง 0 ถึง 1 โดยค่า
1 จะหมายถึงข้อมูล A และข้อมูล B มีความเหมือนกัน
ส่วนค่า 0 จะหมายถึงข้อมูล A และข้อมูล B ไม่มีความเหมือนกันเลย
(สามารถทำความเข้าใจเพิ่มเติมได้ที่ http://9golfy.com/2016/12/12/คำนวณลักษณะนิสัยใจตรงก-2/)

หลักการทำงานของ ระบบแนะนำ (Recommender System) เพื่อให้เห็นภาพมากขึ้นจึงได้ยกตัวอย่างการทำงานของ ระบบแนะนำหนัง โดยสมมุติเก็บข้อมูลดังนี้

จากตารางจะมีการเก็บการให้คะแนนความชอบของหนังแต่ละคน ซึ่งค่าของคะแนนนั้นมีตั้งแต่ 1 – 5 (ค่า 0 หมายถึงคนนั้นยังไม่เคยดูหนังเรื่องนี้มาก่อน) ทำการปรับโครงสร้างตารางเป็นดังนี้
หลังจากปรับโครงสร้างตารางแล้วต่อไปเราจะหาความเหมือนกัน โดยการคำนวณ Cosine ของแต่ละคนเช่น ถ้าเราอยากหาความเหมือนกันของ นาย ก กับ นาย ข เราสามารถทำได้โดยใช้สูตร Cosine ดังนี้
สมมุติให้ นาย ก คือ A
สมมุติให้ นาย ข คือ B
จากการคำนวณค่า Cosine Similarity ระหว่าง นาย ก และ นาย ข แสดงให้เห็นว่ามีความเหมือนกันอยู่ 0.682793 หรือ 68.2793 เปอร์เซ็นต์
หลังจากนั้นก็วนหา Cosine ระหว่าง นาย ก กับ นาย ค , นาย ก กับ นาย ง, นาย ข กับ นาย ค, นาย ข กับ นาย ง, นาย ค กับ นาย ง จนครบทุกคนก็จะได้ข้อมูลมาเป็นตารางดังนี้
จากตารางแสดงให้เห็นว่า
นาย ก เหมือนกับ นาย ก เปะ เพราะค่าเป็น 1 หรือเหมือน 100 เปอร์เซ็นต์
นาย ก เหมือนกับ นาย ข ประมาณ 68.2793 เปอร์เซ็นต์
นาย ก เหมือนกับ นาย ค ประมาณ 42.4264 เปอร์เซ็นต์
นาย ก เหมือนกับ นาย ง ประมาณ 82.2192 เปอร์เซ็นต์
แสดงให้เห็นว่ารสนิยมในการดูหนังของ นาย ก คล้ายกับ นาย ง มากที่สุด ดังนั้นหาก นาย ง ชอบดูหนังเรื่องใหนก็เป็นไปได้ว่า นาย ก ชอบดูหนังเรื่องนั้นด้วยเช่นกัน

วันเสาร์ที่ 7 กันยายน พ.ศ. 2562

Mail Spam Detection


      สวัสดีครับหลังจากบทความที่ผ่านมาได้อธิบายเรื่องของหลักการทำงาน Naive Bayes Classification (http://cakeknowledgeblogs.blogspot.com/2019/08/naive-bayes-classification-1.html) วันนี้จะนำความรู้ที่ได้ศึกษามาลองสร้างโปรแกรมสำหรับทำการตรวจสอบเมลล์ที่เป็น Spam กันครับ

"แล้วเมลล์ที่เป็น Spam คืออะไร"
เมลล์ที่เป็น spam (Spam mail) คือ เมลล์ที่ไม่พึงประสงค์อย่างหนึ่ง ซึ่งวัตถุประสงค์ที่ส่งอีเมลล์ลักษณะนี้เพื่อเป็น  การก่อกวน, หรือแม่กระทั้งเป็นการโจมตี โดยการแนบไวรัสมาจากเมลล์ ซึ่งอาจทำให้เกิดความเสียหายแก้ข้อมูลต่อคนที่ไปเปิดอีเมลล์

"แล้วเราจะรู้ได้ไงว่า mail นั้นเป็น spam"
ในการหา mail ใหนว่าเป็น Spam เราสามารถหาได้โดยการนำเอาข้อความทั้งหมดในเมลล์ มาทำการตรวจสอบว่าเป็น spam หรือไม่โดยวิธีในการตรวจสอบนั้นเราจะใช้ Naive Bayes Classification มาช่วยนั่นเอง

โดยสมการ Naive Bayes นั้นจะเป็นดังนี้ครับ


สามารถแปลงเป็นสมการสำหรับตรวจสอบ เมลล์ spam ได้ดังนี้


จากสมการจะเห็นว่าจะเป็นการคูณกันระหว่างความน่าจะเป็นซึ่งหากความน่าจะเป็นมีหลายค่าจะทำให้ผลคูณมีค่าใกล้ศูนย์ จนอาจทำให้คอมพิวเตอร์ปัดเศษกลายเป็น 0 ดังนั้นในการป้องกันเหตุการณ์ดังกล่าวเราจึงใส่ Log ไปในสมการ


 จากคุณสมบัติของผลคูณ Log เท่ากับ ผลรวมของ Log คือ LogMN = LogM + LogN เราจึงสามารถแปลงสมการได้ดังนี้

โดยเราจะเอาข้อมูล email จริงๆมาจากบริษัท Enron Corporation มา Train กัน ตามลิงค์นี้ http://www2.aueb.gr/users/ion/data/enron-spam/  ซึ่งเราจะโหลดไฟล์ Enron1,Enron2,...,Enron6 แล้วแตกไฟล์ออกมาเก็บไว้ใน Folder ที่ชื่อว่า Enron ดังนี้ครับ

- ทำการ Download Enron File




 - นำไฟล์ที่โหลดได้มาแตกไฟล์และเก็บลงใน Folder ที่ชื่อว่า Enron



"มาเริ่มเขียนโคดกัน"
เราจะมาเขียนโคดกันด้วยภาษา C# โดยใช้ Naive Bayes Classification มาแยกว่า ข้อความในเมล์ใหนน่าจะเป็น Spam หรือ ไม่เป็น Spam กันครับ ซึ่งสามารถศึกษาและโหลดโคดเต็มได้ที่ https://github.com/CakeNuthep/EmailSpamDetectionWithNaiveBayes

reference