เปิดเพลงเพราะ เหมาะกับโอกาส ด้วยการใช้ Machine Learning และ Classification Model

cho choky
botnoi-classroom
Published in
5 min readSep 1, 2020

ผลงานการศึกษาหัวข้อนี้ เป็นผลงานของนักเรียน G2 ใน Class เรียนของ Botnoi : Data Science Essential Botnoi

Project นี้ นับเป็น Project ที่ 2 แล้ว ซึ่ง โจทย์ครั้งนี้เกี่ยวกับการใช้ Machine Learning มา Predict ผลต่างๆที่ต้องการ ส่วนจุดประสงค์สำคัญสำหรับ Project นี้ จะเป็นการให้นักเรียนได้ เรียนรู้เกี่ยวกับ Pipeline หรือขั้นตอนการทำ Machine Learning และ สร้าง Classification Model นั่นเอง เบื้องต้น ขออธิบาย ขั้นตอน หรือ Pipeline ที่ว่าดังนี้

PIPELINE ของการสร้าง Machine Learning และ Classification Model

  1. GET DATA
  2. CLEAN DATA
  3. TRAIN AND TEST SPLIT
  4. EXTRACT FEATURE
  5. TRAIN MODEL
  6. EVALUATION

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

สำหรับใครที่สนใจ เข้าไปดูในส่วนของ Code ก็ตามไปดูได้จาก Colab ลิงค์ ด้านล่างนี้

https://colab.research.google.com/drive/1XAmwDmEP7dV6N1My6VoJzSL-EMfGrset

BUSINESS PART

ทำไมถึงเลือกทำหัวข้อนี้ ตอนแรกช่วงระดมสมองนี่มีหลาย IDEA ที่ผุดมาในการประชุมเลยหล่ะ แต่เมื่อคำนึงถึง ระยะเวลา และ จุดประสงค์หลักของ Project แล้ว ทั้งกลุ่ม ก็เริ่มมองเรื่องที่ใกล้ตัวที่สุดออกมา นั่นคือพวกเรา พบ Pain Point ที่ตรงกันที่เจอในการฟังเพลง ใน งานหรือ โอกาสต่างๆ ไม่ว่าจะเป็น Party วันเกิด เพลงที่เปิดในร้านกาแฟ งานแต่งเพื่อน แม้กระทั่งเพลงที่ดังในลิฟท์ เรารู้สึกว่า บางเพลงซ้ำ บางเพลงไม่เหมาะกับโอกาส มันคงจะดีถ้าหาก สิ่งที่เราทำสามารถแก้ปัญหานี้ได้ นั่นทำให้เราคิด USE CASE ของโปรเจ็คนี้ขึ้นมาได้ดังนี้

USE CASE

เพลงเยอะ มากมาย แต่ไปที่ไหน ทำไมเจอแต่เพลงซ้ำ ๆ เปิดวนไปมาทำเอาชีวิตติด loop วันนี้เราขอเสนอตัวช่วยที่ทำให้ playlist ของคุณ ไม่จำเจ อีกต่อไป เพียงใส่ ชื่อเพลง API จะจัดการทำนายให้ ว่า เพลงที่คุณเลือกมา เหมาะกับ โอกาสใด

การหา DATA

จากโจทย์ เราจึงเริ่มค้นหา Dataset ที่มีอยู่แล้ว ซึ่งหาได้จาก Kaggle : Spotify Tracks DB แต่ใน Dataset ชุดนี้มีแต่เพลงสากล เราจึงเริ่มมองหาวิธี Scrape ข้อมูลจาก Spotify ต้นกำเนิดของข้อมูลเรานั่นเอง แต่ว่าคราวนี้เราลองสร้าง MODEL จากข้อมูลทั้ง 2 แบบ เพื่อทำ Machine Learning และ Classification Model

ก่อนจะเข้าสู่การเขียนโค้ด ขออธิบายลักษณะของ Dataset ที่เราได้มาอีกซักเล็กน้อย ในฝั่งของการ Scrape กว่าเราจะได้ข้อมูลจาก Spotify มาโดยตรง เราต้องมี Credential ที่จะ access Web API ของ Spotify ก่อน ที่สำคัญคืออย่าลืม import libraries และ font ที่จะใช้งานมาด้วยนะ ลองนึกสภาพว่าจะสร้าง Model เพลงไทย แต่เว็บอ่านเพลงไทยไม่ได้ แล้วผู้พัฒนาจะใช้งานอย่างไรล่ะ?

