Grid Search ปรับแต่งพารามิเตอร์โมเดล Machine Learning ด้วย Python

Grid Search เป็นเทคนิคที่นิยมใช้ใน Machine Learning โดยเฉพาะที่เป็นปัญหาการเรียนรู้แบบแสดงความรู้สึก (Supervised Learning) เพื่อหาค่าพารามิเตอร์ที่ดีที่สุดสำหรับโมเดล โดยการเรียกใช้งาน Grid Search จะสร้างชุดของค่าพารามิเตอร์ที่เป็นไปได้ทั้งหมด แล้วจึงทดสอบโมเดลในแต่ละค่าพารามิเตอร์ โดยค่าที่ดีที่สุดจะเลือกออกมาเป็นผลลัพธ์ที่เหมาะสมสำหรับโมเดล

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

Grid Search เป็นเทคนิคในการปรับแต่งพารามิเตอร์ของโมเดล Machine Learning เพื่อให้ได้ค่าพารามิเตอร์ที่เหมาะสมที่สุดสำหรับแต่ละโมเดล การทำ Grid Search นั้นจะทำการสร้างโมเดลตั้งแต่เบื้องต้นจนถึงการปรับแต่งพารามิเตอร์ โดยการทำ Grid Search นั้นจะทำให้สามารถหาค่าพารามิเตอร์ที่ดีที่สุดสำหรับโมเดลได้อย่างมีประสิทธิภาพมากยิ่งขึ้น เนื่องจากจะเป็นการทำลองทั้งหมดของค่าพารามิเตอร์ที่เป็นไปได้ ดังนั้น Grid Search เป็นเทคนิคที่เป็นที่นิยมใช้กันอย่างแพร่หลายในการปรับแต่งโมเดล Machine Learning

วิธีการทำ Grid Search นั้นจะมีขั้นตอนดังนี้

  1. กำหนดช่วงค่าที่เป็นไปได้ของพารามิเตอร์ที่ต้องการปรับแต่ง
  2. สร้าง Grid Search object โดยระบุโมเดลที่ต้องการปรับแต่งพารามิเตอร์ พารามิเตอร์ที่เป็นไปได้ และจำนวน fold ของ Cross Validation
  3. ทำการค้นหาค่าพารามิเตอร์ที่ดีที่สุดโดยใช้ Grid Search object และข้อมูลที่มีอยู่
  4. ดูค่าพารามิเตอร์ที่ดีที่สุดและนำมาใช้กับโมเดล
  5. ทดสอบโมเดลด้วยค่าพารามิเตอร์ที่ดีที่สุด
  6. ประเมินผลลัพธ์ของโมเดล

Grid Search ทำการค้นหาค่าพารามิเตอร์ทั้งหมดในเซตค่าที่กำหนด ดังนั้นหากมีจำนวนพารามิเตอร์ที่ต้องค้นหามาก อาจใช้เวลานานเพื่อค้นหาค่าพารามิเตอร์ที่ดีที่สุด เช่นถ้ามี 3 พารามิเตอร์ที่ต้องค้นหา แต่ละพารามิเตอร์มี 4 ค่าที่ต้องทดลอง จะทำให้ต้องทดสอบโมเดลทั้งหมด 4 x 4 x 4 = 64 ครั้ง ดังนั้นการค้นหาค่าพารามิเตอร์ที่เหมาะสมจึงอาจใช้เวลานานได้โดยเฉพาะในกรณีของโมเดลที่มีจำนวนพารามิเตอร์มากมาย แต่การใช้ Grid Search ยังคงเป็นวิธีการที่เป็นที่นิยมในการค้นหาค่าพารามิเตอร์ที่เหมาะสมใน Machine Learning อย่างแพร่หลาย ดังนั้นจึงมีหลายวิธีการที่พัฒนาขึ้นมาเพื่อลดเวลาในการค้นหาค่าพารามิเตอร์ที่เหมาะสม เช่น Random Search และ Bayesian เป็นต้น Optimization

