逻辑回归案例:电信用户流失预测 - 模型训练预测评估
1 课程概览
本课讲解电信用户流失预测案例的模型训练、预测和评估。使用逻辑回归模型,抽取特征(月租会员、互联网服务、支付方式),训练模型并使用classification_report分类评估报告进行评估。
2 核心概念与定义
- LogisticRegression:逻辑回归模型。
- train_test_split:数据集切割。
- accuracy_score:准确率。
- precision_score:精确率。
- recall_score:召回率。
- f1_score:F1值。
- classification_report:分类评估报告。
3 算法与模型详解
3.1 模型训练流程
步骤:
- 加载数据集
- 数据预处理(one-hot编码、删除冗余列、修改列名)
- 提取特征列和标签列
- 划分训练集和测试集
- 特征工程(标准化)
- 模型训练
- 模型预测
- 模型评估
3.2 特征选择
使用的特征:
| 特征 | 说明 |
|---|---|
| Contract_Month | 是否月租会员 |
| InternetService | 是否使用互联网服务 |
| PaymentMethod_Electronic | 支付方式(电子) |
标签:flag(是否流失)
3.3 分类评估报告
classification_report包含:
- 准确率(accuracy)
- 精确率(precision)
- 召回率(recall)
- F1值(f1-score)
- 两个平均:
- 宏平均(macro avg)
- 权重平均(weighted avg)
3.4 评估指标
| 指标 | 函数 | 说明 |
|---|---|---|
| 准确率 | accuracy_score | 预测正确的比例 |
| 精确率 | precision_score | 查准率 |
| 召回率 | recall_score | 查全率 |
| F1值 | f1_score | 调和平均数 |
| 分类评估报告 | classification_report | 综合评估 |
4 数学原理与推导
4.1 逻辑回归
$$h_\theta(X) = \sigma(W^TX + B) = \frac{1}{1 + e^{-(W^TX + B)}}$$
4.2 评估指标
精确率: $$\text{Precision} = \frac{TP}{TP + FP}$$
召回率: $$\text{Recall} = \frac{TP}{TP + FN}$$
F1值: $$F1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$$
5 代码示例
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import (
accuracy_score,
precision_score,
recall_score,
f1_score,
classification_report
)
from sklearn.preprocessing import StandardScaler
def dm03_模型训练预测评估():
"""模型训练预测评估"""
# 1. 加载数据集
churn_df = pd.read_csv('data/churn.csv')
# 2. 数据预处理
# 2.1 one-hot编码
churn_df = pd.get_dummies(churn_df, columns=['Churn', 'gender'])
# 2.2 删除冗余列
churn_df = churn_df.drop(columns=['Churn_No', 'gender_male'])
# 2.3 修改列名
churn_df = churn_df.rename(columns={'Churn_Yes': 'flag'})
# 2.4 提取特征列和标签列
# 使用的特征:月租会员、互联网服务、支付方式
features = ['Contract_Month', 'InternetService', 'PaymentMethod_Electronic']
X = churn_df[features]
y = churn_df['flag']
print("特征形状:", X.shape)
print("标签分布:\n", y.value_counts())
# 3. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=22
)
# 4. 特征工程(标准化)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 5. 模型训练
model = LogisticRegression()
model.fit(X_train_scaled, y_train)
# 6. 模型预测
y_pred = model.predict(X_test_scaled)
# 7. 模型评估
print("\n=== 模型评估 ===")
print(f"准确率: {accuracy_score(y_test, y_pred):.4f}")
print(f"精确率: {precision_score(y_test, y_pred):.4f}")
print(f"召回率: {recall_score(y_test, y_pred):.4f}")
print(f"F1值: {f1_score(y_test, y_pred):.4f}")
# 8. 分类评估报告
print("\n=== 分类评估报告 ===")
print(classification_report(y_test, y_pred, target_names=['未流失(0)', '流失(1)']))
# 9. 查看模型参数
print("=== 模型参数 ===")
print(f"权重W: {model.coef_}")
print(f"偏置B: {model.intercept_}")
# 运行
if __name__ == '__main__':
dm03_模型训练预测评估()
输出示例:
特征形状: (7043, 3)
标签分布:
False 5174
True 1869
=== 模型评估 ===
准确率: 0.7842
精确率: 0.6521
召回率: 0.4523
F1值: 0.5345
=== 分类评估报告 ===
precision recall f1-score support
未流失(0) 0.84 0.89 0.86 1036
流失(1) 0.65 0.45 0.53 373
accuracy 0.78 1409
macro avg 0.74 0.67 0.70 1409
weighted avg 0.79 0.78 0.78 1409
=== 模型参数 ===
权重W: [[ 0.234 -0.156 0.345]]
偏置B: [-0.123]
6 重难点与易错提醒
- ❗重点:特征选择(月租会员、互联网服务、支付方式)。
- ❗重点:classification_report是分类评估报告。
- ❗重点:评估报告包含宏平均和权重平均。
- ❗重点:标准化在划分数据集后进行。
- ⚠️易错:混淆classification_report和confusion_matrix。
- ⚠️易错:特征列名大小写问题。
- 💡深入理解:分类评估报告综合展示多个评估指标。
7 课堂问答精选
Q: classification_report是什么?
A: classification_report是分类评估报告,包含:
- 准确率(accuracy)
- 精确率(precision)
- 召回率(recall)
- F1值(f1-score)
- 宏平均(macro avg)
- 权重平均(weighted avg) 它综合展示了模型的多个评估指标。
Q: 电信用户流失预测使用了哪些特征?
A: 使用了三个特征:
- Contract_Month:是否月租会员
- InternetService:是否使用互联网服务
- PaymentMethod_Electronic:支付方式(电子) 这些特征对用户流失有较大影响。
8 本课小结
- 模型:LogisticRegression。
- 特征:月租会员、互联网服务、支付方式。
- 评估:accuracy、precision、recall、f1、classification_report。
- 分类评估报告:包含多个指标和两种平均。
9 延伸思考与实践
- 实践:运行代码完成模型训练和评估。
- 预习:决策树简介。
- 思考:如何提高模型的召回率?