逻辑回归是一种用于二分类任务的线性模型,通过sigmoid函数将线性回归的输出映射到0到1之间,得到样本属于正类的概率,在Python中可以通过多种方式实现。

逻辑回归的基本原理
逻辑回归的核心是sigmoid函数,其公式为:
σ(z) = 1 / (1 + e^(-z))
其中z是线性回归的输出z = w^T * x + b,w是权重向量,b是偏置项,x是输入特征。当σ(z) >= 0.5时,预测样本为正类,否则为负类。
使用Python原生实现逻辑回归
1. 定义sigmoid函数
首先实现sigmoid函数,将线性输出转换为概率值:
import numpy as np
def sigmoid(z):
# 避免z过大导致指数溢出,做截断处理
z = np.clip(z, -500, 500)
return 1 / (1 + np.exp(-z))
2. 定义损失函数与梯度
逻辑回归的损失函数采用交叉熵损失,公式如下:
L(w,b) = -1/m * Σ[y_i * log(σ(z_i)) + (1-y_i) * log(1-σ(z_i))]
对应的梯度为:
∂L/∂w = 1/m * X^T * (σ(z) - y)
∂L/∂b = 1/m * Σ(σ(z_i) - y_i)
实现损失计算和梯度计算的函数:
def compute_loss(y_true, y_pred):
# 避免对数计算出现无穷大,对预测值做截断
y_pred = np.clip(y_pred, 1e-15, 1 - 1e-15)
m = len(y_true)
loss = -1/m * np.sum(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
return loss
def compute_gradient(X, y_true, y_pred):
m = len(y_true)
dw = 1/m * X.T.dot(y_pred - y_true)
db = 1/m * np.sum(y_pred - y_true)
return dw, db
3. 训练逻辑回归模型
使用梯度下降法迭代更新参数,直到损失收敛:
class LogisticRegression:
def __init__(self, learning_rate=0.01, max_iter=1000, tol=1e-4):
self.lr = learning_rate
self.max_iter = max_iter
self.tol = tol
self.w = None
self.b = None
def fit(self, X, y):
m, n = X.shape
# 初始化参数
self.w = np.zeros(n)
self.b = 0
prev_loss = None
for i in range(self.max_iter):
# 计算线性输出和预测概率
z = X.dot(self.w) + self.b
y_pred = sigmoid(z)
# 计算损失
loss = compute_loss(y, y_pred)
# 检查损失是否收敛
if prev_loss is not None and abs(prev_loss - loss) < self.tol:
print(f"迭代{i}次后损失收敛")
break
prev_loss = loss
# 计算梯度并更新参数
dw, db = compute_gradient(X, y, y_pred)
self.w -= self.lr * dw
self.b -= self.lr * db
def predict(self, X):
z = X.dot(self.w) + self.b
y_pred_prob = sigmoid(z)
# 概率大于等于0.5预测为1,否则为0
return (y_pred_prob >= 0.5).astype(int)
4. 测试原生实现的逻辑回归
使用sklearn自带的数据集验证模型效果:
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 生成二分类数据集
X, y = make_classification(n_samples=1000, n_features=5, n_informative=3, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练模型
model = LogisticRegression(learning_rate=0.1, max_iter=2000)
model.fit(X_train, y_train)
# 预测并计算准确率
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"原生实现逻辑回归测试集准确率:{acc:.4f}")
使用sklearn库快速实现逻辑回归
sklearn封装了完善的逻辑回归实现,无需手动编写梯度下降等底层逻辑,使用起来更加便捷:
from sklearn.linear_model import LogisticRegression as SklearnLR
from sklearn.metrics import classification_report
# 初始化模型,solver选择梯度下降优化器
sk_model = SklearnLR(solver='sag', max_iter=1000, random_state=42)
# 训练模型
sk_model.fit(X_train, y_train)
# 预测
sk_y_pred = sk_model.predict(X_test)
# 输出分类报告
print("sklearn逻辑回归分类报告:")
print(classification_report(y_test, sk_y_pred))
逻辑回归的注意事项
- 逻辑回归对特征的尺度敏感,训练前建议对特征做标准化处理,加快梯度下降的收敛速度。
- 如果类别不平衡,可以通过调整
class_weight参数给少数类更高的权重,提升模型对少数类的识别能力。 - 正则化参数
C可以控制模型的复杂度,C越小正则化越强,能够缓解过拟合问题。
逻辑回归虽然结构简单,但可解释性强,在金融风控、用户流失预测等场景中应用广泛,是入门机器学习分类任务的首选模型之一。