Grid Search เป็นกระบวนการสำคัญที่ช่วยให้เราสามารถหาค่าพารามิเตอร์ที่ดีที่สุดสำหรับโมเดลที่เราสร้างขึ้นได้อย่างมีประสิทธิภาพ เราสามารถใช้ Grid Search ในการปรับค่าของพารามิเตอร์ของโมเดลได้หลากหลาย เช่น การปรับค่า C และ gamma สำหรับ SVM, หรือค่าพารามิเตอร์ของ Decision Tree เช่น max_depth, min_samples_split และ min_samples_leaf ซึ่งสามารถปรับค่าได้ตามต้องการเพื่อเพิ่มประสิทธิภาพของโมเดล ดังนั้นการใช้ Grid Search เป็นส่วนสำคัญในกระบวนการเลือกและปรับปรุงโมเดลให้มีประสิทธิภาพมากยิ่งขึ้นในงาน Machine Learning

Grid Search เป็นเครื่องมือที่มีประโยชน์ในการประมาณผลการทำงานของโมเดล Machine Learning ที่สามารถปรับค่าพารามิเตอร์เพื่อเพิ่มประสิทธิภาพของโมเดลได้

การประยุกต์ใช้ Grid Search ตัวอย่างเช่น

  1. การตัดสินใจเลือกโมเดล Machine Learning
    หากมีโมเดล Machine Learning หลายตัวที่เหมาะสมกับการแก้ไขปัญหาที่ต้องการ การใช้ Grid Search เพื่อปรับค่าพารามิเตอร์ให้กับแต่ละโมเดล จะช่วยให้เราสามารถเลือกโมเดลที่ให้ผลลัพธ์ดีที่สุดได้

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

    ยกตัวอย่างเช่น เราอาจต้องการสร้างโมเดล Machine Learning เพื่อทำนายการเปลี่ยนแปลงของราคาหุ้น โดยใช้ข้อมูลของประวัติการซื้อขายหุ้น และต้องการทดสอบและเลือกโมเดลที่ดีที่สุดสำหรับงานนี้ ในกรณีนี้ เราสามารถใช้ Grid Search ในการหาค่าพารามิเตอร์ที่เหมาะสมสำหรับโมเดลของเรา เช่น จำนวนของ decision trees ใน Random Forest, ความลึกของ decision tree, ค่า learning rate ใน Gradient Boosting เป็นต้น จากนั้นเราสามารถเลือกโมเดลที่มีประสิทธิภาพสูงสุดสำหรับงานนี้

    นอกจากนี้ Grid Search ยังสามารถนำมาใช้ในการปรับแต่งค่าพารามิเตอร์ของโมเดลเพื่อเพิ่มประสิทธิภาพหรือลดเวลาในการสร้างโมเดล เช่นในการใช้ Deep Learning สำหรับการทำนายภาพ โดย Grid Search สามารถใช้ในการหาค่าพารามิเตอร์ที่ดีที่สุดสำหรับโมเดล Convolutional Neural Network (CNN) เพื่อเพิ่มประสิทธิภาพ

  2. การพัฒนาโมเดล Machine Learning สำหรับการทำนาย
    ในการทำนายเกี่ยวกับอากาศหรือการเคลื่อนไหวของราคาหุ้น เราสามารถใช้ Grid Search เพื่อปรับค่าพารามิเตอร์ของโมเดล Machine Learning ให้เหมาะสมกับชุดข้อมูลที่เรามี เพื่อให้ผลการทำนายมีความแม่นยำมากขึ้น

    การใช้ Grid Search เป็นส่วนสำคัญในการพัฒนาโมเดล Machine Learning สำหรับการทำนาย เพราะมีหลายตัวแปรที่ต้องปรับเพื่อให้โมเดลมีประสิทธิภาพสูงสุด เช่น ค่าพารามิเตอร์ของโมเดลแบบอนุกรมเชิงเส้น (linear regression) หรือค่าพารามิเตอร์ของโมเดลแบบเชิงตัวเลข (neural network) เป็นต้น

    โดยสามารถปรับค่าพารามิเตอร์ของโมเดลได้หลายรูปแบบ เช่น จำนวนของโหนด (nodes) ใน hidden layer, ความเร็วในการเรียนรู้ (learning rate) ของโมเดลแบบเชิงตัวเลข (neural network) หรือจำนวนของต้นไม้ (n_estimators) ในโมเดล Random Forest เป็นต้น

    ดังนั้น การใช้ Grid Search จึงเป็นเครื่องมือที่มีประสิทธิภาพสูงในการช่วยในการตัดสินใจเลือกโมเดลที่ให้ผลการทำนายที่ดีที่สุด และช่วยประหยัดเวลาในการปรับค่าพารามิเตอร์ของโมเดลด้วยเพราะไม่ต้องทำด้วยวิธีทดลองแบบทอดร่วง (trial and error) ที่อาจใช้เวลานานในการหาค่าพารามิเตอร์ที่ดีที่สุด

  3. การตัดสินใจเลือกโมเดล Machine Learning สำหรับการจัดการกับข้อมูลที่มีมิติสูง
    หากมีข้อมูลที่มีมิติสูง การใช้ Grid Search เพื่อปรับค่าพารามิเตอร์ของโมเดล Machine Learning จะช่วยให้เราสามารถเลือกโมเดลที่ให้ผลลัพธ์ดีที่สุดได้

    การจัดการกับข้อมูลที่มีมิติสูง (high-dimensional data) เป็นอีกหนึ่งแนวทางที่ต้องพิจารณาในการพัฒนาโมเดล Machine Learning ด้วยวิธีการ Grid Search ซึ่งมีบางเทคนิคเฉพาะที่ช่วยให้การค้นหาพารามิเตอร์ที่เหมาะสมกับโมเดลมีประสิทธิภาพมากขึ้น โดยเฉพาะอย่างยิ่งในกรณีของข้อมูลที่มีมิติสูง

    หนึ่งในเทคนิคที่ใช้ในการจัดการกับข้อมูลที่มีมิติสูงคือการลดมิติของข้อมูล (dimensionality reduction) ซึ่งช่วยลดจำนวนตัวแปรในข้อมูลลงในที่สุดจะเหลือเพียงแค่ตัวแปรสำคัญที่สามารถอธิบายข้อมูลได้เท่านั้น ด้วยเหตุนี้ Grid Search ในการตัดสินใจเลือกโมเดล Machine Learning สำหรับข้อมูลที่มีมิติสูงจะต้องคำนึงถึงการใช้เทคนิคลดมิติของข้อมูลด้วย เช่น PCA (Principal Component Analysis) หรือ t-SNE (t-Distributed Stochastic Neighbor Embedding) ซึ่งเป็นเทคนิคที่มักจะใช้กับข้อมูลที่มีมิติสูง

    นอกจากนี้ การเลือกโมเดล Machine Learning ที่เหมาะสมกับข้อมูลที่มีมิติสูงยังต้องพิจารณาถึงการใช้งานวิธีการ regularization เพื่อลด overfitting ที่อาจเกิดขึ้นในการประมวลผลข้อมูลที่มีมิติสูง เช่น L1 regularization และ L2 regularization ซึ่งเป็นวิธีการลดความซับซ้อนของโมเดลเพื่อลด overfitting ที่เป็นปัญหาในการพัฒนาโมเดล Machine Learning ด้วย Grid Search

  4. การพัฒนาโมเดล Machine Learning สำหรับการตรวจสอบความปลอดภัยของเครือข่ายคอมพิวเตอร์
    ในการตรวจสอบความปลอดภัยของเครือข่ายคอมพิวเตอร์ โมเดล Machine Learning ที่เหมาะสมควรมีความแม่นยำสูง เพื่อการตรวจจับการทำงานที่ผิดปกติ (anomaly detection) และการตรวจสอบสิทธิ์การเข้าถึง (access control) ของผู้ใช้งาน การพัฒนาโมเดลด้วย Grid Search จึงเป็นวิธีที่น่าสนใจ เนื่องจากมีจำนวนพารามิเตอร์ที่มากและซับซ้อน

    ตัวอย่างเช่น ในการพัฒนาโมเดลการตรวจจับการทำงานที่ผิดปกติบนเครือข่าย มีหลายตัวแบบที่ใช้เช่น Random Forest, SVM, Neural Networks ฯลฯ แต่ต้องการหาตัวแบบที่มีประสิทธิภาพสูงสุด จึงจะใช้ Grid Search ในการหาค่าพารามิเตอร์ที่เหมาะสมกับตัวแบบนั้นๆ โดยสามารถกำหนดพารามิเตอร์ได้หลายตัว เช่น จำนวนต้นไม้ใน Random Forest, ค่าความลึกของ Neural Networks, ค่าความสูงของ SVM ฯลฯ

    การพัฒนาโมเดลด้วย Grid Search สามารถช่วยให้เราเลือกโมเดลที่มีประสิทธิภาพสูงสุดสำหรับงานตรวจจับการทำงานที่ผิดปกติ โดยเน้นความแม่นยำในการตรวจจับ (recall) และค่า F1-score ที่สูงสุด เพื่อให้โมเดลมีประสิทธิภาพในการตรวจจับและตอบสนองกับการกระทำที่ผิดปกติอย่างมีประสิทธิภาพมากที่สุด

