Giải thuật phân loại - Hồi quy logistic

Giới thiệu về hồi quy logistic

Hồi quy logistic là một thuật toán phân loại học có giám sát được sử dụng để dự đoán xác suất của một biến mục tiêu. Bản chất của biến đích hoặc biến phụ thuộc là phân đôi, có nghĩa là chỉ có thể có hai lớp.

Nói một cách đơn giản, biến phụ thuộc có bản chất là nhị phân có dữ liệu được mã hóa là 1 (viết tắt của thành công / có) hoặc 0 (viết tắt của thất bại / không).

Về mặt toán học, mô hình hồi quy logistic dự đoán P (Y = 1) là một hàm của X. Đây là một trong những thuật toán ML đơn giản nhất có thể được sử dụng cho các vấn đề phân loại khác nhau như phát hiện thư rác, dự đoán bệnh tiểu đường, phát hiện ung thư, v.v.

Các loại hồi quy logistic

Nói chung, hồi quy logistic có nghĩa là hồi quy logistic nhị phân có các biến mục tiêu nhị phân, nhưng có thể có thêm hai loại biến mục tiêu có thể được dự đoán bởi nó. Dựa trên số lượng các loại đó, hồi quy Logistic có thể được chia thành các loại sau:

Nhị phân hoặc nhị thức

Trong kiểu phân loại như vậy, một biến phụ thuộc sẽ chỉ có hai kiểu khả dĩ là 1 và 0. Ví dụ, những biến này có thể đại diện cho thành công hoặc thất bại, có hoặc không, thắng hoặc thua, v.v.

Đa thức

Trong cách phân loại như vậy, biến phụ thuộc có thể có 3 hoặc nhiều hơn các kiểu không có thứ tự hoặc các kiểu không có ý nghĩa định lượng. Ví dụ: các biến này có thể đại diện cho “Loại A” hoặc “Loại B” hoặc “Loại C”.

Bình thường

Trong kiểu phân loại như vậy, biến phụ thuộc có thể có 3 kiểu có thứ tự trở lên hoặc kiểu có ý nghĩa định lượng. Ví dụ: các biến này có thể đại diện cho “kém” hoặc “tốt”, “rất tốt”, “Xuất sắc” và mỗi loại có thể có các điểm như 0,1,2,3.

Các giả định hồi quy logistic

Trước khi đi sâu vào việc triển khai hồi quy logistic, chúng ta phải nhận thức được các giả định sau đây về cùng một:

  • Trong trường hợp hồi quy logistic nhị phân, các biến mục tiêu phải luôn luôn là nhị phân và kết quả mong muốn được biểu thị bằng cấp nhân tố 1.

  • Không nên có bất kỳ đa cộng tuyến nào trong mô hình, có nghĩa là các biến độc lập phải độc lập với nhau.

  • Chúng ta phải đưa các biến có ý nghĩa vào mô hình của mình.

  • Chúng ta nên chọn cỡ mẫu lớn cho hồi quy logistic.

Mô hình hồi quy logistic nhị phân

Hình thức đơn giản nhất của hồi quy logistic là hồi quy logistic nhị phân hoặc nhị thức trong đó biến mục tiêu hoặc biến phụ thuộc chỉ có thể có 2 loại có thể là 1 hoặc 0. Nó cho phép chúng ta mô hình hóa mối quan hệ giữa nhiều biến dự báo và biến mục tiêu nhị phân / nhị thức. Trong trường hợp hồi quy logistic, hàm tuyến tính về cơ bản được sử dụng làm đầu vào cho một hàm khác, chẳng hạn như trong quan hệ sau:

$$ h _ {\ theta} {(x)} = g (\ theta ^ {T} x) ℎ 0≤h _ {\ theta} ≤1 $$

Đây là hàm logistic hoặc hàm sigmoid có thể được đưa ra như sau:

$$ g (z) = \ frac {1} {1 + e ^ {- z}} ℎ = \ theta ^ {T} $$

Đường cong sigmoid có thể được biểu diễn với sự trợ giúp của đồ thị sau. Chúng ta có thể thấy các giá trị của trục y nằm giữa 0 và 1 và cắt trục ở 0,5.

Các lớp có thể được chia thành tích cực hoặc tiêu cực. Đầu ra theo xác suất của lớp dương nếu nó nằm trong khoảng từ 0 đến 1. Đối với việc triển khai của chúng tôi, chúng tôi đang diễn giải đầu ra của hàm giả thuyết là dương nếu nó ≥0,5, ngược lại là âm.

Chúng ta cũng cần xác định một hàm mất mát để đo lường thuật toán hoạt động tốt như thế nào bằng cách sử dụng trọng số trên các hàm, được đại diện bởi theta như sau:

ℎ = ()

$$ J (\ theta) = \ frac {1} {m}. (- y ^ {T} log (h) - (1 -y) ^ Tlog (1-h)) $$

