一、逻辑回归简介
1. 什么是逻辑回归?
逻辑回归(Logistic Regression)是一种经典的机器学习分类算法,主要用于解决二分类和多分类问题。
虽然名字中包含"回归",但逻辑回归本质上是一种分类模型。
常见应用:
- 银行贷款风险预测
- 医疗疾病检测
- 垃圾邮件分类
- 用户流失预测
- 信用评分
例如银行需要判断用户是否存在贷款风险:
0:正常用户 1:违约用户输入用户信息:
年龄 收入 负债情况 信用评分 历史还款记录模型输出:
用户违约概率例如:
正常概率:0.2 违约概率:0.8由于违约概率大于 0.5:
最终预测:
用户 = 违约二、逻辑回归的数学原理
1. 线性计算
逻辑回归首先计算输入特征的线性组合:
z = w₁x₁ + w₂x₂ + ... + wₙxₙ + b
其中:
| 符号 | 含义 |
|---|---|
| x | 输入特征 |
| w | 模型权重 |
| b | 偏置 |
| z | 线性结果 |
例如贷款预测:
z = w₁ × 年龄 + w₂ × 收入 + w₃ × 信用评分 + b
但是:
z 的范围:
(-∞, +∞)
无法直接作为概率。
因此需要使用:
2. Sigmoid 函数
Sigmoid 函数:
σ(z) = 1 / (1 + e⁻ᶻ)
作用:
将任意数值转换到:
0 ~ 1
例如:
| z | 概率 |
|---|---|
| 5 | 0.99 |
| 0 | 0.5 |
| -5 | 0.006 |
最终:
输出一个概率值。
三、逻辑回归模型评价指标
在实际项目中:
不能只看准确率。
1. 为什么准确率不可靠?
例如银行贷款预测:
10000 个用户:
正常用户:9990 个 违约用户:10 个模型:
所有用户预测正常结果:
预测正确:
9990 个
准确率:
9990 / 10000 = 99.9%
但是:
10 个违约用户全部漏掉。
这种模型没有实际价值。
因此需要:
- 混淆矩阵
- Precision
- Recall
- F1-score
四、混淆矩阵
混淆矩阵用于比较:
真实结果 VS 模型预测结果。
| 预测正类 | 预测负类 | |
|---|---|---|
| 真实正类 | TP | FN |
| 真实负类 | FP | TN |
1. TP
True Positive:
真正例。
含义:
真实 = 1 预测 = 1例如:
用户确实违约,模型判断违约。
2. TN
True Negative:
真负例。
真实 = 0 预测 = 0例如:
正常用户被正确识别。
3. FP
False Positive:
假正例。
真实 = 0 预测 = 1也叫:误报。
例如:
正常用户被认为违约。
4. FN
False Negative:
假负例。
真实 = 1 预测 = 0也叫:漏报。
例如:
违约用户没有被发现。
五、分类评价指标
1. Precision(精确率)
公式:
Precision = TP / (TP + FP)
含义:
模型预测为正类的数据中,有多少是真的正类。
例如:
模型预测 100 人违约:
其中 80 人真的违约。
Precision:
80%
关注:
减少误报。
2. Recall(召回率)
公式:
Recall = TP / (TP + FN)
含义:
所有真实正类中,有多少被模型找到。
例如:
实际有 100 个违约用户:
模型发现 90 个。
Recall:
90%
关注:
减少漏报。
3. 为什么业务更关注 Recall?
医疗场景
疾病检测:
误诊:
健康人被判断患病。
影响:
需要复查。
漏诊:
患者没有发现疾病。
可能导致严重后果。
所以:
医疗更关注 Recall。
银行风控
预测贷款违约:
漏掉一个老赖:
损失 100 万元。
误拒一个正常用户:
损失 5 万元。
因此:
银行更关注:
Recall。
4. F1-score
Precision 和 Recall 存在矛盾。
因此使用:
F1-score。
公式:
F1 = 2PR / (P + R)
它综合考虑:
- 精确率
- 召回率
六、Python 实现逻辑回归
1. 导入库
import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix七、加载数据
使用 sklearn 自带鸢尾花数据集。
iris = load_iris() X = iris.data y = iris.target数据:
X: 花萼长度 花萼宽度 花瓣长度 花瓣宽度 y: 花的类别八、划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size = 0.2, random_state = 42 )作用:
80% 训练
20% 测试
九、训练逻辑回归模型
创建模型:
model = LogisticRegression()训练:
model.fit( X_train, y_train )训练过程中:
模型学习:
每个特征的重要程度也就是:
权重 w。
十、模型预测
y_pred = model.predict(X_test)得到:
预测类别。
十一、模型评价
1. 混淆矩阵
cm = confusion_matrix( y_test, y_pred ) print(cm)输出:
[[10 0 0] [0 9 1] [0 0 10]]表示:
模型大部分预测正确。
2. 分类报告
print( classification_report( y_test, y_pred ) )输出:
precision recall f1-score support说明模型综合表现。
十二、过拟合与正则化
1. 什么是过拟合?
过拟合:
模型在训练数据上表现很好:
训练准确率:99%但是:
测试数据:
准确率:70%原因:
模型记住了训练数据中的噪声。
十三、正则化解决过拟合
正则化思想:
在损失函数中加入惩罚项。
公式:
Loss = 原始损失 + λR(W)
目的:
限制模型复杂度。
十四、L1 和 L2 正则化
L1 正则化
公式:
R(W) = ∑|w|
特点:
部分权重变为 0。
作用:
自动选择重要特征。
L2 正则化
公式:
R(W) = ∑w²
特点:
让权重整体变小。
优点:
模型更加稳定。
sklearn 默认:
penalty = 'l2'十五、LogisticRegression 重要参数
1. penalty
正则化方式:
penalty = 'l2'2. C 参数
C 表示:
正则化强度的倒数。
关系:
| C 值 | 正则化 |
|---|---|
| 小 | 强 |
| 大 | 弱 |
例如:
LogisticRegression(C = 0.1)正则化更强。
3. solver
优化算法:
| solver | 特点 |
|---|---|
| liblinear | 小数据 |
| lbfgs | 默认 |
| sag | 大数据 |
| saga | 大数据 |
4. max_iter
最大迭代次数:
max_iter = 1000防止模型无法收敛。
5. class_weight
解决类别不平衡:
class_weight = 'balanced'自动提高少数类别权重。
十六、交叉验证进行参数优化
为什么不能使用测试集调参?
错误:
测试不同 C 值 选择测试集效果最高的问题:
测试集参与模型选择。
相当于提前看答案。
十七、K 折交叉验证
例如:
10 折交叉验证。
步骤:
数据分 10 份:
1 2 3 4 5 6 7 8 9 10循环:
第一次:
训练:
1-9
验证:
10
第二次:
训练:
1-8 + 10
验证:
9
最终:
计算平均结果。
十八、完整机器学习流程
数据收集 ↓ 数据清洗 ↓ 划分训练集测试集 ↓ 建立逻辑回归模型 ↓ 交叉验证调参 ↓ 训练最终模型 ↓ 测试模型 ↓ 上线应用