机器学习--逻辑回归

目录

一、逻辑回归介绍

二、逻辑回归的函数

2.1逻辑回归的损失函数

2.2通过梯度下降法求参数的更新式

三、逻辑回归的分类器

四、phyon代码实现

五、实验结果分析


一、逻辑回归介绍

逻辑回归,又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘、疾病自动诊断、经济预测等领域。虽然名字中包含“回归”,但它实际上是一种分类算法,主要用于解决二分类问题,并可通过一定方法扩展至多分类问题。

在逻辑回归中,我们根据给定的自变量数据集来估计事件的发生概率,这个概率值位于0和1之间。逻辑回归通过引入一个逻辑函数(如sigmoid函数),将线性回归的输出映射到这个概率范围内。换句话说,它通过一个函数将线性回归的预测值转换为一个表示事件发生概率的值。

逻辑回归模型的参数通常通过极大似然法来估计,这与线性回归中使用的最小二乘法不同。在模型训练过程中,我们会构造一个损失函数,该函数衡量模型预测与实际标签之间的差异,并通过优化算法(如梯度下降法)来最小化这个损失函数,从而找到最佳模型参数。

此外,逻辑回归在处理多分类问题时,可以采用“一对一”(OvO)或“一对其余”(OvR)等策略,将多分类问题转化为多个二分类问题来解决。这些策略通过构建多个二分类器,并对它们的预测结果进行组合,以实现多分类的目的。

总的来说,逻辑回归是一种强大且灵活的分类算法,能够处理各种类型的数据,并在许多实际应用场景中发挥重要作用。

二、逻辑回归的函数

首先我们要先介绍一下Sigmoid函数,也称为逻辑函数(Logistic function):

其函数曲线如下:

从上图可以看到sigmoid函数是一个s形的曲线,它的取值在[0, 1]之间,在远离0的地方函数的值会很快接近0或者1,它的这个特性对于解决二分类问题十分重要。

逻辑回归的假设函数形式如下:

所以:

其中 x 是我们的输入,θ 为我们要求取的参数。

一个机器学习的模型,实际上是把决策函数限定在某一组条件下,这组限定条件就决定了模型的假设空间。当然,我们还希望这组限定条件简单而合理。而逻辑回归模型所做的假设是:

这个函数的意思就是在给定 x 和 θ 的条件下,y = 1的概率。

2.1逻辑回归的损失函数

通常提到损失函数,我们不得不提到代价函数(Cost Function)及目标函数(Object Function)。

损失函数(Loss Function) 直接作用于单个样本,用来表达样本的误差

代价函数(Cost Function)是整个样本集的平均误差,对所有损失函数值的平均

目标函数(Object Function)是我们最终要优化的函数,也就是代价函数+正则化函数(经验风险+结构风险)

概况来讲,任何能够衡量模型预测出来的值 h(θ) 与真实值 y 之间的差异的函数都可以叫做代价函数 C(θ) 如果有多个样本,则可以将所有代价函数的取值求均值,记做 J(θ) 。因此很容易就可以得出以下关于代价函数的性质:

  • 选择代价函数时,最好挑选对参数 θ 可微的函数(全微分存在,偏导数一定存在)
  • 对于每种算法来说,代价函数不是唯一的;
  • 代价函数是参数 θ 的函数;
  • 总的代价函数 J(θ) 可以用来评价模型的好坏,代价函数越小说明模型和参数越符合训练样本(x,y);
  • J(θ) 是一个标量;

经过上面的描述,一个好的代价函数需要满足两个最基本的要求:能够评价模型的准确性,对参数 θ 可微。

在线性回归中,最常用的是均方误差(Mean squared error),即

在逻辑回归中,最常用的是代价函数是交叉熵(Cross Entropy),交叉熵是一个常见的代价函数

2.2通过梯度下降法求参数的更新式

逻辑回归通过梯度下降法来更新参数的过程,首先要明确逻辑回归的模型形式和损失函数。逻辑回归的假设函数为:

[ h_\theta(x) = \sigma(\theta^Tx) ]

其中,(\sigma(z) = \frac{1}{1 + e^{-z}}) 是sigmoid函数,(\theta) 是参数向量。

逻辑回归的损失函数通常采用交叉熵损失,对于单个样本,其损失函数形式为:

