<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: WachirawitPhreuk</title>
    <description>The latest articles on DEV Community by WachirawitPhreuk (@wachirawitphreuk).</description>
    <link>https://dev.to/wachirawitphreuk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1422323%2F9489d7e6-e575-4f48-8774-9a57128bdeb1.png</url>
      <title>DEV Community: WachirawitPhreuk</title>
      <link>https://dev.to/wachirawitphreuk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wachirawitphreuk"/>
    <language>en</language>
    <item>
      <title>ระบบการแยกแยะชนิดของเพลง โดยใช้ Machine Learning</title>
      <dc:creator>WachirawitPhreuk</dc:creator>
      <pubDate>Sun, 14 Apr 2024 17:20:41 +0000</pubDate>
      <link>https://dev.to/wachirawitphreuk/rabbkaaraeykaeyachnidkhngephlng-odyaich-machine-learning-5h3l</link>
      <guid>https://dev.to/wachirawitphreuk/rabbkaaraeykaeyachnidkhngephlng-odyaich-machine-learning-5h3l</guid>
      <description>&lt;p&gt;เพลงในโลกของเรานั้นมีหลากหลายแนวด้วยกัน ไม่ว่าจะเป็นป๊อปที่หลายคนคุ้นหู หรือแนวเพลงร็อคที่เร้าใจและทำให้คุณได้โยกหัว เพลงทุกแนวนั้นเป็นศิลปะ ที่บอกถึงเรื่องราวของตัวเอง และความรู้สึกผ่านตัวโน้ตและจังหวะ&lt;/p&gt;

&lt;p&gt;ในบทความนี้ เราต้องการสร้างโมเดลที่จำแนกประเภทของเพลงต่างๆ ได้โดย ซึ่งเราต้องการรู้ว่าตัวโมเดลจะสามารถจำแนกประเภทตัวอย่างเพลงที่ถูกป้อนเข้าให้ได้ถูกต้องและแม่นยำหรือเปล่า&lt;/p&gt;

&lt;p&gt;โดยทั้งหมดนี้เราจะใช้ Machine Learning กับโค้ดภาษา Python และทำใน Google Colab&lt;/p&gt;

&lt;p&gt;ก่อนอื่น ดาวน์โหลดไฟล์นี้ หรือนำเข้า Google Drive &lt;a href="https://drive.google.com/drive/folders/189jIlfQ-E94eHfKVksbAUSXKX68Ju1GI"&gt;ไฟล์&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนการทำงาน
&lt;/h2&gt;

&lt;p&gt;ขั้นตอนที่ 1: นำเข้า Libraries และ Dataset&lt;br&gt;
Libraries ที่นำเข้านั้นประกอบไปด้วย Pandas สำหรับนำเข้า dataset, Matplotlib และ Seaborn สำหรับการแสดงข้อมูลออกเป็นภาพ, Numpy สำหรับการ scaling และ correlation และ Librosa สำหรับการแสดงข้อมูลเสียงให้เป็นภาพ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns 
import librosa.display
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้นจึงนำเข้าไฟล์ ‘file.csv’ ที่ได้ดาวน์โหลดไว้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;music_data = pd.read_csv('file.csv') 
music_data.head(5)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3i799d2d1plsv65env1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3i799d2d1plsv65env1n.png" alt="Image description" width="800" height="121"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;ขั้นตอนที่ 2: วิเคราะห์ข้อมูลที่นำเข้ามา&lt;/p&gt;

&lt;p&gt;ขั้นตอนนี้เป็นการเช็คว่าข้อมูลที่เราได้มานั้น มีอะไรบ้าง มีลักษณะเป็นอย่างไร&lt;/p&gt;

&lt;p&gt;เช่นหาว่าแต่ละ label มีกี่อัน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;music_data['label'].value_counts()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frv6ytys4g7nq7dh47btl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frv6ytys4g7nq7dh47btl.png" alt="Image description" width="202" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;จาก Output พบว่าเราได้มีการใส่เพลงในแต่ละประเภททั้งหมด 100 อัน&lt;/p&gt;

&lt;p&gt;หรือวิเคราะห์เพลงในไฟล์ว่ามีรูปแบบอย่างไร ในตัวอย่างนี้เราจะให้วิเคราะห์หมวดหมู่ Disco โดยใช้ไฟล์เสียง disco.00001.wav&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;path = 'drive/MyDrive/genres_original/disco/disco.00001.wav'
plt.figure(figsize=(14, 5)) 
x, sr = librosa.load(path) 
librosa.display.waveshow(x, sr=sr) 

