哈喽,我是小白~
今天分享的算法,在业务中算是非常常用的:逻辑回归。
首先说,分类算法就是一种把东西分门别类的“数学工具”。它根据一些输入的特征,来判断这个东西属于哪个类别。
如果需要本文PDF版本的同学,文末获取~
另外,文末有总结性的干货~
一起来看下具体细化内容~
假设你是快递员,要根据一个包裹的重量和大小来决定它是“大包裹”还是“小包裹”。你会观察它的重量和体积,然后根据经验给它分类。
而逻辑回归是一种常用的分类算法,尽管名字里有“回归”二字,但它实际上用来做分类。它的核心思想是用一个公式计算出“这个东西属于某个类别的概率”,然后根据概率来决定分类。
逻辑回归 是什么?
逻辑回归输出的结果是一个0到1之间的数。通常我们设定一个“分界线”,比如0.5:
如果概率大于0.5,就认为属于类别1。 如果概率小于0.5,就认为属于类别0。
案例:判断邮件是“垃圾邮件”还是“正常邮件”
1. 观察问题
假设我们想根据邮件的关键词数量和邮件长度来判断一封邮件是垃圾邮件还是正常邮件。我们拿到了一些数据,发现大多数垃圾邮件有很多“促销”类词汇,且邮件较短。
邮件关键词数量 | 邮件长度 | 是否是垃圾邮件 |
---|---|---|
10 | 200 | 正常邮件(0) |
15 | 50 | 垃圾邮件(1) |
5 | 300 | 正常邮件(0) |
20 | 30 | 垃圾邮件(1) |
2. 建立模型
逻辑回归的公式如下:
表示邮件是垃圾邮件的概率。 是关键词数量, 是邮件长度。 、 是权重(模型要学习的参数)。 是偏置(类似于调整整体的“基准”)。
3. 简化假设和计算
假设我们已经训练好了模型,得到了参数:
对于一封邮件(关键词数量=18,邮件长度=100),我们代入公式:
计算概率:
这个概率接近1,说明这封邮件是垃圾邮件的可能性很高。
4. 分类决策
因为 0.993 > 0.5,所以我们把这封邮件分类为垃圾邮件。
总结三点:
分类算法像是在超市里给商品分区,分成“水果”、“蔬菜”、“零食”这样的类别。 逻辑回归就是先观察商品特征(重量、大小等),算出一个“属于某类的概率”,再根据概率判断它到底属于哪一类。 公式看起来复杂,但本质就是加法、减法、乘法,然后代入一个“概率计算器”(sigmoid函数)。
通过不断“训练”,逻辑回归能自动调节公式中的参数(权重和偏置),从而更准确地做出分类。
公式解析
逻辑回归是一种线性分类算法,基于概率来进行二分类。它通过逻辑函数(即sigmoid函数)将线性回归的输出映射到0到1之间,输出一个概率值。
公式推导
1. 假设模型
逻辑回归假设模型为:
其中:
是输入特征向量。 是权重向量。 是偏置(bias)。 是模型输出的概率,即预测样本属于类别1的概率。 是自然常数。
2. 损失函数推导
逻辑回归使用的损失函数是对数似然函数的负值。为了推导它,首先要理解模型输出的概率:
对于样本 时,模型输出的概率是 。 对于样本 时,模型输出的概率是 。
可以将上述概率写成一个统一的表达式:
取对数似然函数:
给定一组样本 ,总的对数似然函数为:
其中 是样本数量。
损失函数定义:
逻辑回归的目标是最大化对数似然函数,但通常通过最小化其负对数似然来实现:
3. 梯度计算与更新规则
为了通过梯度下降法来最小化损失函数,我们需要计算损失函数对参数的梯度:
(1)对权重 的梯度:
(2)对偏置 的梯度:
梯度下降更新规则:
其中 是学习率。
逻辑回归算法推导核心步骤
模型假设:假设数据可以通过一个线性模型输入到sigmoid函数中,得到输出概率。
损失函数构建:通过最大化对数似然函数或最小化负对数似然函数,得到损失函数:
梯度计算:对损失函数求导,得到参数的梯度。
梯度下降更新:根据梯度更新参数 和 ,直到损失函数收敛。
三、通俗解释公式背后的含义
线性部分:公式中的 是一个简单的线性模型,类似于一条直线。这个部分决定了数据点在特征空间中的位置。
非线性映射:通过sigmoid函数 ,将线性输出映射为0到1之间的概率。
概率决策:根据这个概率,如果大于0.5,就预测为类别1;否则预测为类别0。
优缺点和适用场景
优点
简单易懂,易于实现:
逻辑回归是线性模型的一种扩展,公式简单,理论直观,容易实现和解释。输出概率:
逻辑回归不仅能输出分类结果,还能给出样本属于某个类别的概率,为后续决策提供依据。计算效率高:
逻辑回归的计算复杂度较低,适合中小规模的数据集。可解释性强:
模型的权重可以解释每个特征对结果的影响,尤其适合需要模型可解释的场景。多种正则化支持:
逻辑回归支持 和 正则化,帮助防止过拟合。
缺点
只能处理线性可分问题:
如果数据本身是非线性的,逻辑回归无法很好地拟合,除非使用特征变换或核方法。对异常值敏感:
异常值会显著影响逻辑回归的拟合效果。特征工程依赖强:
逻辑回归对特征的选择和处理非常敏感,模型性能高度依赖于特征工程的质量。无法解决多分类问题(原始形式):
逻辑回归本质是二分类模型。对于多分类任务,需要扩展成 Softmax回归 或使用 一对多策略。
适用场景
逻辑回归适用于以下场景:
二分类问题:
逻辑回归主要用于处理二元分类问题,如判断某样本属于类别0或类别1。特征之间线性可分:
当特征与标签之间具有线性关系或接近线性关系时,逻辑回归表现最佳。需要概率输出的场景:
如果不仅需要知道分类结果,还需要知道结果的概率,逻辑回归是一个很好的选择。小规模数据集:
在数据集规模较小且特征数适中的情况下,逻辑回归可以有效工作。
完整案例
案例:客户流失预测
我们将通过逻辑回归模型,预测客户是否会流失。模拟数据并进行分析、可视化,绘制出数据分析图,展示逻辑回归模型的决策边界、数据分布及概率输出。
数据模拟和可视化目标:
模拟数据集,包括客户的两个特征:客户满意度和月消费金额。 通过逻辑回归建模,绘制:决策边界图和概率热力图。 数据点标注和炫酷配色,确保图形复杂和鲜艳。
完整代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
# 1. 数据模拟
np.random.seed(42)
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0,
n_clusters_per_class=1, class_sep=1.5, random_state=42)
X = pd.DataFrame(X, columns=["Satisfaction", "Monthly_Spend"])
y = pd.Series(y, name="Churn")
# 2. 训练逻辑回归模型
model = LogisticRegression()
model.fit(X, y)
# 3. 绘制决策边界
def plot_decision_boundary(X, y, model, ax):
# 创建网格
x_min, x_max = X.iloc[:, 0].min() - 1, X.iloc[:, 0].max() + 1
y_min, y_max = X.iloc[:, 1].min() - 1, X.iloc[:, 1].max() + 1
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 300), np.linspace(y_min, y_max, 300))
# 预测概率
Z = model.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]
Z = Z.reshape(xx.shape)
# 绘制决策边界与概率热力图
ax.contourf(xx, yy, Z, alpha=0.8, cmap="coolwarm", levels=np.linspace(0, 1, 20))
ax.scatter(X.iloc[:, 0], X.iloc[:, 1], c=y, edgecolors='k', cmap="viridis", s=80)
ax.set_xlabel("Satisfaction")
ax.set_ylabel("Monthly Spend")
ax.set_title("Customer Churn Prediction (Decision Boundary)")
# 4. 绘制概率热力图
def plot_probability_heatmap(X, model):
plt.figure(figsize=(10, 8))
x_min, x_max = X.iloc[:, 0].min() - 1, X.iloc[:, 0].max() + 1
y_min, y_max = X.iloc[:, 1].min() - 1, X.iloc[:, 1].max() + 1
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 300), np.linspace(y_min, y_max, 300))
Z = model.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1].reshape(xx.shape)
sns.heatmap(Z, cmap="coolwarm", cbar=True, alpha=0.9)
plt.title("Probability Heatmap of Customer Churn")
plt.xlabel("Satisfaction")
plt.ylabel("Monthly Spend")
plt.show()
# 5. 绘图展示
fig, ax = plt.subplots(figsize=(12, 8))
plot_decision_boundary(X, y, model, ax)
plt.show()
# 绘制概率热力图
plot_probability_heatmap(X, model)
数据模拟:使用 make_classification
模拟了两类数据,表示客户的满意度和月消费金额两个特征。标签y
表示客户是否流失。逻辑回归建模:使用 LogisticRegression
进行二分类建模。
决策边界图:绘制模型分类的区域及数据点,数据点颜色根据分类标签着色,模型预测的边界展示不同类别的区域。
概率热力图:展示模型预测的客户流失概率在特征空间中的分布。用热力图展示了逻辑回归模型在特征空间上的概率输出,从红色(高概率流失)到蓝色(低概率流失)逐渐过渡。
最后