ตัวอย่าง การใช้ Grid Search ในการปรับแต่งโมเดล SVM (Support Vector Machine) สำหรับการจำแนกประเภทของดอกไม้จาก Iris Dataset โดยใช้ Scikit-learn ในการสร้าง Dataset และการทำ Machine Learning Model

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import classification_report

# โหลด Iris dataset
iris = datasets.load_iris()
X = iris.data
y = iris.target

# แบ่งข้อมูลเป็น Train set และ Test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# กำหนดพารามิเตอร์ที่เป็นไปได้ของ SVM
param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [0.1, 0.01, 0.001, 0.0001], 'kernel': ['linear', 'rbf']}

# สร้าง Grid Search object สำหรับ SVM
svm_grid_search = GridSearchCV(SVC(random_state=0), param_grid, cv=5)

# ปรับพารามิเตอร์ของ SVM ด้วย Grid Search
svm_grid_search.fit(X_train, y_train)

# แสดงค่าพารามิเตอร์ที่ดีที่สุดสำหรับ SVM
print('Best parameters for SVM:', svm_grid_search.best_params_)

# ทำนายผลการจัดกลุ่มสำหรับ Test set ด้วยโมเดล SVM ที่ดีที่สุด
y_pred = svm_grid_search.predict(X_test)

