逻辑回归概述
逻辑回归(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 曲线充当了"激活函数"的角色,使得模型能够直接输出样本属于某个类别的概率,从而将回归问题转化为分类问题。
逻辑回归模型建立
建立逻辑回归模型首先需要确定决策边界的方程并求解参数 θ。具体步骤包括:
- 定义假设函数 hθ(x) = σ(θᵀx),其中 σ 为 Sigmoid 函数。
- 将数据点代入模型,计算 hθ(x) 的值,再通过 Sigmoid 函数得到趋向于 1 或 0 的概率输出。
- 目标是找到一组参数 θ,使得绿色数据点(正类)映射到接近 1 的概率,红色数据点(负类)映射到接近 0 的概率。
公式推导与极大似然估计
逻辑回归的公式推导结合了 Sigmoid 函数和线性模型。将结果直接作为概率处理后,通常使用极大似然估计(Maximum Likelihood Estimation, MLE)进行求解。通过整合两个式子,可以得到统一的似然函数。取对数后得到对数似然函数,便于后续的优化求解。

梯度下降算法
梯度下降(Gradient Descent)是一种用于求解复杂函数极小值的优化算法。其基本逻辑是通过类比"下山"的过程,沿着函数梯度的反方向逐步更新参数,从而找到函数的最小值点。梯度下降算法通过不断计算梯度并更新参数,逐步逼近最优解,是机器学习中常用的优化方法之一。
梯度下降算法实现
梯度下降算法的实现步骤如下:
- 随机初始化参数 θ 值,并计算初始点的梯度方向。
- 沿着梯度方向走一步(即更新 θ 值:θ := θ - α·∇J(θ),其中 α 为学习率)。
- 计算新的梯度方向,重复上述步骤,直到达到足够的迭代次数或满足预设的精度要求。
步长选择与收敛性
步长(学习率 α)的选择对梯度下降算法的性能有重要影响:
- 步长太大可能导致算法在最小值附近震荡甚至发散,无法收敛。
- 步长太小则收敛速度缓慢,需要更多的迭代次数才能达到最优解。
- 通过合理调整步长,可以在保证收敛速度的同时避免陷入局部最优解。常用的策略包括:
- 学习率衰减:随着迭代次数增加逐渐减小学习率,使算法在初期快速接近最优解,后期精细调整。
- 自适应学习率方法:如 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. 模型优化与调参
针对类别不平衡问题,可以采取以下优化策略:
- 类别权重调整:为少数类设置更高的权重
- 采样策略:使用过采样(如 SMOTE)或欠采样平衡数据集
- 阈值调整:根据业务需求调整分类阈值
- 集成方法:使用 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 保存,方便在生产环境中部署使用。
通过本示例,我们完整展示了逻辑回归从理论到实践的全过程,包括数据预处理、模型训练、评估优化等关键步骤。在实际业务场景中,还需要结合具体业务需求和数据特点进行针对性优化。
377

被折叠的 条评论
为什么被折叠?



