机器学习-逻辑回归

逻辑回归概述

逻辑回归(Logistic Regression)是一种经典的分类算法,主要用于处理二分类问题。与线性回归不同,逻辑回归通过引入 Sigmoid 函数将线性模型的输出映射到 (0,1) 区间,从而得到样本属于某一类别的概率。它在线性回归的基础上进行了改良,使其更适用于分类任务,广泛应用于金融风控、医疗诊断、广告点击率预测等领域。

逻辑回归原理

逻辑回归的核心思想是通过找到一个决策边界(通常是一条直线或超平面)来分隔两类数据。在二维空间中,这条直线的方程可以表示为 y = kx + b;在高维空间中,决策边界则表示为 k₁x₁ + k₂x₂ + ... + b。通过判断新的数据点位于决策边界的哪一侧,可以决定其属于哪一类(例如绿色数据或红色数据)。

Sigmoid 曲线

Sigmoid 函数(又称逻辑函数)将线性模型的输出结果映射到 0 到 1 之间,其公式为 σ(z) = 1 / (1 + e⁻ᶻ)。当输入值 z 趋于正无穷时,Sigmoid 函数的值趋近于 1;当 z 趋于负无穷时,其值趋近于 0。Sigmoid 曲线充当了"激活函数"的角色,使得模型能够直接输出样本属于某个类别的概率,从而将回归问题转化为分类问题。

逻辑回归模型建立

建立逻辑回归模型首先需要确定决策边界的方程并求解参数 θ。具体步骤包括:

  1. 定义假设函数 hθ(x) = σ(θᵀx),其中 σ 为 Sigmoid 函数。
  2. 将数据点代入模型,计算 hθ(x) 的值,再通过 Sigmoid 函数得到趋向于 1 或 0 的概率输出。
  3. 目标是找到一组参数 θ,使得绿色数据点(正类)映射到接近 1 的概率,红色数据点(负类)映射到接近 0 的概率。

公式推导与极大似然估计

逻辑回归的公式推导结合了 Sigmoid 函数和线性模型。将结果直接作为概率处理后,通常使用极大似然估计(Maximum Likelihood Estimation, MLE)进行求解。通过整合两个式子,可以得到统一的似然函数。取对数后得到对数似然函数,便于后续的优化求解。

梯度下降算法

梯度下降(Gradient Descent)是一种用于求解复杂函数极小值的优化算法。其基本逻辑是通过类比"下山"的过程,沿着函数梯度的反方向逐步更新参数,从而找到函数的最小值点。梯度下降算法通过不断计算梯度并更新参数,逐步逼近最优解,是机器学习中常用的优化方法之一。

梯度下降算法实现

梯度下降算法的实现步骤如下:

  1. 随机初始化参数 θ 值,并计算初始点的梯度方向。
  2. 沿着梯度方向走一步(即更新 θ 值:θ := θ - α·∇J(θ),其中 α 为学习率)。
  3. 计算新的梯度方向,重复上述步骤,直到达到足够的迭代次数或满足预设的精度要求。

步长选择与收敛性

步长(学习率 α)的选择对梯度下降算法的性能有重要影响:

  • 步长太大可能导致算法在最小值附近震荡甚至发散,无法收敛。
  • 步长太小则收敛速度缓慢,需要更多的迭代次数才能达到最优解。
  • 通过合理调整步长,可以在保证收敛速度的同时避免陷入局部最优解。常用的策略包括:
    • 学习率衰减:随着迭代次数增加逐渐减小学习率,使算法在初期快速接近最优解,后期精细调整。
    • 自适应学习率方法:如 Adam、RMSProp 等算法能根据梯度历史信息自动调整每个参数的学习率。
    • 动量法:引入动量项,加速收敛并减少震荡。

在实际应用中,通常需要通过交叉验证或网格搜索来寻找最优的学习率。一个常见的做法是从一个较大的学习率开始(如 0.1),然后按指数衰减逐步减小,观察损失函数的变化曲线,选择使损失函数平稳下降且不震荡的学习率。

逻辑回归代码实现

逻辑回归的完整实现流程包括数据加载、预处理、特征工程、模型训练与评估等步骤。下面以银行贷款风险评估为例,展示完整的 Python 实现代码。

1. 数据集介绍

本示例使用一个包含 28 万多条银行贷款记录的脱敏数据集,该数据集具有以下特点:

  • 数据规模:284,807 条记录,包含 29 个特征(v1-v28 及 amount)和 1 个类别标签(class)。
  • 特征说明
    • v1-v28:经过 PCA 降维处理的主成分特征,已脱敏处理。
    • amount:交易金额,需要进行标准化处理。
    • time:交易时间戳,在本例中作为无用特征删除。
  • 标签分布:class 字段表示用户是否为"老赖"(欺诈用户),其中:
    • 0:正常用户(284,315 条,约 99.83%)
    • 1:欺诈用户(492 条,约 0.17%)
    这是一个典型的类别不平衡数据集。

2. 数据预处理

数据预处理是机器学习流程中的关键步骤,直接影响模型性能。以下是完整的数据预处理代码
# 1. 导入所需库
import pandas as pd
import matplotlib.pyplot as plt
from pylab import mpl
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import recall_score, classification_report

# 设置中文字体(解决Matplotlib中文显示问题)
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
# 读取数据集(请将 creditcard.csv 放在当前目录)
data = pd.read_csv(r"./creditcard.csv")

