การวัดประสิทธิภาพ (Evaluation Metrics) สำหรับโมเดล Deep Learning

การวัดประสิทธิภาพ (Evaluation Metrics) ใช้สำหรับวัดประสิทธิภาพของโมเดล Deep Learning ว่าทำงานได้ดีแค่ไหนตามเกณฑ์ที่กำหนดไว้ โดยจะมีหลายๆ ตัวบอกค่าประสิทธิภาพของโมเดลที่แตกต่างกันไปตามประเภทของงานหรือโมเดลที่ใช้ เช่น การจำแนกประเภท (Classification), การทำนาย (Prediction), การประมวลผลภาพ (Image Processing) ฯลฯ การวัดประสิทธิภาพ (Evaluation Metrics)  สำหรับการจำแนกประเภท (Classification) มีดังนี้

  1. Accuracy (ความแม่นยำ) Accuracy หมายถึง จำนวนของตัวอย่างที่ได้ตอบถูกเป็นเปอร์เซ็นต์ของตัวอย่างทั้งหมดในชุดข้อมูล นับตั้งแต่คำตอบที่ได้ตรงกับคำตอบจริงถึงคำตอบที่ได้ตรงกับคำตอบผิด สูตรคำนวณคือ
          Accuracy = (จำนวนตัวอย่างที่ตอบถูก / จำนวนตัวอย่างทั้งหมด) x 100%
  1. Precision (ความแม่นยำทางเชิงบวก) Precision หมายถึง ความสามารถในการตอบถูกที่เป็นบวก (Positive) เมื่อโมเดลทำนายว่าเป็นบวก สูตรคำนวณคือ
          Precision = (จำนวน True Positive / จำนวนที่โมเดลทำนายว่าเป็น Positive) x 100%
  1. Recall (ความสามารถในการตอบถูกที่เป็นบวกทั้งหมด) Recall หมายถึง ความสามารถในการตอบถูกที่เป็นบวกทั้งหมด (ที่มีในชุดข้อมูล) เมื่อโมเดลทำนายวางเป็นบวก สูตรคำนวณคือ
          Recall = (จำนวน True Positive / จำนวนที่เป็น Positive จริงๆ) x 100%
  2. F1-Score F1-Score เป็นค่าเฉลี่ยความสอดคล้องของค่า Precision และ Recall ซึ่งจะให้ค่าดีเมื่อทั้ง Precision และ Recall มีค่าสูงเท่ากัน สูตรคำนวณคือ
          F1-Score = 2 x (Precision x Recall) / (Precision + Recall)

     

     

  3. Confusion Matrix (เมทริกซ์การสับเปลี่ยน) Confusion Matrix เป็นเมทริกซ์ที่แสดงผลการทำนายของโมเดล โดยแบ่งเป็น 4 ช่อง ได้แก่ True Positive (TP), False Positive (FP), False Negative (FN), และ True Negative (TN) โดยที่
    • True Positive (TP) คือ จำนวนที่โมเดลทำนายว่าเป็น Positive และเป็น Positive จริงๆ
    • False Positive (FP) คือ จำนวนที่โมเดลทำนายว่าเป็น Positive แต่เป็น Negative จริงๆ
    • False Negative (FN) คือ จำนวนที่โมเดลทำนายว่าเป็น Negative แต่เป็น Positive จริงๆ
    • True Negative (TN) คือ จำนวนที่โมเดลทำนายว่าเป็น Negative และเป็น Negative จริงๆ

      โดยการใช้ Confusion Matrix จะช่วยในการวิเคราะห์ปัญหาและปรับปรุงโมเดลให้ดีขึ้นได้ ซึ่งสามารถนำมาคำนวณเป็น Precision, Recall, และ Accuracy ได้ดังนี้

      • Accuracy = (TP + TN) / (TP + FP + FN + TN)
      • Precision = TP / (TP + FP)
      • Recall = TP / (TP + FN)