# แสดงผลการทดสอบ
print(classification_report(y_test, y_pred))

# แสดง Decision boundary ของโมเดล SVM ที่ดีที่สุด
svc = svm_grid_search.best_estimator_
svc.fit(X_train[:, :2], y_train)

x_min, x_max = X_train[:, 0].min() - 1, X_train[:, 0].max() + 1
y_min, y_max = X_train[:, 1].min() - 1, X_train[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02))
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu, alpha=0.8)
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=plt.cm.RdYlBu)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('Decision boundary of SVM')
plt.show()

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

Best parameters for SVM: {'gamma': 0.1, 'kernel': 'rbf', 'C': 10}
             precision    recall  f1-score   support

          0       1.00      1.00      1.00        16
          1       1.00      0.94      0.97        18
          2       0.92      1.00      0.96        11

avg / total       0.98      0.98      0.98        45

จากตัวอย่าง เป็นการใช้ SVM (Support Vector Machine) ในการจัดกลุ่ม (classification) ข้อมูล iris dataset โดยใช้ Grid Search เพื่อหาค่าพารามิเตอร์ที่ดีที่สุดสำหรับ SVM และแสดงผลการทดสอบ (test) โมเดล SVM ด้วย classification_report และ Decision boundary ของโมเดล SVM ที่ดีที่สุดด้วย contourf และ scatter plot

รายละเอียดของโค้ด:

  • โหลด iris dataset และแบ่งข้อมูลเป็น train set และ test set
  • กำหนดพารามิเตอร์ที่เป็นไปได้ของ SVM ด้วย param_grid
  • สร้าง Grid Search object สำหรับ SVM ด้วย svm_grid_search = GridSearchCV(SVC(random_state=0), param_grid, cv=5)
  • ปรับพารามิเตอร์ของ SVM ด้วย Grid Search ด้วย svm_grid_search.fit(X_train, y_train)
  • แสดงค่าพารามิเตอร์ที่ดีที่สุดสำหรับ SVM ด้วย svm_grid_search.best_params_
  • ทำนายผลการจัดกลุ่มสำหรับ Test set ด้วยโมเดล SVM ที่ดีที่สุดด้วย y_pred = svm_grid_search.predict(X_test)
  • แสดงผลการทดสอบด้วย classification_report(y_test, y_pred)
  • แสดง Decision boundary ของโมเดล SVM ที่ดีที่สุดด้วย contourf และ scatter plot ด้วย x_min, x_max, y_min, y_max, xx, yy, Z, plt.contourf, plt.scatter, plt.xlabel, plt.ylabel, และ plt.title
 

ตัวอย่าง การใช้ Grid Search ปรับแต่งพารามิเตอร์โมเดลลักษณะของกลุ่มตัวอย่าง ใน Machine Learning พร้อมสร้างกราฟ matplotlib สามารถเขียนได้ดังนี้

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import confusion_matrix, classification_report
import matplotlib.pyplot as plt

