Gần đây tôi đã hoàn thành bài tập 3 của Andrew Ng's Machine Learning trên Coursera bằng Python .
Khi ban đầu hoàn thành các phần 1.4 đến 1.4.1 của bài tập, tôi gặp khó khăn khi đảm bảo rằng mô hình được đào tạo của tôi có độ chính xác phù hợp với 94,9% dự kiến. Ngay cả sau khi gỡ lỗi và đảm bảo rằng các hàm chi phí và độ dốc của tôi không có lỗi và mã dự đoán của tôi hoạt động chính xác, tôi vẫn chỉ nhận được độ chính xác 90,3%. Tôi đã sử dụng thuật toán gradient liên hợp (CG) trong scipy.optimize.minimize
.
Vì tò mò, tôi quyết định thử một thuật toán khác và sử dụng BroydenTHER FletcherTHER GoldfarbTHER Shannon (BFGS). Thật ngạc nhiên, độ chính xác được cải thiện mạnh mẽ đến 96,5% và do đó vượt quá mong đợi. Việc so sánh hai kết quả khác nhau giữa CG và BFGS có thể được xem trong sổ ghi chép của tôi dưới tiêu đề Sự khác biệt về độ chính xác do các thuật toán tối ưu hóa khác nhau .
Là lý do cho sự khác biệt về độ chính xác này do sự lựa chọn khác nhau của thuật toán tối ưu hóa? Nếu có, sau đó ai đó có thể giải thích tại sao?
Ngoài ra, tôi sẽ đánh giá rất cao bất kỳ đánh giá nào về mã của tôi chỉ để đảm bảo rằng không có lỗi trong bất kỳ chức năng nào của tôi gây ra điều này.
Cảm ơn bạn.
EDIT: Ở đây bên dưới tôi đã thêm mã liên quan đến câu hỏi, theo yêu cầu trong các bình luận mà tôi làm như vậy trong trang này thay vì giới thiệu người đọc đến các liên kết đến sổ ghi chép Jupyter của tôi.
Mô hình hàm chi phí:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def compute_cost_regularized(theta, X, y, lda):
reg =lda/(2*len(y)) * np.sum(theta[1:]**2)
return 1/len(y) * np.sum(-y @ np.log(sigmoid(X@theta))
- (1-y) @ np.log(1-sigmoid(X@theta))) + reg
def compute_gradient_regularized(theta, X, y, lda):
gradient = np.zeros(len(theta))
XT = X.T
beta = sigmoid(X@theta) - y
regterm = lda/len(y) * theta
# theta_0 does not get regularized, so a 0 is substituted in its place
regterm[0] = 0
gradient = (1/len(y) * XT@beta).T + regterm
return gradient
Chức năng thực hiện đào tạo phân loại một-tất cả:
from scipy.optimize import minimize
def train_one_vs_all(X, y, opt_method):
theta_all = np.zeros((y.max()-y.min()+1, X.shape[1]))
for k in range(y.min(),y.max()+1):
grdtruth = np.where(y==k, 1,0)
results = minimize(compute_cost_regularized, theta_all[k-1,:],
args = (X,grdtruth,0.1),
method = opt_method,
jac = compute_gradient_regularized)
# optimized parameters are accessible through the x attribute
theta_optimized = results.x
# Assign thetheta_optimized vector to the appropriate row in the
# theta_all matrix
theta_all[k-1,:] = theta_optimized
return theta_all
Được gọi là hàm để huấn luyện mô hình với các phương thức tối ưu hóa khác nhau:
theta_all_optimized_cg = train_one_vs_all(X_bias, y, 'CG') # Optimization performed using Conjugate Gradient
theta_all_optimized_bfgs = train_one_vs_all(X_bias, y, 'BFGS') # optimization performed using Broyden–Fletcher–Goldfarb–Shanno
Chúng tôi thấy rằng kết quả dự đoán khác nhau dựa trên thuật toán được sử dụng:
def predict_one_vs_all(X, theta):
return np.mean(np.argmax(sigmoid(X@theta.T), axis=1)+1 == y)*100
In[16]: predict_one_vs_all(X_bias, theta_all_optimized_cg)
Out[16]: 90.319999999999993
In[17]: predict_one_vs_all(X_bias, theta_all_optimized_bfgs)
Out[17]: 96.480000000000004
Đối với bất kỳ ai muốn lấy bất kỳ dữ liệu nào để thử mã, họ có thể tìm thấy nó trong Github của tôi như được liên kết trong bài đăng này.