[ L(\theta; x, y) = -y \log(h_\theta(x)) - (1-y) \log(1 - h_\theta(x)) ]

其中,(x) 是特征向量,(y) 是对应的标签(0或1)。

当我们有一批训练样本时,整体的损失函数是这些单个样本损失的平均值。我们的目标是找到使整体损失函数最小的参数 (\theta)。

梯度下降法是一种迭代优化算法,用于找到损失函数的最小值。在每一步迭代中,它按照损失函数关于参数的梯度的反方向来更新参数。对于逻辑回归,参数的更新式可以表示为:

[ \theta_j := \theta_j - \eta \frac{\partial}{\partial \theta_j} L(\theta; X, Y) ]

其中,(\eta) 是学习率,控制参数更新的步长;(\frac{\partial}{\partial \theta_j} L(\theta; X, Y)) 是损失函数关于参数 (\theta_j) 的偏导数,表示损失函数在该参数方向上的变化率。

具体计算偏导数时,我们需要用到链式法则。以单个样本为例,损失函数关于 (\theta_j) 的偏导数为:

[ \frac{\partial}{\partial \theta_j} L(\theta; x, y) = \left( \frac{-y}{h_\theta(x)} + \frac{1-y}{1-h_\theta(x)} \right) \frac{\partial}{\partial \theta_j} h_\theta(x) ]

由于 (h_\theta(x) = \sigma(\theta^Tx)),我们可以进一步计算 (\frac{\partial}{\partial \theta_j} h_\theta(x)):

[ \frac{\partial}{\partial \theta_j} h_\theta(x) = h_\theta(x)(1 - h_\theta(x))x_j ]

将上述结果代入偏导数的计算式中,得到:

[ \frac{\partial}{\partial \theta_j} L(\theta; x, y) = \left( h_\theta(x) - y \right) x_j ]

因此,对于一批训练样本,参数的更新式变为:

[ \theta_j := \theta_j - \eta \sum_{i=1}^{m} \left( h_\theta(x^i) - y^i \right) x_j^i ]

其中,(m) 是样本数量,(x^i) 和 (y^i) 分别是第 (i) 个样本的特征向量和标签。这个更新式是在每一次迭代中对所有样本进行计算并更新参数。在实际应用中,为了提高效率,我们通常会采用随机梯度下降(SGD)或小批量梯度下降(Mini-batch GD)的方法,每次只使用部分样本来更新参数。

三、逻辑回归的分类器

逻辑回归的分类器是基于逻辑回归模型构建的,它主要用于将输入数据分类到不同的类别中。在逻辑回归中,分类器通过计算输入特征的加权和,并将其转换为概率值来进行分类决策。

以下是逻辑回归分类器的基本组成和工作原理:

1. **模型构建**:
   - 逻辑回归模型是一个概率模型,它假设数据服从伯努利分布(对于二分类问题)。
   - 模型通过线性函数 `z = w1*x1 + w2*x2 + ... + wn*xn + b`(其中 `w` 是权重,`x` 是输入特征,`b` 是偏置项)来计算特征的加权和。
   - 接着,使用逻辑函数(如sigmoid函数)将加权和 `z` 转换为介于0和1之间的概率值 `p逻辑函数的形式为 `p = 1 / (1 + exp(-z))`。

2. **训练过程**:
   - 在训练阶段,逻辑回归分类器使用标记好的数据集来学习权重 `w` 和偏置 `b`。
   - 通过最大化似然函数(或最小化负对数似然损失函数)来估计模型参数。这通常通过梯度下降等优化算法实现。

3. **分类决策**:
   - 对于一个新的输入样本,分类器首先计算其特征的加权和 `z`。
   - 然后,将 `z` 通过逻辑函数转换为概率值 `p`。
   - 通常,如果 `p` 大于某个阈值(如0.5),则样本被分类为一类(如正类),否则被分类为另一类(如负类)。

4. **多分类扩展**:
   - 虽然逻辑回归本身是为二分类问题设计的,但它可以通过一些策略扩展到多分类问题。
   - 常见的策略包括“一对多”(One-vs-Rest)或“一对一”(One-vs-One),在这些策略中,多分类问题被分解为多个二分类问题,并为每个问题训练一个单独的逻辑回归分类器。
   - 另一个选项是使用softmax函数来直接处理多分类问题,这称为多项逻辑回归或softmax回归。

5. **模型评估**:
   - 训练完成后,需要使用验证集或测试集来评估分类器的性能。
   - 评估指标可能包括准确率、精确率、召回率、F1分数等,具体取决于应用场景和性能要求。

逻辑回归分类器因其简单性、可解释性和在许多实际问题中的有效性而受到广泛应用。然而,它也有其局限性,如对非线性问题的处理能力有限,以及在处理高维数据和复杂关系时可能遇到的挑战。

四、phyon代码实现

```python
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import matplotlib.pyplot as plt

