逻辑回归是一种广泛应用于分类问题的统计学习方法,尽管名字中带有“回归”,但它主要用于解决二分类问题,当然也可以扩展到多分类问题。在实际应用中,逻辑回归因其简单高效、易于解释等优点,被广泛应用于信用评估、疾病诊断、市场营销等众多领域。本文将详细介绍逻辑回归的原理,并给出其代码实现。
线性回归的模型可以表示为 $z = \theta_0 + \theta_1x_1 + \theta_2x_2 + \cdots + \theta_nx_n$,其中 $\theta$ 是模型的参数,$x$ 是输入特征。线性回归的输出是连续值,而逻辑回归要解决的是分类问题,需要将线性回归的输出映射到一个概率值(0 到 1 之间)。
逻辑回归引入了 sigmoid 函数,其表达式为:$\sigma(z)=\frac{1}{1 + e^{-z}}$。sigmoid 函数的图像是一个 S 形曲线,它可以将任意实数输入映射到 (0, 1) 区间。当 $z$ 趋近于正无穷时,$\sigma(z)$ 趋近于 1;当 $z$ 趋近于负无穷时,$\sigma(z)$ 趋近于 0。逻辑回归模型可以表示为:$h_{\theta}(x)=\sigma(\theta^Tx)=\frac{1}{1 + e^{-\theta^Tx}}$,其中 $\theta^Tx$ 就是线性回归的输出。
逻辑回归使用对数损失函数(也称为交叉熵损失函数),对于单个样本 $(x^{(i)}, y^{(i)})$,其损失函数为:
综合起来,对于 $m$ 个样本的数据集,损失函数为:$J(\theta)=-\frac{1}{m}\sum{i = 1}^{m}[y^{(i)}\log(h{\theta}(x^{(i)}))+(1 - y^{(i)})\log(1 - h_{\theta}(x^{(i)}))]$
为了找到使损失函数 $J(\theta)$ 最小的参数 $\theta$,常用的优化算法是梯度下降法。梯度下降法的更新公式为:$\theta_j:=\theta_j-\alpha\frac{\partial J(\theta)}{\partial \theta_j}$,其中 $\alpha$ 是学习率。
import numpy as np
class LogisticRegression:
def __init__(self, learning_rate=0.01, num_iterations=1000):
self.learning_rate = learning_rate
self.num_iterations = num_iterations
self.weights = None
self.bias = None
def sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def fit(self, X, y):
num_samples, num_features = X.shape
self.weights = np.zeros(num_features)
self.bias = 0
for _ in range(self.num_iterations):
linear_model = np.dot(X, self.weights) + self.bias
y_pred = self.sigmoid(linear_model)
dw = (1 / num_samples) * np.dot(X.T, (y_pred - y))
db = (1 / num_samples) * np.sum(y_pred - y)
self.weights -= self.learning_rate * dw
self.bias -= self.learning_rate * db
def predict(self, X):
linear_model = np.dot(X, self.weights) + self.bias
y_pred = self.sigmoid(linear_model)
y_pred_cls = [1 if i > 0.5 else 0 for i in y_pred]
return np.array(y_pred_cls)
# 生成一些示例数据
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=10, n_informative=5, n_redundant=0, 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.01, num_iterations=1000)
# 训练模型
model.fit(X_train, y_train)
# 进行预测
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
在 __init__
方法中,我们初始化了学习率 learning_rate
和迭代次数 num_iterations
,并将权重 weights
和偏置 bias
初始化为 None
。
sigmoid
方法实现了 sigmoid 函数,用于将线性回归的输出映射到概率值。
fit
方法实现了模型的训练过程。首先,我们初始化权重和偏置。然后,在指定的迭代次数内,计算线性模型的输出,通过 sigmoid 函数得到预测概率,计算损失函数的梯度,并更新权重和偏置。
predict
方法实现了模型的预测过程。根据训练得到的权重和偏置,计算线性模型的输出,通过 sigmoid 函数得到预测概率,将概率大于 0.5 的样本预测为 1,否则预测为 0。
要点 | 详情 |
---|---|
原理 | 逻辑回归通过 sigmoid 函数将线性回归的输出映射到概率值,使用对数损失函数和梯度下降法进行优化。 |
代码实现 | 使用 Python 实现了一个简单的逻辑回归类,包括初始化、sigmoid 函数、训练和预测方法。 |
优点 | 简单高效、易于解释,适用于二分类问题。 |
局限性 | 对于复杂的非线性问题,逻辑回归的表现可能不佳。 |
逻辑回归是一种基础且实用的分类算法,通过本文的介绍和代码实现,你可以更好地理解逻辑回归的原理,并在实际问题中应用它。在实际应用中,还可以使用更高级的优化算法和正则化方法来提高模型的性能。