Hướng dẫn multivariate logistic regression python from scratch - hồi quy logistic đa biến python từ đầu

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[]
X = iris.data[:, :2]
y = [iris.target != 0] * 1
Hình 1 - Dữ liệu đào tạo

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.

Tê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

Hình 2 - Hàm logistic. 3 - Giả thuyết, E là nhật ký tự nhiên 2.718 ________ 1

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 ____2

Xuố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 ____3

Sau đó, 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_intercept

def __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 * gradient

if[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]
%time model.fit[X, y]
CPU times: user 13.8 s, sys: 84 ms, total: 13.9 s
Wall time: 13.8 s
preds = 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]
Fig. 5 - Ranh giới quyết định

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 µs
preds = model.predict[X]
# accuracy
[preds == y].mean[]
1.0
model.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.

Bài Viết Liên Quan

Chủ Đề