print("Disco")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fws6suv9emi1wcvrkmz3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fws6suv9emi1wcvrkmz3w.png" alt="Image description" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;วิเคราะห์เพลงหมวดหมู่ Jazz โดยใช้ไฟล์เสียง jazz.00001.wav&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;path = 'drive/MyDrive/genres_original/jazz/jazz.00001.wav'
plt.figure(figsize=(14, 5)) 
x, sr = librosa.load(path) 
librosa.display.waveshow(x, sr=sr) 

print("Jazz")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxpxbegl5w8vwaux9kyzg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxpxbegl5w8vwaux9kyzg.png" alt="Image description" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;ขั้นตอนที่ 3: ประมวลผลข้อมูล&lt;/p&gt;

&lt;p&gt;เพื่อให้การทำงานของตัวโมเดลแยกแนวเพลงนั้นทำงานได้ เราจำเป็นต้องแปลงข้อมูล labels ให้เป็น integer โดยใช้ LabelEncoder()&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from sklearn import preprocessing 
label_encoder = preprocessing.LabelEncoder() 
music_data['label'] = label_encoder.fit_transform(music_data['label'])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เพื่อความถูกต้อง และเพื่อให้ตัวโมเดลทำงานได้เร็ว ไม่ช้าเกินไปเพราะขนาดของข้อมูล เราจึง drop คอลัมน์ filename ออก และปรับขนาดข้อมูล&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;X = music_data.drop(['label','filename'],axis=1) 
y = music_data['label']
cols = X.columns 
minmax = preprocessing.MinMaxScaler() 
np_scaled = minmax.fit_transform(X) 

# new data frame with the new scaled data. 
X = pd.DataFrame(np_scaled, columns = cols)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;ขั้นตอนที่ 4: ฝึกโมเดล&lt;/p&gt;

&lt;p&gt;เริ่มด้วยการแยกตัวโมเดลด้วย train_test_split&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from sklearn.model_selection import train_test_split 

X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.3, 
                                                    random_state=111) 
X_train.shape, X_test.shape, y_train.shape, y_test.shape
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เมื่อทำการแยกตัวโมเดลเรียบร้อย เราต้องการที่จะทดสอบตัวจำแนกประเภทด้วย 5 โมเดลนี้ประกอบไปด้วย KNeighborsClassifier, Decision Tree Classifier, Random Forest, Logistics Regression, Cat Boost, Gradient Boost&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from sklearn.metrics import accuracy_score 
from sklearn.neighbors import KNeighborsClassifier 
from sklearn.tree import DecisionTreeClassifier 
from sklearn.ensemble import RandomForestClassifier 
from sklearn.linear_model import LogisticRegression 
import catboost as cb 
from xgboost import XGBClassifier 

rf = RandomForestClassifier(n_estimators=1000, max_depth=10, random_state=0) 
cbc = cb.CatBoostClassifier(verbose=0, eval_metric='Accuracy', loss_function='MultiClass') 
xgb = XGBClassifier(n_estimators=1000, learning_rate=0.05) 

for clf in (rf, cbc, xgb): 
    clf.fit(X_train, y_train) 
    preds = clf.predict(X_test) 
    print(clf.__class__.__name__,accuracy_score(y_test, preds))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;ขั้นตอนที่ 5: Neural Network&lt;/p&gt;

&lt;p&gt;ในขั้นตอนนี้จะเป็นการประเมินตัว Dataset ด้วย Neural Network, Neural Network คือโมเดลที่วิเคราะห์แพทเทิร์นของข้อมูลและการเลือกทางเลือกใน Machine learning ซึ่งเหมาะมากในการประเมินความถูกต้องของการจำแนก&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import tensorflow.keras as keras 
from tensorflow.keras import Sequential 
from tensorflow.keras.layers import *

model = Sequential() 

