Hồi quy logistic python từ đầu github

Phân loại là một trong hai nhánh của Học có giám sát. Như tên gợi ý, nó chia các đối tượng thành các nhóm hoặc lớp dựa trên các tính năng của chúng

Hồi quy logistic là một trong những thuật toán Phân loại được sử dụng nhiều nhất. Trong bài báo này, tôi sẽ trình bày việc triển khai Python của thuật toán. Nó sẽ tiếp tục từng bước và chúng tôi sẽ xây dựng thuật toán từ đầu

Bây giờ hãy đi sâu vào mã

1. Tải và chuẩn bị dữ liệu

Ban đầu, mô-đun pandas sẽ được nhập và tệp csv chứa tập dữ liệu sẽ được đọc bằng cách sử dụng “read_csv” và 10 hàng đầu tiên sẽ được in ra bằng chức năng “head”

import pandas as pddf = pd.read_csv('Social_Network_Ads.csv')
print(df.head(10))

Nhìn vào tập dữ liệu, mục tiêu của thuật toán là thời tiết khách hàng có mua sản phẩm hay không. Đó là lý do tại sao nó sẽ là giá trị y

Trong số các tính năng đã cho, “ID người dùng” không thể có bất kỳ ảnh hưởng nào, vì nó không có bất kỳ ảnh hưởng nào đến việc khách hàng mua sản phẩm. Trong trường hợp này, chúng tôi còn lại 3 tính năng. Giới tính, độ tuổi và mức lương ước tính. Ba tính năng này sẽ là giá trị X

X = df[['Gender', 'Age', 'EstimatedSalary']]
y = df['Purchased']

Bây giờ, bộ dữ liệu X và y sẽ trông như bên dưới

Giống như trong Hồi quy tuyến tính, chúng ta cũng có thuật ngữ sai lệch trong Hồi quy logistic. Theo cách này, một cột gồm những cái sẽ được thêm vào đầu X. Bởi vì nó sẽ rất tiện dụng trong phép nhân ma trận

Ở đây, “m” là số hàng trong tập dữ liệu

import numpy as npm = X.shape[0]
a = np.ones((m, 1))
X.insert(loc = 0, column = 'Ones', value = a)

Vì chúng tôi có dữ liệu phân loại (Giới tính) trong số các đối tượng địa lý liên tục, chúng tôi cần xử lý dữ liệu đó bằng các biến giả. Khi sử dụng biến giả, nếu có (n) loại thì (n-1) biến sẽ đủ để chuyển thành dữ liệu liên tục. Trong trường hợp của chúng tôi, cột “Gender_Male” sẽ được tạo và nếu giá trị là “1” thì có nghĩa là nam và ngược lại, nếu là “0” thì có nghĩa là nữ

X.loc[X['Gender'] == 'Male', 'Gender_Male'] = 1         #1 if male
X.loc[X['Gender'] == 'Female', 'Gender_Male'] = 0 #0 if female
del X['Gender'] #delete intial gender column

Ngoài ra, thang đo của các cột Lương và Tuổi không gần nhau và điều này sẽ gây ra các vấn đề nghiêm trọng đối với độ chính xác của mô hình. Chúng tôi sẽ sử dụng một kỹ thuật nhân rộng tính năng được gọi là tiêu chuẩn hóa

Nơi đây,

  • x̅ là giá trị trung bình;
  • σ là độ lệch chuẩn
age_std = X['Age'].std()
age_ave = X['Age'].mean()
sala_std = X['EstimatedSalary'].std()
sala_ave = X['EstimatedSalary'].mean()
X['Age'] = (X['Age'].subtract(age_ave)).divide(age_std)
X['EstimatedSalary'] =(X['EstimatedSalary'].subtract(sala_ave)).divide(sala_std)

Như thường lệ, chúng tôi chia tập dữ liệu của mình thành tập kiểm tra và tập huấn luyện

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

