Hỏi đáp

Tự học ML | Điều chỉnh siêu tham số SVM bằng GridSearchCV | ML

Huy Erick

Học máy, hay còn được gọi là Machine Learning (ML), là một lĩnh vực toán học trong đó chúng ta học các mô hình từ dữ liệu. Một trong những khía cạnh quan trọng của...

Học máy, hay còn được gọi là Machine Learning (ML), là một lĩnh vực toán học trong đó chúng ta học các mô hình từ dữ liệu. Một trong những khía cạnh quan trọng của học máy là việc điều chỉnh các tham số của mô hình. Tuy nhiên, một số tham số, được gọi là siêu tham số (Hyperparameters), không thể được học trực tiếp từ dữ liệu. Thay vào đó, chúng thường được lựa chọn bởi con người dựa trên trực giác hoặc phương pháp thử và sai trước khi bắt đầu quá trình huấn luyện thực sự. Những siêu tham số này thể hiện sự quan trọng của chúng bằng cách cải thiện hiệu suất của mô hình, chẳng hạn như độ phức tạp hoặc tốc độ học. Mô hình có thể có nhiều siêu tham số và việc tìm kiếm sự kết hợp tốt nhất của chúng có thể được coi là một bài toán tìm kiếm.

Mô hình SVM cũng có một số siêu tham số (chẳng hạn như giá trị C và gamma) và việc tìm kiếm các siêu tham số tốt nhất là một nhiệm vụ khó khăn. Tuy nhiên, chúng ta có thể tìm hiểu các siêu tham số này bằng cách thử tất cả các kết hợp và xem thông số nào hoạt động tốt nhất. Ý tưởng chính đằng sau phương pháp này là tạo ra một lưới các siêu tham số và kiểm tra tất cả các kết hợp của chúng. May mắn thay, chúng ta không cần phải làm điều này thủ công vì Scikit-learn đã tích hợp sẵn chức năng GridSearchCV.

1. Nhập các thư viện cần thiết và lấy Dữ liệu

Chúng ta sẽ sử dụng bộ dữ liệu ung thư vú được tích hợp sẵn từ Scikit Learn. Bạn có thể tải bộ dữ liệu này bằng lệnh sau:

import pandas as pd 
import numpy as np 
from sklearn.metrics import classification_report, confusion_matrix 
from sklearn.datasets import load_breast_cancer 
from sklearn.svm import SVC

cancer = load_breast_cancer()

Bây giờ chúng ta sẽ trích xuất tất cả các tính năng vào một DataFrame mới và các tính năng mục tiêu vào một DataFrame riêng biệt:

df_feat = pd.DataFrame(cancer['data'], columns = cancer['feature_names'])
df_target = pd.DataFrame(cancer['target'], columns =['Cancer'])

print("Các thuộc tính của dữ liệu: ")
print(df_feat.info())

print("Dữ liệu mẫu: ")
print(df_feat.head())

2. Tách dữ liệu thành tập huấn luyện và tập kiểm tra

Bây giờ chúng ta sẽ chia dữ liệu thành tập huấn luyện và tập kiểm tra với tỷ lệ 70:30:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(df_feat, np.ravel(df_target), test_size = 0.30, random_state = 101)

Tiếp theo, chúng ta sẽ đào tạo mô hình SVC mà không cần điều chỉnh siêu tham số:

model = SVC()
model.fit(X_train, y_train)

predictions = model.predict(X_test)
print(classification_report(y_test, predictions))

Chúng ta có độ chính xác khoảng 61%, nhưng bạn có nhận thấy điều gì lạ không?

Lưu ý rằng độ phục hồi và độ chính xác cho lớp 0 luôn bằng 0. Điều này có nghĩa là trình phân loại luôn phân loại tất cả các mẫu vào một lớp duy nhất, tức là lớp 1! Điều này cho thấy mô hình của chúng ta cần được điều chỉnh các thông số của nó.

Đây là lúc GridSearchCV trở nên hữu ích. Chúng ta có thể tìm kiếm các thông số tốt nhất bằng cách sử dụng GridSearchCV!

3. Sử dụng GridsearchCV

Một trong những điều tuyệt vời về GridSearchCV là nó là một công cụ ước tính phổ biến. Nó yêu cầu một ước tính như SVC và tạo ra một ước tính mới hoạt động tương tự - trong trường hợp này, là một trình phân loại. Bạn có thể thêm các tham số như refit = True và verbose cho bất kỳ con số nào bạn muốn, với số càng cao thì đoạn mã sẽ càng dài.

from sklearn.model_selection import GridSearchCV

param_grid = {'C': [0.1, 1, 10, 100, 1000], 'gamma': [1, 0.1, 0.01, 0.001, 0.0001], 'kernel': ['rbf']}
grid = GridSearchCV(SVC(), param_grid, refit = True, verbose = 3)
grid.fit(X_train, y_train)

Quá trình tìm kiếm sẽ mất một chút thời gian hơn bình thường. Đầu tiên, nó sẽ chạy một vòng lặp với quá trình xác nhận chéo để tìm ra kết hợp siêu tham số tốt nhất. Sau khi có kết hợp tốt nhất, nó sẽ chạy lại trên toàn bộ dữ liệu huấn luyện (không xác nhận chéo) để tạo ra một mô hình mới sử dụng các giá trị siêu tham số tốt nhất.

Bạn có thể kiểm tra các siêu tham số tốt nhất mà GridSearchCV tìm thấy trong thuộc tính best_params_, và ước tính tốt nhất trong thuộc tính best_estimator_:

print(grid.best_params_)
print(grid.best_estimator_)

Tiếp theo, bạn có thể chạy lại các dự đoán và xem báo cáo phân loại trên mô hình này giống như bạn làm với mô hình ban đầu.

grid_predictions = grid.predict(X_test)
print(classification_report(y_test, grid_predictions))

Chúng ta đã có được kết quả dự đoán gần như 95%.

Cài ứng dụng cafedev để dễ dàng cập nhật tin tức và học lập trình mọi lúc mọi nơi tại đây.

Nếu bạn thấy bài viết này hữu ích và thú vị, hãy tham gia các kênh sau của cafedev để nhận được nhiều nội dung hơn:

Chào thân ái và chúc bạn thành công!

1