นอกจากนี้ยังมีการวัดประสิทธิภาพ (Evaluation Metrics) อื่น ๆ อีกมากมาย เช่น F2-Score, AUC-ROC Curve, และ Log-Loss ซึ่งจะเหมาะสมกับปัญหาและชนิดของข้อมูลที่ใช้ในการทำนาย

 

ตัวอย่าง การวัดประสิทธิภาพของโมเดลการจำแนกประเภท (Classification) ด้วยค่า Accuracy, Precision, Recall และ F1-score

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# โหลดข้อมูล Iris dataset
iris = load_iris()

# แบ่งข้อมูลเป็น training set และ testing set
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

# สร้างโมเดล Logistic Regression และฝึกสอนโมเดลด้วย training set
clf = LogisticRegression(max_iter=1000)
clf.fit(X_train, y_train)

# ทำนายผลโดยใช้ testing set
y_pred = clf.predict(X_test)

# คำนวณค่า accuracy, precision, recall และ f1-score
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='weighted')
recall = recall_score(y_test, y_pred, average='weighted')
f1 = f1_score(y_test, y_pred, average='weighted')

# แสดงผลลัพธ์
print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1-score:", f1)

ผลลัพธ์ที่ได้คือ

Accuracy: 1.0
Precision: 1.0
Recall: 1.0
F1-score: 1.0

ในกรณีนี้โมเดลทำนายได้แม่นยำ 100% สำหรับทุกๆ ค่าประเภทข้อมูลในชุดข้อมูล Iris dataset ดังนั้นค่า Accuracy, Precision, Recall, และ F1-score ทั้งหมดมีค่าเท่ากันที่เป็น 1.0

นอกจาก metrics ที่เราได้กล่าวมาแล้ว เช่น accuracy, precision, recall, F1-score ซึ่งเป็น metrics ที่ใช้บ่อยในงาน classification แล้ว ยังมี metrics ที่ซับซ้อนขึ้นมากขึ้นสำหรับงาน Deep Learning อีกด้วย เช่น AUC, ROC, precision-recall curve เป็นต้น โดยเฉพาะในงานที่มีคลาสไม่สมดุลกัน (imbalanced classes) หรืองานที่ต้องการความละเอียดสูงขึ้น เราจะต้องใช้ metrics เหล่านี้ในการวัดประสิทธิภาพของโมเดล

ตัวอย่าง การวัดประสิทธิภาพ (Evaluation Metrics) โดยใช้ชุดข้อมูล Fashion-MNIST

import tensorflow as tf
from tensorflow.keras.datasets import fashion_mnist
from sklearn.metrics import classification_report

# โหลดชุดข้อมูล Fashion-MNIST
(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()

# ปรับเปลี่ยนขนาดของภาพเป็น 28x28 และทำ scaling ค่าความสูงค่า pixel เข้าสู่ช่วง [0, 1]
X_train = X_train.reshape((X_train.shape[0], 28, 28, 1)) / 255.0
X_test = X_test.reshape((X_test.shape[0], 28, 28, 1)) / 255.0

# แปลง label จาก categorical เป็น numerical
y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)

# สร้างโมเดล CNN
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(100, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

# คอมไพล์โมเดล
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy', 'precision', 'recall', 'f1_score'])

# ฝึกโมเดล
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_test, y_test))

# ทดสอบโมเดล
predictions = model.predict(X_test)
print(classification_report(y_test.argmax(axis=1), predictions.argmax(axis=1)))

โดยตัวอย่างนี้จะเรียกใช้ชุดข้อมูล Fashion-MNIST และสร้างโมเดล CNN สำหรับการจำแนกประเภทภาพเสื้อผ้า โดยใช้ metrics ต่างๆ เช่น accuracy, precision, recall, f1_score ในการวัดประสิทธิภาพของโมเดล และใช้ classification_report เพื่อแสดงผลลัพธ์ที่ได้หลังจากทดสอบโมเดลด้วยชุดข้อมูลทดสอบ