หลังจากที่เราใส่ข้อมูล Credentials รวมถึง import ทุกอย่างที่ต้องการแล้ว เราก็เริ่มลองดึง playlist และเพลงจาก keyword, category และ audio feature เดี๋ยวก่อน อย่าพึ่งเริ่มงงว่าแต่ละอันคืออะไร เราขอเริ่มอธิบายจาก category ก่อนนะ พูดให้เข้าใจง่าย ๆ มันก็คือ theme หรือ ลักษณะของเพลง เช่น เพลงป็อป ฟังสบาย นอนหลับ ปาร์ตี้ ออกกำลังกาย โรแมนติก เพลงไทย เป็นต้น ทุกคนสามารถหาเพลงของชาติอื่น ๆ ได้เช่นกัน เพียงแค่ระบุประเทศที่ต้องการไว้ใน Code ได้เลย หรือจะลองหาเพลงยุค 60 ก็ได้นะ

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

แต่ ๆ ๆ หลายคนอาจจะสงสัยว่าเรารู้ playlist แล้วยังไงต่อ จากภาพข้างบนทุกท่านจะเห็น id ของ playlist ที่เกี่ยวข้องกับ keyword คำว่า งานบวช เราก็ลองแสดงเพลงที่อยู่ใน playlist id นั้น ๆ ดู หรือจะใช้ keyword หารายชื่อเพลง โดยไม่ต้องสน playlist ก็ได้เช่นกัน

คราวนี้ขอเกริ่นอย่างสุดท้ายในเรื่องของ audio feature เรื่องนี้ต้องบอกว่าใครมาจากสายดนตรีจ๋า ๆ อาจจะคุ้นหูหรือเข้าใจบ้าง เชื่อเถอะว่าจะอินง่ายขึ้น แต่ถ้าใครไม่ได้มาจากสายดนตรี ขอบอกว่าไม่เป็นไร คนในกลุ่มเราก็ไม่ได้มาทางสายนี้เหมือนกัน แต่เรามี Google & Google Translate ที่จะมาช่วยเราแปลคำศัพท์ให้เข้าใจกิมมิคคร่าว ๆ ของ audio feature เพิ่มขึ้นได้ ซึ่ง audio feature นี่แหละคือตัวแปรสำคัญใน Model ของเรา และเนื่องจากเป็นตัวแปรสำคัญ เราก็ขออุบไว้บอกในขั้นตอน extract feature แทน 555 อดใจรอนิดนึงนะค้าบบ

การ CLEAN DATA

จากภาพตัวอย่างการรัน Code ที่ผ่านมาทั้งหมด เราจะเห็นว่ามี column ที่ไม่เข้าใจ ไม่รู้จะทำอะไรกับมันเต็มไปหมด ทั้ง url id หรือแม้แต่ข้อความที่อยู่ในรูป json format (รูปแบบคล้าย ๆ dictionary ใน Python) เราจึง drop column ที่ไม่ใช้ทิ้งไป แล้วใช้ one-hot encoding เปลี่ยน column string ที่เหลืออยู่ ให้กลายเป็น dummy เพื่อนำไปสร้าง feature ต่อได้ง่าย

ในกรณีของกลุ่มเรา เราสนใจเพลงที่จะไปเปิดในงานแต่ง งานบวช และผับ เราจึงนำเพลงของทั้ง 3 keywords นี้ มารวมกันใน data ชุดเดียวเพื่อนำไปวิเคราะห์ต่อ

การ EXTRACT FEATURE

ลืมกันหรือยังว่าเราสัญญาอะไรไว้ จะเฉลยล่ะนะ 3…2…1… เรามาถึงขั้นตอน Extract Feature กันแล้ว ก็ต้องพูดถึง Audio Feature กันนั่นเอง บอกก่อนว่าส่วนนี้ยาว ใครรู้อยู่แล้วก็ข้ามได้ สำหรับ feature ที่เราจะนำมา train model ประกอบด้วย

Label: ชื่อโอกาสที่จะเปิดเพลง เช่น งานแต่ง งานบวช ผับ

Artists: ชื่อศิลปิน

Duration_ms: ระยะเวลาของเพลง หน่วยเป็น milliseconds

Name: ชื่อเพลง

Popularity: ความนิยม

Danceability: ความเหมาะสมแก่การเต้น ถ้าเป็น 1.0 แปลว่าเหมาะสมแก่การเต้นมากที่สุด