Bây giờ, sau khi xác định hàm mất mát, mục tiêu chính của chúng ta là giảm thiểu hàm mất mát. Nó có thể được thực hiện với sự trợ giúp của việc lắp các quả nặng có nghĩa là bằng cách tăng hoặc giảm khối lượng. Với sự trợ giúp của các dẫn xuất của hàm giảm theo từng trọng lượng, chúng ta sẽ có thể biết thông số nào nên có trọng lượng cao và thông số nào nên có trọng lượng nhỏ hơn.

Phương trình giảm độ dốc sau đây cho chúng ta biết tổn thất sẽ thay đổi như thế nào nếu chúng ta sửa đổi các thông số:

$$ \ frac {()} {\ theta_ {j}} = \ frac {1} {m} X ^ {T} (() -) $$

Triển khai bằng Python

Bây giờ chúng ta sẽ triển khai khái niệm hồi quy logistic nhị thức ở trên trong Python. Với mục đích này, chúng tôi đang sử dụng tập dữ liệu hoa đa biến có tên 'iris', có 3 lớp, mỗi lớp 50 trường hợp, nhưng chúng tôi sẽ sử dụng hai cột tính năng đầu tiên. Mỗi lớp đại diện cho một loại hoa diên vĩ.

Đầu tiên, chúng ta cần nhập các thư viện cần thiết như sau:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets

Tiếp theo, tải tập dữ liệu mống mắt như sau:

iris = datasets.load_iris()
X = iris.data[:, :2]
y = (iris.target != 0) * 1

Chúng ta có thể vẽ biểu đồ dữ liệu đào tạo của mình như sau:

plt.figure(figsize=(6, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='g', label='0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='y', label='1')
plt.legend();

Tiếp theo, chúng ta sẽ xác định hàm sigmoid, hàm mất mát và giảm dần gradient như sau:

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
      self.verbose = verbose
   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)

Bây giờ, khởi tạo các trọng số như sau:

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
      z = np.dot(X, self.theta)
      h = self.__sigmoid(z)
      loss = self.__loss(h, y)
      if(self.verbose ==True and i % 10000 == 0):
         print(f'loss: {loss} \t')

Với sự trợ giúp của tập lệnh sau, chúng ta có thể dự đoán các xác suất đầu ra -

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):
   return self.predict_prob(X).round()

Tiếp theo, chúng ta có thể đánh giá mô hình và vẽ biểu đồ như sau:

model = LogisticRegression(lr=0.1, num_iter=300000)
preds = model.predict(X)
(preds == y).mean()

plt.figure(figsize=(10, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='g', label='0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='y', label='1')
plt.legend()
x1_min, x1_max = X[:,0].min(), X[:,0].max(),
x2_min, x2_max = X[:,1].min(), X[:,1].max(),
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
grid = np.c_[xx1.ravel(), xx2.ravel()]
probs = model.predict_prob(grid).reshape(xx1.shape)
plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='red');

Mô hình hồi quy logistic đa thức

Một dạng hồi quy logistic hữu ích khác là hồi quy logistic đa thức trong đó biến mục tiêu hoặc biến phụ thuộc có thể có 3 hoặc nhiều hơn các kiểu không có thứ tự có thể có, tức là các kiểu không có ý nghĩa định lượng.

Triển khai bằng Python

Bây giờ chúng ta sẽ triển khai khái niệm hồi quy logistic đa thức ở trên trong Python. Vì mục đích này, chúng tôi đang sử dụng tập dữ liệu từ chữ số có tên sklearn.

Đầu tiên, chúng ta cần nhập các thư viện cần thiết như sau:

Import sklearn
from sklearn import datasets
from sklearn import linear_model
from sklearn import metrics
from sklearn.model_selection import train_test_split

Tiếp theo, chúng ta cần tải tập dữ liệu chữ số -

digits = datasets.load_digits()

Bây giờ, hãy xác định ma trận đặc trưng (X) và vectơ phản hồi (y) như sau:

X = digits.data
y = digits.target

Với sự trợ giúp của dòng mã tiếp theo, chúng ta có thể chia X và y thành các tập huấn luyện và thử nghiệm -

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=1)

Bây giờ tạo một đối tượng của hồi quy logistic như sau:

digreg = linear_model.LogisticRegression()

Bây giờ, chúng ta cần huấn luyện mô hình bằng cách sử dụng các tập huấn luyện như sau:

digreg.fit(X_train, y_train)

Tiếp theo, đưa ra các dự đoán về bộ thử nghiệm như sau:

y_pred = digreg.predict(X_test)

Tiếp theo in độ chính xác của mô hình như sau:

print("Accuracy of Logistic Regression model is:",
metrics.accuracy_score(y_test, y_pred)*100)

Đầu ra

Accuracy of Logistic Regression model is: 95.6884561891516

Từ kết quả trên, chúng ta có thể thấy độ chính xác của mô hình của chúng tôi là khoảng 96%.