# สร้าง dataset ขึ้นมาเอง
np.random.seed(0)
X = np.random.rand(100, 4)
y = np.random.randint(0, 2, size=100)

# แปลงข้อมูลเป็น dataframe
df = pd.DataFrame(X, columns=['height', 'weight', 'age', 'gender'])
df['gender'] = np.where(df['gender'] > 0.5, 'male', 'female')
df['age'] = df['age'] * 100 // 1  # แปลงอายุเป็นเลขจำนวนเต็ม

# แบ่งข้อมูลเป็น Train set และ Test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# กำหนดพารามิเตอร์ที่เป็นไปได้ของ Decision Tree Classifier
param_grid = {'max_depth': [2, 4, 6, 8, 10], 'min_samples_split': [2, 5, 10], 'min_samples_leaf': [1, 2, 4]}

# สร้าง Grid Search object สำหรับ Decision Tree Classifier
dtc_grid_search = GridSearchCV(DecisionTreeClassifier(random_state=0), param_grid, cv=5)

# ปรับพารามิเตอร์ของ Decision Tree Classifier ด้วย Grid Search
dtc_grid_search.fit(X_train, y_train)

# แสดงค่าพารามิเตอร์ที่ดีที่สุดสำหรับ Decision Tree Classifier
print('Best parameters for Decision Tree Classifier:', dtc_grid_search.best_params_)

# ทำนายผลการจัดกลุ่มสำหรับ Test set ด้วยโมเดล Decision Tree Classifier ที่ดีที่สุด
y_pred = dtc_grid_search.predict(X_test)

# แสดง confusion matrix และ classification report
print('Confusion matrix:\n', confusion_matrix(y_test, y_pred))
print('Classification report:\n', classification_report(y_test, y_pred))

# วาดกราฟแสดงความสัมพันธ์ระหว่างส่วนประกอบต่างๆของข้อมูล
fig, axs = plt.subplots(1, 3, figsize=(20, 5))
axs[0].scatter(df['height'], df['weight'], c=y)
axs[0].set_xlabel('Height')
axs[0].set_ylabel('Weight')
axs[1].scatter(df['height'], df['age'], c=y)
axs[1].set_xlabel('Height')
axs[1].set_ylabel('Age')
axs[2].scatter(df['weight'], df['age'], c=y)
axs[2].set_xlabel('Weight')
axs[2].set_ylabel('Age')
plt.show()

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

Best parameters for Decision Tree Classifier: {'max_depth': 4, 'min_samples_leaf': 1, 'min_samples_split': 2}
Confusion matrix:
 [[12  2]
 [ 8  8]]
Classification report:
               precision    recall  f1-score   support

           0       0.60      0.86      0.71        14
           1       0.80      0.50      0.62        16

    accuracy                           0.67        30
   macro avg       0.70      0.68      0.66        30
weighted avg       0.71      0.67      0.66        30

จากกลุ่มตัวอย่าง เป็นการสร้าง dataset ขึ้นมาเอง โดยใช้ NumPy และ Pandas เพื่อสร้างข้อมูลที่มีลักษณะเป็นตัวเลข 4 มิติ และเป็นไปตามการกระจายที่สุ่มได้

จากนั้นจะนำข้อมูลที่สร้างขึ้นมาแบ่งเป็น Train set และ Test set เพื่อใช้สำหรับการฝึกและทดสอบโมเดล Decision Tree Classifier

กำหนดพารามิเตอร์ที่เป็นไปได้ของ Decision Tree Classifier ด้วย max_depth, min_samples_split และ min_samples_leaf และสร้าง Grid Search object สำหรับ Decision Tree Classifier เพื่อค้นหาค่าพารามิเตอร์ที่ดีที่สุด

จากนั้นทำการปรับพารามิเตอร์ของ Decision Tree Classifier ด้วย Grid Search และแสดงค่าพารามิเตอร์ที่ดีที่สุดสำหรับ Decision Tree Classifier

จากนั้นทำนายผลการจัดกลุ่มสำหรับ Test set ด้วยโมเดล Decision Tree Classifier ที่ดีที่สุด และแสดง confusion matrix และ classification report เพื่อวัดประสิทธิภาพของโมเดล

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