Energy: ค่าที่แสดงถึงความเข้มข้ม การกระทำ โดยส่วนใหญ่แล้วเพลงที่มี energy จะเป็นเพลงที่เร็ว เสียงดัง หรืออาจจะถึงขั้นหนวกหูเลยทีเดียว

Loudness: ความดัง (//ดังไว้ก่อน คอนดักเตอร์ไม่ได้สอนไว้)

Speechiness: เป็นการตรวจจับ Speech หรือคำพูดในเพลง เพราะใน record นั้นอาจจะเป็น talk show หรือ audio book ก็ได้ แต่ถ้าเป็น rap ค่าที่ได้ก็มีแนวโน้มที่จะอยู่ระหว่าง 0.33 ถึง 0.66

Acousticness: ความเชื่อมั่นว่าเพลงนี้เป็นเพลง acoustic ถ้ามีค่าเป็น 1.0 แปลว่ามีความเชื่อมั่นสูงว่าเพลงนี้ต้องเป็นเพลง acoustic แน่เลย

Instrumentalness: ถ้าเชื่อมั่นมาก ๆ ว่าเพลงนี้ไม่มีเสียงร้อง (vocal) เลยก็จะได้ 1.0 ไปครอง

Liveness: อันนี้ชื่อบอกชัดเจนว่า Live ดังนั้นมันจึงเป็นค่าที่บ่งบอกว่าเพลงที่เราฟัง ใช่เพลงที่ให้ฟังสด ๆ หรือไม่ เป็นเพลงที่มาจากการ live หรือเปล่า

Valence: ค่าที่แสดงถึงอารมณ์ของเพลง ถ้าค่ามีแนวโน้มไปทาง 1.0 อาจเป็นเพลงที่ฟังแล้วให้ความรู้สึกมีความสุข ปลื้มปริ่ม ร่าเริง ในทางกลับกัน หากค่อนไปทาง 0.0 ก็อาจเป็นเพลงที่หดหู่ เศร้าสร้อย

Tempo: จังหวะโดยเฉลี่ยต่อนาที

Key_0 (จนถึง Key_11): ในทางดนตรี เพลงแต่ละเพลงจะมี key อยู่ เช่น เพลง Canon in C จะหมายความว่าเป็นเพลงชื่อ Canon ที่เล่นใน key C หรือเพลง Canon in D ก็คือเพลง Canon ที่เล่นใน key D

Time_signature_3 (และมี Time_signature_4): เป็นการให้จังหวะในแต่ละห้องของเพลง อย่างเช่น เพลง Happy Birthday จะมีจังหวะเป็น 3 / 4 (Time_signature_3) ส่วนเพลงชาติ จะมีจังหวะเป็น 4 / 4 (Time_signature_4)

Mode_0 (และมี Mode_1): แบ่งเป็น Major กับ Minor โดยส่วนใหญ่แล้ว Major จะให้อารมณ์สดใส ร่าเริง ส่วน Minor จะให้อารมณ์เหมือนเพลง Blues

การ TRAIN MODEL

เราแบ่ง Dataset 324 แถว ออกเป็น Dataset สำหรับ Train Model 259 แถว และสำหรับ Test Model 65 แถว จากนั้นจึง extract feature ออกมาเป็น feature กับ label โดยที่ตัดชื่อเพลงกับชื่อศิลปินใน feature ทิ้งไป ส่วน label ให้เหลือแค่ column label ซึ่งมีไว้ให้ model ทำนายว่า feature ต่าง ๆ ของเพลงนี้ จะตรงกับการเปิดเพลงเนื่องในโอกาสใดมากที่สุด

เราใช้ Machine Learning Model: GradientBoostingClassifier ในการสร้าง model แล้วค่าความแม่นยำที่ได้ก็คือ… (ไหนใครทายถูกทั้ง 6 หลักมารับรางวัลได้เลย)

การ EVALUATION

ค่าความแม่นยำที่เราได้จาก Model นี้ก็คือ 0.734375 แต่อันนี้เป็นค่าโดยรวม เราลองมาดู report โดยละเอียดกันหน่อยดีกว่า

Accuracy Report
Top Feature Score

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

Lowest Feature Score

ในส่วนของ feature ที่ให้น้ำหนักความสำคัญน้อย อาจเป็นเพราะไม่ว่าเพลงจะอยู่ใน key ใด จังหวะ ¾ หรือ 4/4 ต่างก็ไม่ส่งผลต่อโอกาสทั้งสิ้น ณ จุดนี้นักแต่งเพลงมือใหม่อาจโล่งใจ ไม่โดน key หรือ time signature บังคับแล้ว

มาถึงจุดนี้อาจมีคนตะโกนว่า model อะไรเนี่ย ทำไมมันใช้ยากจัง ต้องรู้ Audio Feature ของเพลงที่เป็น target เราก่อนหรือไง ขอบอกเลยว่า ไม่!!! เรามีวิธีง่ายกว่านั้น มาต่อที่ขั้นตอนสุดท้ายกันเลย

การ DEPLOY API

มารู้จักกับ HEROKU ฮีโร่ของเรากันก่อน มันคือ บริการแบบ Platform as a Service (Paas) ซึ่งมีทั้ง แบบ Free และ เสียเงิน สามารถรองรับภาษา PYTHON ที่เราใช้ในการเขียน API ได้ จึง เหมาะอย่างยิ่งสำหรับการ Deploy Project ของเรา ให้ user สามารถใช้ API ของเราได้

สำหรับการทำงานของ api เนื่องจาก model ของเรารับ input ที่เป็น audio feature ซึ่งมีหลาย feature ไม่ว่าจะเป็น danceability, energy, loudness, speechiness, acousticness เป็นต้น คงไม่สะดวกถ้าหากผู้ใช้ต้องระบุ audio feature แต่ละตัวของเพลงที่ต้องการนำมาจัด playlist เพื่อที่จะใช้งาน api เราจึงอำนวยความสะดวกในส่วนนี้ โดยผู้ใช้งานระบุเพียงแค่ชื่อเพลงที่ต้องการ หรือจะระบุชื่อเพลงพร้อมชื่อศิลปินมาด้วยก็ได้ เราจะนำชื่อเพลงมาไปเป็น keyword ในการ search หาเพลงนั้น โดยใช้ไลบรารี่ spotipy ซึงเป็น api ของ spotify สามารถดูเพิ่มเติมได้ที่

https://developer.spotify.com/documentation/web-api/reference/search/search/

และ https://spotipy.readthedocs.io/en/2.13.0/#spotipy.client.Spotify.search

จากผลการ search เรา assume ว่าผลลัพธ์อันแรกคือเพลงที่ผู้ใช้ต้องการ จากนั้นนำ id ของเพลงไปดึง audio feature ต่าง ๆ ของเพลงนั้นออกมา แล้วแปลงเป็น feature ที่พร้อมสำหรับเข้าโมเดล

ส่วนวิธีการ deploy api ตามบทความข้างล่างนี้เลย

https://medium.com/botnoi-classroom/%E0%B8%95%E0%B8%B1%E0%B8%A7%E0%B8%AD%E0%B8%A2%E0%B9%88%E0%B8%B2%E0%B8%87%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87-host-ai-api-%E0%B8%9A%E0%B8%99-heroku-%E0%B9%81%E0%B8%A5%E0%B8%B0-botnoi-openapi-8cf3b875a56

สามารถไปลองเล่นกันได้ที่ https://playlist-classification.herokuapp.com/classify?song=ชื่อเพลง

Extension JSON: https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa

สรุปผล และก้าวต่อไปในอนาคต

แม้ในด้านความแม่นยำของ Model เราจะยังทำนายได้ไม่แม่นนักว่า เพลงเหมาะกับ โอกาสไหน แต่สิ่งที่เรามองว่าอาจต่อยอดไปได้ คือ การที่เราสามารถ สร้าง PLAYLIST ของเพลง โดย ดึงจาก Feature ต่างๆ ไม่ว่าจะเป็น อายุ เพศ ศิลปินที่ชอบ ของคนที่ Register ร่วมงาน PARTY หรือ งานแต่ง โดยน่าจะเหมาะกับ ธุรกิจ Organizer ต่างๆ ทั้งยังอาจถูกนำไปใช้ กับ Platform ดังๆ อย่าง Spotify JOOX ในการใช้ร่วมกับ GadGet ที่จะหา เพลงที่เหมาะกับกิจกรรม ที่กำลังทำอยู่ ยกตัวอย่างเช่น Heart Rate ที่วัดได้จาก FitBit ของคุณสูง AI ก็ จะเลือกเพลงที่ Tempo เหมาะกับ Heart Rate ของคุณ แต่ถ้าคุณกำลังจะเข้านอน AI ก็จะหาเพลงคลืน DELTA ที่เหมาะกับการเข้านอนให้คุณ เป็นต้น

--

--