Cho đến bây giờ, công việc đã được thực hiện trên khung dữ liệu gấu trúc, vì chúng tôi chỉ cần sửa đổi tập dữ liệu. Nhưng bây giờ, khi chúng tôi bắt đầu thực hiện các phép toán trên tập dữ liệu, chúng tôi chuyển đổi các khung dữ liệu gấu trúc thành các mảng có nhiều mảng. Vì lý do, các mảng có nhiều mảng có tốc độ tính toán tốt hơn và chúng cung cấp khả năng biến đổi lớn cho các hoạt động của ma trận

X_train, X_test, y_train, y_test = X_train.to_numpy(), X_test.to_numpy(), y_train.to_numpy(), y_test.to_numpy()
2. Chức năng

Hàm sigmoid nhận đầu vào và chỉ trả về đầu ra trong khoảng từ 0 đến 1. Trong Hồi quy logistic, bạn tính xác suất của một mẫu trong một lớp và xác suất được biểu thị bằng một số từ 0 đến 1. Do đó, hàm Sigmoid là một trong những hàm chính trong Hồi quy logistic

def sigmoid(z):
return (1/(1+np.exp(-z)))

Giả thuyết trong Hồi quy logistic giống như Hồi quy tuyến tính, nhưng có một điểm khác biệt. Ở đây trong Hồi quy logistic, đầu ra của các giả thuyết chỉ được mong muốn trong khoảng từ 0 đến 1. Bởi vì nó cho thấy xác suất của một đối tượng thuộc một lớp nhất định và xác suất không thể nhỏ hơn 0 hoặc lớn hơn 1. Với mục đích này, hàm Sigmoid được sử dụng, đây là điểm khác biệt với giả thuyết trong Hồi quy tuyến tính

“matmul” là một chức năng của mô-đun numpy và nó dùng để nhân ma trận

________số 8

Hàm chi phí xác định mức độ phù hợp của mô hình với tập dữ liệu. Nếu độ lớn của nó cao, điều đó có nghĩa là mô hình không phù hợp với tập dữ liệu, nếu nó thấp, điều đó có nghĩa là mô hình vẫn ổn để sử dụng. Do đó, các thuật toán tối ưu hóa cố gắng giảm thiểu giá trị của hàm chi phí, hay nói cách khác là cố gắng khớp mô hình với tập dữ liệu tốt hơn

Nếu chúng ta quay lại Hồi quy tuyến tính, hàm chi phí của nó là

Nếu cùng một hàm chi phí được sử dụng trong Hồi quy logistic, chúng ta sẽ có một hàm không lồi và việc giảm độ dốc sẽ không thể tối ưu hóa nó, vì sẽ có nhiều hơn một cực tiểu. Lý do không lồi là hàm sigmoid được sử dụng để tính toán giả thuyết là hàm phi tuyến. Vì vậy, chúng tôi sẽ sử dụng một hàm chi phí khác

def cost_function(X, y, theta, m): y = y.reshape(y.shape[0], 1)
H = h(theta, X)
return (sum((y)*np.log(H) + (1-y)*np.log(1-H))) / (-m)

Vai trò của hệ số giảm dần là tối ưu hóa các tham số theta. Phương trình của nó bắt nguồn từ đạo hàm của hàm chi phí. Nó tương tự như trong Hồi quy tuyến tính, nhưng vì hàm giả thuyết khác nên các hàm giảm độ dốc này không giống nhau

Để đơn giản, mã đã được viết từng bước với các hoạt động riêng biệt. Bạn có thể dễ dàng làm theo phương trình

X = df[['Gender', 'Age', 'EstimatedSalary']]
y = df['Purchased']
0

Trong thuật toán, việc giảm độ dốc chạy nhiều lần, chính xác là theo số lần lặp lại. Sau một số lần lặp lại, giá trị của hàm chi phí giảm và bạn nên xem giá trị của hàm chi phí. Vì sau một thời điểm nhất định, giá trị của hàm chi phí không thay đổi hoặc thay đổi với một lượng cực kỳ nhỏ. Trong trường hợp này, việc chạy đi chạy lại độ dốc giảm dần sau thời điểm đó là vô ích và bạn giảm số lần lặp lại trong lần thử tiếp theo