ตัวอย่าง การวัดประสิทธิภาพ (evaluation metrics) สำหรับงานที่มีคลาสที่ไม่สมดุล (imbalanced class) ซึ่งใช้ชุดข้อมูลหนึ่งเพื่อแสดงวิธีการคำนวณและเลือก evaluation metrics ที่เหมาะสม

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, classification_report
from imblearn.over_sampling import RandomOverSampler
from imblearn.metrics import classification_report_imbalanced

# สร้างข้อมูล
X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9], 
                            n_informative=3, n_redundant=1, flip_y=0, 
                            n_features=20, n_clusters_per_class=1, n_samples=1000, 
                            random_state=10)

# แบ่งข้อมูลเป็นชุด train และ test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=10)

# ทำการ oversample ข้อมูลเพื่อปรับคลาสที่ไม่สมดุล
ros = RandomOverSampler()
X_train_resampled, y_train_resampled = ros.fit_resample(X_train, y_train)

# สร้างโมเดลและสอนโมเดลด้วยชุด train
model = LogisticRegression()
model.fit(X_train_resampled, y_train_resampled)

# ทำนายคลาสในชุด test
y_pred = model.predict(X_test)

# คำนวณ confusion matrix และ classification report
confusion_matrix = confusion_matrix(y_test, y_pred)
classification_report = classification_report(y_test, y_pred)

# แสดงผล
print("Confusion Matrix:")
print(confusion_matrix)
print("Classification Report:")
print(classification_report)

# คำนวณ classification report ที่ใช้เพื่อจัดการคลาสไม่สมดุล
classification_report_imbalanced = classification_report_imbalanced(y_test, y_pred)
print("Classification Report (Imbalanced):")
print(classification_report_imbalanced)

จากตัวอย่าง ได้สร้างชุดข้อมูลแบบสุ่มที่มีคลาสที่ไม่สมดุล และใช้ RandomOverSampler เพื่อ oversample ข้อมูลในคลาสที่มีจำนวนน้อยกว่า เราสามารถใช้ confusion matrix และ classification report เพื่อวัดประสิทธิภาพของโมเดลได้

ตัวอย่าง การวัดประสิทธิภาพ (Evaluation Metrics) สำหรับ Deep Learning ด้วย TensorFlow 2.x และ Keras

import tensorflow as tf
from tensorflow import keras
from sklearn.metrics import classification_report

# โหลดชุดข้อมูล MNIST
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# ปรับขนาดและทำการปรับค่าสีของรูปภาพ
x_train = x_train.reshape(-1, 28, 28, 1).astype("float32") / 255.0
x_test = x_test.reshape(-1, 28, 28, 1).astype("float32") / 255.0

# สร้างโมเดล Convolutional Neural Network (CNN)
model = keras.Sequential([
    keras.layers.Conv2D(32, 3, activation='relu', input_shape=(28, 28, 1)),
    keras.layers.MaxPooling2D(),
    keras.layers.Flatten(),
    keras.layers.Dense(10)
])

# คอมไพล์และสร้างโมเดล
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])

# ฝึกโมเดล
model.fit(x_train, y_train, epochs=5)

# ทำนายค่า
y_pred = model.predict(x_test)

# แปลงค่าจาก one-hot encoding เป็นตัวเลขปกติ
y_pred = tf.argmax(y_pred, axis=1)

# ประเมินประสิทธิภาพโดยใช้ classification report
target_names = ["Class {}".format(i) for i in range(10)]
print(classification_report(y_test, y_pred, target_names=target_names))

จากตัวอย่าง จะใช้ชุดข้อมูล MNIST ที่มีรูปภาพตัวเลขในแบบเซตของฝึกฝนและเซตของทดสอบ โดยทำการปรับขนาดและปรับค่าสีของรูปภาพเป็นช่วง [0, 1] ก่อนนำไปใช้ในการฝึกโมเดล CNN ด้วย Keras จากนั้นทำการทำนายค่าของชุดข้อมูลทดสอบ และใช้ classification report เพื่อประเมินประสิทธิภาพของโมเดล โดยแสดงผลเป็น precision, recall, f1-score และ accuracy สำหรับแต่ละคลาส