CẬP NHẬT: Chúng tôi đã giới thiệu một nền tảng học tập tương tác để học máy học / AI, hãy xem blog này ở chế độ tương tác. : We have introduced an interactive learning platform to learn machine learning / AI , check out this blog in interactive mode.
Nó có một thuật toán phân loại, được sử dụng trong đó biến phản hồi là phân loại. Ý tưởng về hồi quy logistic là tìm ra mối quan hệ giữa các tính năng và xác suất của kết quả cụ thể.relationship between features and probability of particular outcome.
Ví dụ. Đó là bông hoa nào? Đưa ra chiều rộng và chiều dài của sepals và cánh hoa .. Hãy tìm hiểu!
Bộ dữ liệu
Chúng tôi sẽ sử dụng bộ dữ liệu IRIS nổi tiếng. Nó chứa 3 lớp 50 trường hợp mỗi lớp, trong đó mỗi lớp đề cập đến một loại nhà máy iris. Để đơn giản hóa mọi thứ, chúng tôi chỉ lấy hai cột tính năng đầu tiên. Ngoài ra, hai lớp không thể phân tách phi tuyến tính được dán nhãn cùng một danh mục, kết thúc với một vấn đề phân loại nhị phân.
from sklearn import datasetsiris = datasets.load_iris[]Hình 1 - Dữ liệu đào tạo
X = iris.data[:, :2]
y = [iris.target != 0] * 1
Loại vấn đề này được gọi là hồi quy logistic nhị thức, trong đó biến phản hồi có hai giá trị 0 và 1 hoặc vượt qua và thất bại hoặc đúng và sai. Hồi quy logistic đa hình liên quan đến các tình huống trong đó biến phản hồi có thể có ba hoặc nhiều giá trị có thể.Binomial Logistic Regression, where the response variable has two values 0 and 1 or pass and fail or true and false. Multinomial Logistic Regression deals with situations where the response variable can have three or more possible values.
Thuật toán
Đưa ra một tập hợp các đầu vào X, chúng tôi muốn gán chúng cho một trong hai loại có thể [0 hoặc 1]. Hồi quy logistic mô hình xác suất mà mỗi đầu vào thuộc về một danh mục cụ thể.
Giả thuyết
Một chức năng lấy đầu vào và trả về đầu ra. Để tạo xác suất, hồi quy logistic sử dụng hàm đưa ra đầu ra từ 0 đến 1 cho tất cả các giá trị của X. Có nhiều hàm đáp ứng mô tả này, nhưng được sử dụng trong trường hợp này là hàm logistic. Từ đây chúng tôi sẽ gọi nó là sigmoid.
Hình 2 - Hàm logistic. 3 - Giả thuyết, E là nhật ký tự nhiên 2.718 ________ 1Tên phá vỡ:
Logistic: Vì hàm ăn chính được sử dụng là sigmoid/logistic
Hồi quy: Chúng tôi là xác suất dự đoán là các giá trị liên tục và thuộc về hồi quy
Thiếu chức năng
Các chức năng có các tham số/trọng số [được biểu thị bởi theta trong ký hiệu của chúng tôi] và chúng tôi muốn tìm các giá trị tốt nhất cho chúng. Để bắt đầu, chúng tôi chọn các giá trị ngẫu nhiên và chúng tôi cần một cách để đo lường mức độ của thuật toán thực hiện bằng cách sử dụng các trọng số ngẫu nhiên đó. Biện pháp đó được tính toán bằng cách sử dụng hàm mất, được định nghĩa là:
Hình 4 - Hàm mất ____2Xuống dốc
Mục tiêu của chúng tôi là giảm thiểu chức năng tổn thất và cách chúng tôi phải đạt được bằng cách tăng/giảm trọng lượng, tức là phù hợp với chúng. Câu hỏi là, làm thế nào để chúng ta biết những tham số nào nên là Biggers và những tham số nào nên nhỏ? Câu trả lời được đưa ra bởi đạo hàm của chức năng tổn thất đối với từng trọng lượng. Nó cho chúng ta biết sự mất mát sẽ thay đổi như thế nào nếu chúng ta sửa đổi các tham số.
Hình 4 - Dẫn xuất một phần ____3Sau đó, chúng tôi cập nhật các trọng số bằng cách điều chỉnh cho họ thời gian phái sinh theo tỷ lệ học tập.
lr = 0.01
theta -= lr * gradient
Chúng ta nên lặp lại các bước này nhiều lần cho đến khi chúng ta đạt được giải pháp tối ưu.
Phỏng đoán
Bằng cách gọi hàm sigmoid, chúng tôi có xác suất rằng một số đầu vào X thuộc về lớp 1. Hãy để Lừa lấy tất cả các xác suất ≥ 0,5 = Lớp 1 và tất cả các xác suất = threshold
Để tất cả chúng cùng nhau
class LogisticRegression:
def __init__[self, lr=0.01, num_iter=100000, fit_intercept=True, verbose=False]:
self.lr = lr
self.num_iter = num_iter
self.fit_intercept = fit_interceptdef __add_intercept[self, X]:
intercept = np.ones[[X.shape[0], 1]]
return np.concatenate[[intercept, X], axis=1]def __sigmoid[self, z]:
return 1 / [1 + np.exp[-z]]def __loss[self, h, y]:
return [-y * np.log[h] - [1 - y] * np.log[1 - h]].mean[]def fit[self, X, y]:
if self.fit_intercept:
X = self.__add_intercept[X]# weights initialization
self.theta = np.zeros[X.shape[1]]for i in range[self.num_iter]:
z = np.dot[X, self.theta]
h = self.__sigmoid[z]
gradient = np.dot[X.T, [h - y]] / y.size
self.theta -= self.lr * gradientif[self.verbose == True and i % 10000 == 0]:
z = np.dot[X, self.theta]
h = self.__sigmoid[z]
print[f'loss: {self.__loss[h, y]} \t']def predict_prob[self, X]:
if self.fit_intercept:
X = self.__add_intercept[X]return self.__sigmoid[np.dot[X, self.theta]]
def predict[self, X, threshold]:
return self.predict_prob[X] >= threshold
fit_intercept: Giới thiệu BIAS X0 trong ma trận tính năng
Sự đánh giá
model = LogisticRegression[lr=0.1, num_iter=300000]Fig. 5 - Ranh giới quyết định
%time model.fit[X, y]CPU times: user 13.8 s, sys: 84 ms, total: 13.9 s
Wall time: 13.8 spreds = model.predict[X]
# accuracy
[preds == y].mean[]
1.0##visualizing result
theta = model.coef_[0] # Make theta a 1-d array.
x_decision = np.linspace[X[:,0].min[], X[:,0].max[], 50]
y_decision = -[model.intercept_ + theta[0]*x]/theta[1]#decion boundary
plt.plot[x_decision, y_decision]#data points
clrs = ['b' if[i==0] else 'r' for i in y]
plt.scatter[X[:,0],X[:,-1],c=clrs]
Chọn tỷ lệ học tập = 0,1 và số lần lặp = 300000 Thuật toán đã phân loại tất cả các trường hợp thành công. 13,8 giây là cần thiết. Đây là những trọng lượng kết quả:
model.theta
array[[-25.96818124, 12.56179068, -13.44549335]]
Logisticregression từ sklearn:
model = LogisticRegression[C=1e20]
%time model.fit[X, y]CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 854 µspreds = model.predict[X]
# accuracy
[preds == y].mean[]
1.0model.intercept_, model.coef_
[array[[-80.62725491]], array[[[ 31.61988897, -28.31500665]]]]
C = tham số chính quy nghịch đảo
Nếu chúng tôi đào tạo việc thực hiện của chúng tôi với tỷ lệ học tập nhỏ hơn và nhiều lần lặp lại, chúng tôi sẽ tìm thấy trọng lượng xấp xỉ bằng nhau. Nhưng sự khác biệt đáng chú ý hơn là về thời gian đào tạo, Sklearn là thứ tự cường độ nhanh hơn. Dù sao, không phải là ý định đưa mã này vào sản xuất, đây chỉ là một bài tập đồ chơi với các mục tiêu giảng dạy.
Các bước tiếp theo có thể là việc bổ sung chính quy hóa L2 và phân loại đa lớp.
Mã có sẵn ở đây.