Mô hình Softmax Regression
Giới thiệu
Hồi quy là công cụ đắc lực có thể sử dụng khi ta muốn trả lời câu hỏi bao nhiêu?. Nếu bạn muốn dự đoán một ngôi nhà sẽ được bán với giá bao nhiêu tiền (Đô la), hay số trận thắng mà một đội bóng có thể đạt được, hoặc số ngày một bệnh nhân phải điều trị nội trú trước khi được xuất viện, thì có lẽ bạn đang cần một mô hình hồi quy.
Trong thực tế, ta thường quan tâm đến việc phân loại hơn: không phải câu hỏi bao nhiêu? mà là loại nào?
Email này có phải thư rác hay không? Bệnh nhân này có khối u ác tính không? Khách hàng này nhiều khả năng đăng ký hay không đăng ký một dịch vụ thuê bao? Hình ảnh này mô tả một con bò, một con chó, một con heo hay một con gà trống? Bộ phim nào có khả năng cao nhất được giải Osca xem tiếp theo?
Hồi quy Softmax là một phương pháp trong học máy cho phép phân loại đầu vào thành các lớp rời rạc.Không giống như hồi quy logistic thường được sử dụng, chỉ có thể thực hiện phân loại nhị phân, softmax cho phép phân loại thành bất kỳ số lượng lớp nào có thể.
Các bài toán classification thực tế thường có rất nhiều classes (multi-class), các binary classifiers mặc dù có thể áp dụng cho các bài toán multi-class, chúng vẫn có những hạn chế nhất định. Với binary classifiers, kỹ thuật được sử dụng nhiều nhất one-vs-rest có một hạn chế về tổng các xác suất. Softmax Regression, phương pháp này được sử dụng rộng rãi như một phương pháp classification.
Phương pháp
Ý tưởng của bài toán
Chúng ta cần một mô hình xác suất sao cho với mỗi input x , thể hiện xác suất để input đó rơi vào class i . Vậy điều kiện cần là các phải dương và tổng của chúng bằng 1. Để có thể thỏa mãn điều kiện này, chúng ta cần nhìn vào mọi giá trị và dựa trên quan hệ giữa các này để tính toán giá trị của . Ngoài các điều kiện lớn hơn 0 và có tổng bằng 1, chúng ta sẽ thêm một điều kiện cũng rất tự nhiên nữa, giá trị càng lớn thì xác suất dữ liệu rơi vào class i càng cao. Điều kiện cuối này chỉ ra rằng chúng ta cần một hàm đồng biến ở đây.
Chú ý rằng có thể nhận giá trị cả âm và dương. Một hàm số mượt đơn giản có thể chắc chắn biến thành một giá trị dương, và hơn nữa, đồng biến, là hàm . Điều kiện cuối cùng, tổng các bằng 1 có thể được đảm bảo nếu:
Hàm số này, tính tất cả các ai dựa vào tất cả các , thỏa mãn tất cả các điều kiện đã xét: dương, tổng bằng 1, giữ được thứ tự của . Hàm số này được gọi là softmax function.
Kiểu dữ liệu của phương pháp:
- Tùy thuộc vào kiểu dữ liệu đầu vào, thường là tập dữ liệu có các tính năng ‘m’ và ‘n’ hay các quan sát. Ngoài ra, có các nhãn lớp ‘k’, tức là mọi quan sát có thể được phân loại là một trong các giá trị mục tiêu có thể có của‘k’.
- Chuẩn hóa dữ liệu là một bước cần thiết giúp input có sự đồng nhất tạo sự dễ dàng trong việc xử lí và sử dụng dữ liệu.
Ví dụ minh họa cho bài toán ở phần đầu.
Có n chiếc xe cần đến đón các học sinh trong toàn tỉnh để đưa các bạn học sinh đi du lịch. Bài toán đặt ra là làm sao để tiết kiệm xăng và thời gian nhất có thể để chúng ta cần phân chia xe đến đón học sinh. Vì thế chúng ta có thể áp dụng phương pháp trên cho bài toán này.
Ưu và nhược điểm của phương pháp:
Ưu điểm:
- Hàm softmax là tối ưu khi tính toán xác suất tối đa trong tham số mô hình.
- Tính chất của hàm softmax khiến hàm phù hợp với sự thông dịch xác suất, rất hữu ích trong Machine Learning (Học máy).
- Chuẩn hóa softmax là một cách để giảm thiểu ảnh hưởng của những giá trị cực trị hay dữ liệu ngoại lai trong dữ liệu mà không phải chỉnh sửa dữ liệu ban đầu.
Nhược điểm:
Có độ phức tạp cao với lượng dữ liệu lớn và nhiều chiều.
Cài đặt chương trình
import numpy as np
import matplotlib.pyplot as plt
from scipy import sparse
Định nghĩa hàm tính toán softmax
def softmax(Z):
#Hàm tính toán softmax
e_Z = np.exp(Z - np.max(Z, axis = 0, keepdims = True))
A = e_Z / e_Z.sum(axis = 0)
return A
Hàm phân cụm dữ liệu
def kmeans_display(X, label):
K = np.amax(label) + 1 #Số lớp của dataset
#Tách ra thành 3 mẫu data
X0 = X[label == 0, :]
X1 = X[label == 1, :]
X2 = X[label == 2, :]
#Visualize
plt.plot(X0[:, 0], X0[:, 1], 'b^', markersize = 4, alpha = .8)
plt.plot(X1[:, 0], X1[:, 1], 'go', markersize = 4, alpha = .8)
plt.plot(X2[:, 0], X2[:, 1], 'rs', markersize = 4, alpha = .8)
plt.axis('equal')
plt.plot()
plt.show()
Hàm chuyển nhãn về dạng one-hot
def convert_labels(y, C = 3):
#Chuyển về dạng one-hot vector có kích thước 3 x y.shape[0]
#VD: y[0] = 1 thì sẽ được chuyển về dạng [[0],
# [1],
# [0]]
Y = sparse.coo_matrix((np.ones_like(y),
(y, np.arange(len(y)))), shape = (C, len(y))).toarray()
return Y
Hàm đánh giá model
def evaluation(X, y, W, count):
# Tính toán độ chính xác của model trên tập data
y_pred = softmax(np.dot(W.T, X))
y_pred = [np.where(y_pred[:, i] == np.amax(y_pred[:, i])) for i in range(y_pred.shape[1])] # Chọn nhãn có xác xuất dự đoán cao nhất
ss = [y_pred[i]==y[i] for i in range(len(y))] # So sánh kết quả dự đoán và kết quả thực tế
eval = ss.count(True)/len(ss) *100 # Tính toán độ chính xác là bao nhiêu phần trăm
print("Accuracy in epoch " + str(count) + ": " + str(eval))
Tính toán bằng thuật toán softmax
def softmax_regression(X, y, W_init, eta, tol = 1e-4, max_count = 1000):
W = [W_init] # Khởi tạo tham số
C = W_init.shape[1] # Xác định số lớp phân loại
Y = convert_labels(y, C) # Chuyển label về dạng one-hot vector
N = X.shape[1] # Số lượng feature trên một điểm dữ liệu
d = X.shape[0] # Số lượng điểm dữ liệu
count = 0
check_w_after = 20 # Sau 20 epoch, kiểm tra lại tham số
while count < max_count:
# mix data
mix_id = np.random.permutation(N) # Tạo list chứa N phần tử, mỗi phần tử được tạo random từ 0 tới N
for i in mix_id:
xi = X[:, i].reshape(d, 1)
yi = Y[:, i].reshape(C, 1)
ai = softmax(np.dot(W[-1].T, xi)) # Dùng tham số mới nhất để tính toán softmax
W_new = W[-1] + eta*xi.dot((yi - ai).T) # Cập nhật lại tham số theo công thức
count += 1
if count%check_w_after == 0:
evaluation(X, y, W[-1], count)
if np.linalg.norm(W_new - W[-check_w_after]) < tol: # Kiểm tra xem tham số mới có thay đổi đáng kể
#so với tham số đứng trước nó 20 vị trí trong list
return W
W.append(W_new) # Thêm tham số sau khi được cập nhật vào list để lưu trữ
evaluation(X, y, W[-1], count)
return W
Tiến hành tạo dữ liệu và tính toán
# Quy định data khởi tạo có phân phối chuẩn kỳ vọng (means) và có ma trận hiệp phương sai của phân phối (cov)
#như sau
means = [[2, 0], [10, 5], [3, 7]]
cov = [[1, 0], [0, 1]]
N = 500 #Kích thước dữ liệu là 500
X0 = np.random.multivariate_normal(means[0], cov, N) # Tạo data theo các quy định trên, mỗi tập data sẽ có label
X1 = np.random.multivariate_normal(means[1], cov, N) #giống nhau
X2 = np.random.multivariate_normal(means[2], cov, N)
X = np.concatenate((X0, X1, X2), axis = 0).T # Kết hợp 3 tập data lại với nhau tạo thành tập data chung
K = 3
#print(X.shape)
original_label = np.asarray([0]*N + [1]*N + [2]*N).T #Tạo array chứa các label cho từng điểm dữ liệu
#kmeans_display(X, original_label) #Visualize dữ liệu
W_init = np.random.randn(X.shape[0], 3)
#print(W_init.shape)
W = softmax_regression(X, original_label, W_init, 0.05)
#print(W_init[-1])
Kết quả sau khi chạy: Độ chính xác Acc cao nhất: 89.2 % Kết quả visualize model phân lớp:
Bài tập
Xây dựng mô hình Softmax Regression cho bài toán phân lớp. Các bước thực hiện:
- Bước 1: Import các thư viện và đọc file csv(có thể tự tạo dữ liệu)
- Bước 2: Trích xuất ra các đặc trưng quan trọng từ file csv để đưa vào mô hình
- Bước 3: Phân chia bộ dữ liệu thành 75% train và 25% test
- Bước 4: Scaler dữ liệu
- Bước 5: Xây dựng mô hình phân lớp Softmax Regresstion từ bộ dữ liệu đã tiền xử lý ở trên
- Bước 6: Dự đoán trên bộ dữ liệu test
- Bước 7: Kiểm tra hiệu suất của mô hình
- Bước 8: Trực quan hóa kết quả của mô hình phân lớp trên.
Tổng kết:
Thường được sử dụng trong những phương thức phân loại đa lớp trong lĩnh vực Machine Learning, Deep Learning và Data Science (Khoa học dữ liệu). Ý tưởng cơ bản là từ input đầu vào, sử dụng softmax function để tính toán xác suất các lớp mà đối tượng đó có thể thuộc về rồi chọn ra lớp phù hợp với xác suất lớn nhất. Xác suất tính được sẽ giúp quyết định lớp chính xác cho một giá trị đầu vào. Khi nào nên sử dụng Softmax Regression:
- Thứ nhất, đầu vào là một tập có nhiều tính năng và đầu ra của dữ liệu là phân loại với số lượng lớp lớn.
- Thứ hai, khi bạn cần xác suất cho dự đoán của bạn. Ví dụ như nếu ta muốn biết xác suất của khách hàng mua sản phẩm cho từng loại mặt hàng cụ thể là gì. Hồi quy Softmax trả về xác suất từ 0 đến 1 cho các lớp mà đối tượng mà đối tượng có thể thuộc về.
Tác giả
- Phan Tiến Ngọc
- Hồ Quốc Thư
- Đặng Quang Anh Tuấn