Do đó, chúng tôi kết hợp tất cả các hành động này — để xác định số lần lặp lại, để chọn sau bao nhiêu lần lặp lại mà bạn muốn xem kết quả trả về của hàm chi phí, gọi hàm giảm dần độ dốc, thành một hàm và hàm này được gọi là hàm đào tạo

X = df[['Gender', 'Age', 'EstimatedSalary']]
y = df['Purchased']
1

Hàm Predict lấy theta và X làm đầu vào và trả về “0” hoặc “1” bằng cách so sánh câu trả lời của giả thuyết (h) với ngưỡng. Nói chung, ngưỡng được chọn 0. 5, nhưng nó có thể được đặt thành bất kỳ giá trị mong muốn nào trong hàm

X = df[['Gender', 'Age', 'EstimatedSalary']]
y = df['Purchased']
2

Hàm Score dùng để tính toán độ chính xác của mô hình. “y1” là câu trả lời đã cho trong tập dữ liệu, “y2” là câu trả lời mà mô hình đã tính toán. Chức năng điểm số so sánh chúng và tìm ra bao nhiêu phần trăm câu trả lời đã được dự đoán chính xác

Tôi đã sử dụng cổng xnor, trả về 1, nếu các giá trị giống nhau và trả về 0, nếu chúng không bằng nhau

X = df[['Gender', 'Age', 'EstimatedSalary']]
y = df['Purchased']
33. Khởi tạo tham số và gọi hàm

Để khởi tạo theta, chúng ta cần biết số lượng tính năng giống với số lượng cột trong tập dữ liệu. Mặt khác, số lượng mẫu là cần thiết trong quá trình giảm dần độ dốc. Vì vậy, chúng tôi tìm thấy cả hai giá trị này bằng hàm hình dạng, trả về số lượng hàng và cột trong mảng có nhiều mảng

X = df[['Gender', 'Age', 'EstimatedSalary']]
y = df['Purchased']
4

Theta vector chứa các tham số sẽ được thuật toán tối ưu hóa. Số lượng phần tử phải giống với số lượng tính năng, đó là lý do tại sao chúng tôi khởi tạo nó với “n” hàng số 0

Số lần lặp ban đầu được xác định một giá trị khoảng 3000 và bằng cách xem giá trị của hàm Chi phí, sau này bạn có thể giảm hoặc tăng nó. nếu hàm Cost không giảm nữa thì không cần chạy đi chạy lại thuật toán nên ta đặt số lần lặp ít hơn. Mặt khác, nếu hàm Chi phí vẫn ít hơn, bạn có thể tăng số lần lặp lại và quan sát xem nó có cải thiện hiệu suất mô hình hay không

Alpha là tốc độ học của thuật toán. Giá trị của nó thay đổi giữa 0. 001 và 10. Một lần nữa, không có con số chính xác nào là tối ưu cho mọi mô hình. Bạn cần quan sát xem giá trị nào phù hợp với mô hình của bạn

X = df[['Gender', 'Age', 'EstimatedSalary']]
y = df['Purchased']
5

Vì tất cả các giá trị cần thiết hiện đã được đặt, cuối cùng chúng ta có thể chạy chương trình

Ở đây, hàm đào tạo trả về vectơ theta được tối ưu hóa bằng cách sử dụng tập huấn luyện và vectơ theta được sử dụng để dự đoán câu trả lời trong tập kiểm tra. Sau đó, chúng tôi trả lại điểm số để xem mô hình của chúng tôi đã hoạt động tốt như thế nào

X = df[['Gender', 'Age', 'EstimatedSalary']]
y = df['Purchased']
6

Bộ dữ liệu và toàn bộ mã. https. //github. com/anarabiyev/Logistic-Regression-Python-triển khai-từ-đầu