# 设置随机种子以确保结果可复现
np.random.seed(42)

# 1. 生成数据集
# 设定样本数量和特征数量
n_samples = 1000
n_features = 2

# 随机生成特征数据
X = np.random.randn(n_samples, n_features)

# 创建一个线性边界,并加上一些噪声来确定标签
coefs = [2, -3]  # 系数,可以自定义以改变线性边界
intercept = 1    # 截距
noise = np.random.randn(n_samples) * 0.5  # 噪声
y_prob = np.dot(X, coefs) + intercept + noise  # 计算逻辑回归的线性部分
y = (y_prob > 0).astype(int)  # 根据线性部分生成0或1的标签

# 2. 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. 实现和训练逻辑回归模型
logreg = LogisticRegression(max_iter=1000)  # 创建逻辑回归模型,增加迭代次数以确保收敛
logreg.fit(X_train, y_train)  # 训练模型

# 4. 测试模型
y_pred = logreg.predict(X_test)  # 进行预测

# 5. 分析结果
accuracy = accuracy_score(y_test, y_pred)  # 计算准确率
conf_matrix = confusion_matrix(y_test, y_pred)  # 计算混淆矩阵
class_report = classification_report(y_test, y_pred)  # 获取分类报告

print(f"Accuracy: {accuracy}")
print(f"Confusion Matrix:\n{conf_matrix}")
print(f"Classification Report:\n{class_report}")

# 可视化决策边界(仅适用于二维特征)
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01), np.arange(y_min, y_max, 0.01))
Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.5)
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolor='k', s=40)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title('Logistic Regression Decision Boundary')
plt.show()
```

这段代码首先生成一个包含1000个样本和2个特征的数据集,并根据一个线性函数加上噪声来确定每个样本的标签。然后,我们创建一个逻辑回归模型,用训练数据拟合它,并在测试数据上进行预测。最后,我们计算并打印出模型的准确率、混淆矩阵和分类报告,同时还生成了一个可视化图来展示逻辑回归的决策边界。 

五、实验结果分析

分析:
准确率(Accuracy):

准确率是正确预测的样本数与总样本数之比。在这个例子中,模型达到了0.93(或93%)的准确率,这意味着模型在测试集上表现良好,能够较准确地预测样本的标签。
混淆矩阵(Confusion Matrix):

混淆矩阵展示了模型的预测结果与实际标签之间的对比。在这个例子中,混淆矩阵表明:
真实标签为0且预测也为0的样本有90个(真正例TP)。
真实标签为0但预测为1的样本有4个(假负例FN)。
真实标签为1但预测为0的样本有6个(假正例FP)。
真实标签为1且预测也为1的样本有90个(真负例TN)。
混淆矩阵有助于我们识别模型在哪些类别上的表现较好,以及在哪些类别上可能存在误判。
分类报告(Classification Report):

分类报告提供了每个类别的精确度(precision)、召回率(recall)和F1分数,以及它们的宏平均(macro avg)和加权平均(weighted avg)。
精确度表示预测为某一类别的样本中,真正属于该类别的比例。在这个例子中,类别0和类别1的精确度都接近95%,说明模型在预测这两个类别时都较为准确。
召回率(也称为真正率或灵敏度)表示真正属于某一类别的样本中,被模型正确预测出来的比例。这里,类别0和类别1的召回率也接近95%,表明模型能够较好地识别出这两个类别的样本。
F1分数是精确度和召回率的调和平均数,用于综合评价模型的性能。在这个例子中,两个类别的F1分数都接近95%,说明模型在整体性能上表现良好。
综上所述,根据这些输出结果,我们可以得出结论:该逻辑回归模型在自动生成的数据集上表现优异,具有较高的预测准确率,并且能够较为均衡地处理不同的类别。这表明模型得到了有效的训练,并且适用于该数据集上的分类任务。

  • 17
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值