介绍
逻辑回归是一种常用的分类算法,用于将观测值分配到两个或多个离散的类别之一。它广泛应用于多个领域,包括医学、社会科学和金融等领域。逻辑回归模型可以通过训练数据集来学习自变量和因变量之间的关系,然后使用该模型进行预测。
本文将详细介绍逻辑回归分类任务的算法原理、公式推导、计算步骤以及提供一个复杂的Python代码示例来说明。
算法原理
逻辑回归模型是建立在逻辑函数(sigmoid函数)的基础上的。该函数将输入转化为输出的概率值,范围在0到1之间。逻辑函数的形式如下所示:
$$
f(x) = \frac{1}{1 + e^{-x}}
$$
在逻辑回归中,我们通过将逻辑函数的输出与阈值进行比较来做出分类决策,通常将概率大于等于0.5的观测值分配给正类别,概率小于0.5的观测值分配给负类别。
公式推导
假设我们有一个包含n个自变量的训练数据集,记为X,以及对应的输出变量(目标变量)Y。 逻辑回归模型的基本公式可以表示为:
$$
h_{\theta}(x) = g(\theta^Tx)
$$
其中,h是逻辑回归模型的猜测函数,g是逻辑函数(sigmoid函数),$\theta$是模型参数向量,x是输入特征向量。
我们的目标是通过拟合训练数据中的参数$\theta$来最大化似然函数,从而得到最优的逻辑回归模型。似然函数的形式如下所示:
$$
L(\theta) = \prod_{i=1}^m h_{\theta}(x^{(i)})^{y^{(i)}} \cdot (1 – h_{\theta}(x^{(i)}))^{1-y^{(i)}}
$$
为了方便计算,我们通常使用对数似然函数(Log Likelihood Function)来代替似然函数:
$$
l(\theta) = \sum_{i=1}^m y^{(i)} \log(h_{\theta}(x^{(i)})) + (1-y^{(i)}) \log(1 – h_{\theta}(x^{(i)}))
$$
为了最大化对数似然函数,我们可以使用梯度下降法来求解模型参数。梯度下降法的目标是不断调整参数$\theta$,使得对数似然函数的值达到最大化。
计算步骤
下面是逻辑回归分类任务的计算步骤:
- 初始化模型参数$\theta$,可以使用0、随机值或其他任意值进行初始化。
- 计算猜测函数$h_{\theta}(x)$,其中$x$为输入特征向量,$h_{\theta}(x) = g(\theta^Tx)$。
- 计算对数似然函数$l(\theta)$,$l(\theta) = \sum_{i=1}^m y^{(i)} \log(h_{\theta}(x^{(i)})) + (1-y^{(i)}) \log(1 – h_{\theta}(x^{(i)}))$。
- 使用梯度下降法更新模型参数$\theta$,$\theta_j := \theta_j – \alpha \frac{\partial l(\theta)}{\partial \theta_j}$,其中$\alpha$为学习率。
- 重复步骤2-4,直到对数似然函数的值收敛或达到最大迭代次数。
Python代码示例
下面是一个使用逻辑回归模型进行二分类任务的Python代码示例。该示例使用Scikit-learn中的鸢尾花数据集进行演示。首先,我们将训练数据集拆分为输入特征向量X和目标变量Y。然后,我们使用逻辑回归模型进行训练,并进行预测。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
Y = iris.target
# 将数据集拆分为训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
# 创建逻辑回归模型
model = LogisticRegression()
# 训练模型
model.fit(X_train, Y_train)
# 在测试集上进行预测
Y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(Y_test, Y_pred)
print("Accuracy:", accuracy)
# 绘制决策边界
X1 = X[:, 0]
X2 = X[:, 1]
plt.scatter(X1, X2, c=Y)
x1_min, x1_max = X1.min(), X1.max()
x2_min, x2_max = X2.min(), X2.max()
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max, 100), np.linspace(x2_min, x2_max, 100))
Z = model.predict(np.c_[xx1.ravel(), xx2.ravel()])
Z = Z.reshape(xx1.shape)
plt.contourf(xx1, xx2, Z, alpha=0.6)
plt.xlabel("Sepal Length")
plt.ylabel("Sepal Width")
plt.title("Logistic Regression Decision Boundary")
plt.show()
代码细节解释
- 我们从Scikit-learn库中导入所需的类和函数。
- 加载鸢尾花数据集,并将数据集拆分为训练集和测试集。
- 创建逻辑回归模型对象。
- 使用训练集拟合逻辑回归模型。
- 使用测试集进行预测,并计算准确率。
- 使用散点图和决策边界绘制数据的可视化结果。
在代码中,我们使用了Scikit-learn库中的LogisticRegression
类来创建逻辑回归模型,并使用fit
方法进行训练。然后,我们使用predict
方法在测试集上进行预测,并使用accuracy_score
函数计算准确率。最后,我们使用Matplotlib库来绘制数据的散点图和决策边界。决策边界通过对特征空间进行网格采样并对每个网格点进行预测来获得,然后使用contourf
函数将预测结果可视化。
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/821752/
转载文章受原作者版权保护。转载请注明原作者出处!