model.add(Flatten(input_shape=(58,))) 
model.add(Dense(256, activation='relu')) 
model.add(BatchNormalization()) 
model.add(Dense(128, activation='relu')) 
model.add(Dropout(0.3)) 
model.add(Dense(10, activation='softmax')) 
model.summary()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxv3befpk9mtjfhussev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxv3befpk9mtjfhussev.png" alt="Image description" width="533" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;จากนั้นจึงนำรวบรวมโมเดล โดยใส่ epochs หรือจำนวนข้อมูลที่ใช้ในการเทรน ซึ่งในบทความนี้ใช้ 100 เราจึงใส่ไป 100&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# compile the model 
adam = keras.optimizers.Adam(lr=1e-4) 
model.compile(optimizer=adam, 
            loss="sparse_categorical_crossentropy", 
            metrics=["accuracy"]) 

hist = model.fit(X_train, y_train, 
                validation_data = (X_test,y_test), 
                epochs = 100, 
                batch_size = 32)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;ขั้นตอนที่ 6: ประเมินผล&lt;/p&gt;

&lt;p&gt;ขั้นตอนนี้จะเป็นการประเมินว่าโมเดลนี้มีความถูกต้องเท่าไร โดยเริ่มจากการรันโค้ดนี้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test_error, test_accuracy = model.evaluate(X_test, y_test, verbose=1) 
print(f"Test accuracy: {test_accuracy}")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output ของโมเดลที่ใช้ epochs ทั้งหมด 100&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fha5bystutmehzvf56e5b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fha5bystutmehzvf56e5b.png" alt="Image description" width="684" height="44"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;แล้วนำมาพล็อตกราฟ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fig, axs = plt.subplots(2,figsize=(10,10)) 

# accuracy 
axs[0].plot(hist.history["accuracy"], label="train") 
axs[0].plot(hist.history["val_accuracy"], label="test")  
axs[0].set_ylabel("Accuracy") 
axs[0].legend() 
axs[0].set_title("Accuracy") 

# Error 
axs[1].plot(hist.history["loss"], label="train") 
axs[1].plot(hist.history["val_loss"], label="test")  
axs[1].set_ylabel("Error") 
axs[1].legend() 
axs[1].set_title("Error") 

plt.show()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9yny07xgghyyegagynu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9yny07xgghyyegagynu.png" alt="Image description" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr90s38fkdexipwodru5m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr90s38fkdexipwodru5m.png" alt="Image description" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;จากการทดสอบนี้ ทำให้เราสงสัยว่า ถ้าหากเรากำหนดให้จำนวนข้อมูลที่ใช้ลดลงจาก 100 เหลือเพียง 10 เท่านั้น ตัวข้อมูลนั้นจะมีความแม่นยำขนาดไหน&lt;/p&gt;

&lt;p&gt;Output เมื่อ epochs เท่ากับ 10&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7f16clqli9lv9cfbrq8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7f16clqli9lv9cfbrq8n.png" alt="Image description" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfv0gqlvon151ojr66w3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfv0gqlvon151ojr66w3.png" alt="Image description" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ซึ่งจากกราฟที่ได้มานั้น ไม่แม่นยำเท่าการใช้ข้อมูลที่มากเท่า 100&lt;/p&gt;

&lt;h2&gt;
  
  
  สรุป
&lt;/h2&gt;

&lt;p&gt;โมเดลการจำแนกเพลงให้อยู่ในแต่ละประเภทนี้ จะมีประสิทธิภาพมากยิ่งขึ้นเมื่อมีข้อมูลเพลงที่มาก และใช้ Ensemble Learning และ Neural nets ในการสร้างโมเดล&lt;/p&gt;

&lt;p&gt;จากตัวอย่างนี้ ทำให้เราพอเห็นไกด์ไลน์ในการทำโมเดลแยกประเภทได้บ้าง โดยเมื่อยิ่งมีจำนวนเพลงมากเท่าไร ความแม่นยำของข้อมูลก็จะมากขึ้นเท่านั้น ซึ่งสามารถใช้ได้กับการเทรนโมเดลตัวอื่นๆ ที่ไม่ใช่การจำแนกประเภทได้อีกด้วย&lt;/p&gt;




&lt;p&gt;References:&lt;br&gt;
&lt;a href="https://www.geeksforgeeks.org/music-genre-classifier-using-machine-learning/"&gt;https://www.geeksforgeeks.org/music-genre-classifier-using-machine-learning/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://drive.google.com/drive/folders/189jIlfQ-E94eHfKVksbAUSXKX68Ju1GI"&gt;https://drive.google.com/drive/folders/189jIlfQ-E94eHfKVksbAUSXKX68Ju1GI&lt;/a&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>python</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