# 查看数据前5行,确认加载成功
print("数据前5行:")
print(data.head())

# 查看数据基本信息
print("\n数据形状:", data.shape)
print("\n列名:", data.columns.tolist())
# 对交易金额进行标准化(逻辑回归对特征尺度敏感)
scaler = StandardScaler()
data['Amount'] = scaler.fit_transform(data[['Amount']])

#  删除无用特征(时间戳)
data = data.drop(['Time'], axis=1)

print("\n预处理后的数据形状:", data.shape)
print("预处理后的前5行:")
print(data.head())

3. 数据可视化

通过可视化了解数据分布和类别不平衡情况:
labels_count = data['Class'].value_counts()
print("\n类别分布:")
print(labels_count)
print(f"\n正常用户占比:{labels_count[0] / len(data) * 100:.2f}%")
print(f"欺诈用户占比:{labels_count[1] / len(data) * 100:.2f}%")

# 绘制柱状图
plt.title("正负例样本数")
plt.xlabel("类别(0=正常,1=欺诈)")
plt.ylabel("频数")
labels_count.plot(kind='bar')
plt.show()

4. 模型训练与评估

使用逻辑回归模型进行训练和评估:
# 分离特征和标签
X = data.drop(['Class'], axis=1)   # 特征(v1-v28 + Amount)
y = data['Class']                   # 标签(0=正常,1=欺诈)

#按 7:3 比例划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, 
    test_size=0.3, 
    random_state=1000   # 固定随机种子,保证结果可复现
)

print(f"总样本数:{len(data)}")
print(f"训练集样本数:{len(X_train)}")
print(f"测试集样本数:{len(X_test)}")
# 创建逻辑回归模型(C=0.01 表示较强的正则化,防止过拟合)
model = LogisticRegression(C=0.01)

# 在训练集上训练模型
model.fit(X_train, y_train)

print("模型训练完成!")
print(f"模型参数(系数)形状:{model.coef_.shape}")
print(f"模型截距:{model.intercept_[0]:.4f}")
#  在测试集上进行预测
y_pred = model.predict(X_test)

# 计算准确率
accuracy = model.score(X_test, y_test)
print(f"模型在测试集上的准确率:{accuracy:.4f}")

#计算召回率(识别欺诈用户的能力)
recall = recall_score(y_test, y_pred)
print(f"模型召回率:{recall:.4f}")

# 详细分类报告
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=['正常用户', '欺诈用户']))

5. 模型优化与调参

针对类别不平衡问题,可以采取以下优化策略:

  1. 类别权重调整:为少数类设置更高的权重
  2. 采样策略:使用过采样(如 SMOTE)或欠采样平衡数据集
  3. 阈值调整:根据业务需求调整分类阈值
  4. 集成方法:使用 Bagging 或 Boosting 提升模型性能

以下是使用类别权重处理不平衡数据的示例代码:
# 使用 class_weight='balanced' 自动为少数类分配更高权重
model_balanced = LogisticRegression(C=0.01, class_weight='balanced')
model_balanced.fit(X_train, y_train)

# 评估优化后的模型
y_pred_balanced = model_balanced.predict(X_test)
accuracy_balanced = model_balanced.score(X_test, y_test)
recall_balanced = recall_score(y_test, y_pred_balanced)

print("=" * 60)
print("【优化后模型评估】")
print("=" * 60)
print(f"准确率:{accuracy_balanced:.4f}")
print(f"召回率:{recall_balanced:.4f}")

# 对比两种模型
print("\n【模型对比】")
print(f"原模型召回率:{recall:.4f}")
print(f"优化后模型召回率:{recall_balanced:.4f}")
print(f"召回率提升:{(recall_balanced - recall) * 100:.2f}%")
import joblib

# 保存训练好的模型
joblib.dump(model, 'logistic_regression_model.pkl')
print("模型已保存为 logistic_regression_model.pkl")

# 加载模型的示例代码(注释掉,仅作演示)
loaded_model = joblib.load('logistic_regression_model.pkl')
new_pred = loaded_model.predict(X_test)

优化建议:

  • 对于高度不平衡的数据集,建议使用 class_weight='balanced' 或手动设置类别权重
  • 可以通过网格搜索(GridSearchCV)寻找最优的 C 参数
  • 考虑使用交叉验证来评估模型稳定性
  • 对于欺诈检测等场景,召回率通常比准确率更重要

总结与扩展

逻辑回归作为经典的分类算法,在实际应用中需要注意以下几点:

  • 特征工程:逻辑回归对特征尺度敏感,标准化/归一化是必要步骤。
  • 正则化选择:L1 正则化(Lasso)可以产生稀疏解,用于特征选择;L2 正则化(Ridge)能防止过拟合,提高模型泛化能力。
  • 多分类扩展:逻辑回归可通过 One-vs-Rest 或 Softmax 扩展到多分类问题。
  • 模型解释性:逻辑回归的系数具有明确的统计意义,可以解释特征对结果的影响程度。
  • 部署考虑:训练好的模型可以通过 pickle 或 joblib 保存,方便在生产环境中部署使用。

通过本示例,我们完整展示了逻辑回归从理论到实践的全过程,包括数据预处理、模型训练、评估优化等关键步骤。在实际业务场景中,还需要结合具体业务需求和数据特点进行针对性优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值