File size: 6,161 Bytes
662d38c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | '''
Logistic Regression là một mô hình học có giám sát (supervised learning) dùng cho bài toán phân loại (classification).
Nó dựa trên Linear Regression, nhưng thay vì dự đoán giá trị liên tục → nó biến đầu ra thành xác suất (0–1) bằng hàm sigmoid.
🧠 2. CÔNG THỨC TOÁN HỌC
2.1. Linear part
Trước hết, ta tính tổng có trọng số:
z = w0 + w1x1 + w2x2 + w3x3 + ... + wnxn
2.2 Áp dụng hàm Sigmoid
y^ = σ(z) = 1 / 1 + e^-z
=> Kết quả y^ nằm trong khoảng (0,1) hiểu là xác xuất đối tượng thuộc lớp 1.
📊 3. QUYẾT ĐỊNH PHÂN LOẠI
Nếu:
y^ >= 0.5 ==> dự đoán 1
y^ < 0.5 ==> dự đoán 0
⚙️ 4. HÀM MẤT MÁT (LOSS FUNCTION)
Ta dùng Binary Cross-Entropy Loss (Log Loss):
J(w) = -1/m ∑[y^(i)log(y^^(i)) + (1-y^(i))log(1-y^^(i))]
Mục tiêu: tối thiểu hóa J(w) → tìm bộ trọng số w tốt nhất.
5. QUÁ TRÌNH HỌC (TRAINING)
Dùng Gradient Descent để cập nhật trọng số:
w := w - α * ∂J/∂w # Trong đó: α là learning rate.
'''
# 💻 6. CODE MẪU PYTHON
# Thư viện sử dụng cho Logistic Regression
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# Dữ liệu ví dụ
data = pd.DataFrame({
'hours_studied': [1,2,3,4,5,6,7,8,9,10],
'pass_exam': [0,0,0,0,0,1,1,1,1,1]
})
X = data[['hours_studied']]
y = data['pass_exam']
# Chia dữ liệu
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Huấn luyện mô hình
model = LogisticRegression()
model.fit(X_train, y_train)
# Dự đoán
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
print("Classification Report:\n", classification_report(y_test, y_pred))
# 📈 Ứng dụng thực tế của Logistic Regression
'''
Lĩnh vực Ứng dụng
y học Dự đoán bệnh(có/không)
Email Phân loại spam/không spam
Marketing Khách hàng mua/không mua
Tài chính Dự đoán vỡ nợ/không vỡ nợ
Nhận dạng Có khuôn mặt/không có khuôn mặt
'''
# 🧠 Trực quan hóa hàm Sigmoid
z = np.linspace(-10, 10, 100)
sigmoid = 1 / (1 + np.exp(-z))
plt.plot(z, sigmoid)
plt.title('Sigmoid Function')
plt.xlabel('z')
plt.ylabel('σ(z)')
plt.grid()
plt.show()
''' → Đồ thị cong từ 0 → 1, giúp chuyển hóa giá trị tuyến tính thành xác suất. '''
'''
🧩 9. ƯU ĐIỂM & NHƯỢC ĐIỂM
✅ Ưu điểm
Đơn giản, dễ huấn luyện
Dễ hiểu, giải thích rõ ràng
Hiệu quả cho dữ liệu tuyến tính
⚠️ Nhược điểm
Kém hiệu quả với dữ liệu phi tuyến
Không xử lý tốt nhiều lớp phức tạp (multi-class → phải dùng One-vs-Rest)
Giả định quan hệ tuyến tính giữa biến độc lập và log-odds
🧪 10. MỞ RỘNG
Multinomial Logistic Regression → cho phân loại nhiều lớp
Regularization (L1, L2) → chống overfitting
Feature scaling → nên chuẩn hóa dữ liệu trước khi huấn luyện
'''
# 🚀 Ứng dụng Nhỏ- Dự Đoán xác xuất Thi Đậu
hours = np.array([[7]])
pred = model.predict_proba(hours)
print(f"Xác suất đậu: {pred[0][1]*100:.2f}%")
# 🧩 12. SO SÁNH VỚI LINEAR REGRESSION
'''
Đặc điểm Linear Regression Logistic Regression
Đầu ra Giá trị liên tục Xác suất (0–1)
Bài toán Dự đoán (Regression) Phân loại (Classification)
Hàm kích hoạt Không có Sigmoid
Hàm mất mát MSE Log Loss
'''
# LOGISTIC REGRESSION (Dùng thư viện đơn giản)
import numpy as np
import matplotlib.pyplot as plt
# Set up styling for Matplotlib
plt.style.use('ggplot')
# Create dataset
dataset = np.array([
[-10, 0],
[-5, 0],
[-7, 0],
[0, 0],
[-2, 0],
[5, 1],
[7, 1],
[6, 1],
[10, 1],
[15, 1],
[9, 1]
])
# Draw the dataset
negative_class = dataset[:5]
positive_class = dataset[5:]
# Draw the negative first and positive
plt.scatter(negative_class[:, 0], negative_class[:, 1], c='y', label='Class 0')
plt.scatter(positive_class[:, 0], positive_class[:, 1], c='g', label='Class 1')
plt.legend()
plt.show()
# -------------------- Logistic Regression Functions --------------------
def get_prediction(m, b, x):
"""
Get the predictions: y_hat using the input
"""
return 1 / (1 + np.exp(-(m * x + b))) # ✅ Sửa công thức sigmoid
def get_cost(y, y_hat):
"""
Get the value of the cost function
"""
k = y.shape[0]
return (-1 / k) * np.sum(y * np.log(y_hat) + (1 - y) * np.log(1 - y_hat))
def get_gradient(m, b, x, y, y_hat):
"""
Return the gradient of the loss function w.r.t m and b
"""
k = y.shape[0]
dm = (1 / k) * np.sum((y_hat - y) * x)
db = (1 / k) * np.sum(y_hat - y)
return dm, db
def get_accuracy(y, y_hat):
return ((y_hat >= 0.5).astype(int) == y).sum() / y.shape[0] # ✅ Sửa chia đúng mẫu
# -------------------- Gradient Descent --------------------
m = 1.0
b = 10.0
iterations = 200
lr = 0.03
x = dataset[:, 0]
y = dataset[:, 1]
costs = []
for it in range(iterations):
y_hat = get_prediction(m, b, x)
cost = get_cost(y, y_hat)
accuracy = get_accuracy(y, y_hat)
print(f"Iteration {it} - Cost: {cost:.4f}, Accuracy: {accuracy:.4f}")
dm, db = get_gradient(m, b, x, y, y_hat) # ✅ Sửa dn → db
m -= lr * dm
b -= lr * db
costs.append(cost)
# Plot cost over iterations
plt.plot(costs)
plt.xlabel("Iteration")
plt.ylabel("Cost")
plt.title("Cost Function over Time")
plt.show()
|