逻辑回归案例:电信用户流失预测 - 数据预处理
1 课程概览
本课讲解电信用户流失预测案例的数据预处理。通过用户通话、上网等信息预测用户是否会流失。介绍数据集(7043行16列),对object类型列(Churn和gender)进行one-hot编码,删除冗余列。
2 核心概念与定义
- 电信用户流失预测:通过用户行为数据预测是否会流失。
- One-hot编码:热编码处理,将类别变量转换为布尔类型。
- get_dummies:pandas的one-hot编码函数。
- 数据预处理:数据读取、类型转换、冗余列删除。
3 算法与模型详解
3.1 案例背景
目标:通过用户通话、上网等信息预测用户是否会流失
应用场景:
- 预测用户可能流失 → 标注出来
- 营销团队制定对应营销方案
- 例如:会员到期前3天预测,给予定制优惠
示例:
- 老用户续费:折扣小
- 新用户体验:折扣大
3.2 数据集描述
基本信息:
- 行数:7043行
- 列数:16列
- 缺失值:无
字段说明:
| 字段 | 说明 |
|---|---|
| customerID | 客户ID |
| gender | 性别 |
| Partner | 配偶是否ATT用户 |
| Dependents | 家人是否ATT用户 |
| PhoneService | 是否使用固话服务 |
| InternetService | 是否使用互联网服务 |
| PaymentMethod | 付款方式 |
| MonthlyCharges | 每月花费 |
| TotalCharges | 累计花费 |
| Churn | 是否流失(标签) |
使用的特征字段:
- InternetService:是否使用互联网服务
- PaymentMethod:支付方式(Electronic)
- Contract_Month:是否月度会员
标签:Churn(是否流失)
3.3 数据类型问题
问题:
- Churn和gender列是object类型
- 无法直接用于分类
解决方案:
- 进行one-hot编码
- 转换为布尔类型(True/False)
- 再映射为数值(0/1)
3.4 One-hot编码
原理:
- 将每个类别拆分为新列
- 原始值变为True/False
示例:
| 原始gender | gender_male | gender_female |
|---|---|---|
| male | True | False |
| female | False | True |
Churn列:
| 原始Churn | Churn_Yes | Churn_No |
|---|---|---|
| Yes | True | False |
| No | False | True |
3.5 冗余列删除
问题:one-hot编码后会多出列
- 原始16列 → 编码后18列
删除:
- Churn_No(保留Churn_Yes)
- gender_male(或gender_female)
原因:
- gender_male和gender_female互为相反
- 只需保留一列即可
3.6 处理流程
步骤:
- 读取CSV文件
- 查看数据集(info, head)
- 对object类型列进行one-hot编码
- 查看处理后的数据集
- 删除冗余列
- 修改列名(Churn_Yes → flag)
4 数学原理与推导
4.1 One-hot编码
原始: $$X = \begin{bmatrix} \text{male} \ \text{female} \ \text{male} \end{bmatrix}$$
编码后: $$X_{onehot} = \begin{bmatrix} 1 & 0 \ 0 & 1 \ 1 & 0 \end{bmatrix}$$
4.2 标签映射
$$\text{Churn} = \begin{cases} \text{Yes} \rightarrow 1 \ \text{No} \rightarrow 0 \end{cases}$$
5 代码示例
import numpy as np
import pandas as pd
def dm01_数据预处理():
"""数据预处理"""
# 1. 读取CSV文件
churn_df = pd.read_csv('data/churn.csv')
# 2. 查看数据集
print("=== 数据基本信息 ===")
print(churn_df.info())
print("\n=== 前五行数据 ===")
print(churn_df.head())
# 3. 对object类型列进行one-hot编码
# Churn和gender列是object类型
churn_df = pd.get_dummies(churn_df, columns=['Churn', 'gender'])
# 4. 查看处理后的数据集
print("\n=== 处理后的数据 ===")
print(churn_df.info())
print(churn_df.head())
# 5. 删除冗余列
# one-hot编码后会多出列,删除冗余列
churn_df = churn_df.drop(columns=['Churn_No', 'gender_male'])
# 6. 修改列名
# Churn_Yes 改为 flag
churn_df = churn_df.rename(columns={'Churn_Yes': 'flag'})
# 7. 查看标签分布
print("\n=== 标签分布 ===")
print(churn_df['flag'].value_counts())
return churn_df
# 运行
if __name__ == '__main__':
df = dm01_数据预处理()
print(f"\n最终数据形状: {df.shape}")
输出示例:
=== 数据基本信息 ===
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7043 entries, 0 to 7042
Data columns (total 16 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 customerID 7043 non-null object
1 gender 7043 non-null object
2 SeniorCitizen 7043 non-null int64
...
15 Churn 7043 non-null object
dtypes: float64(1), int64(2), object(13)
=== 前五行数据 ===
customerID gender SeniorCitizen ... Churn
0 7590-VHVEG Female 0 ... No
1 5575-GNVDE Male 0 ... No
=== 处理后的数据 ===
RangeIndex: 7043 entries, 0 to 7042
Data columns (total 18 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
...
16 Churn_No 7043 non-null bool
17 Churn_Yes 7043 non-null bool
18 gender_Female 7043 non-null bool
19 gender_Male 7043 non-null bool
=== 标签分布 ===
False 5174
True 1869
Name: flag, dtype: int64
最终数据形状: (7043, 17)
6 重难点与易错提醒
- ❗重点:Churn和gender列是object类型,需要one-hot编码。
- ❗重点:one-hot编码使用pd.get_dummies()。
- ❗重点:编码后会多出列,需要删除冗余列。
- ❗重点:数据集7043行16列,处理后18列,删除后17列。
- ⚠️易错:新版pandas不支持df.get_dummies(),需用pd.get_dummies()。
- ⚠️易错:字段名大小写(如Contract_Month)。
- 💡深入理解:one-hot编码将类别变量转换为数值变量。
7 课堂问答精选
Q: 什么是one-hot编码?
A: one-hot编码(热编码)是将类别变量转换为数值变量的方法。它将每个类别拆分为新列,原始值变为True/False(或0/1)。例如gender列有male和female两个值,编码后会生成gender_male和gender_female两列。
Q: 为什么要删除冗余列?
A: one-hot编码后,gender_male和gender_female互为相反(一个为True,另一个必为False),保留一列即可表示完整信息。删除冗余列可以减少特征数量,避免多重共线性。
8 本课小结
- 案例:电信用户流失预测。
- 数据集:7043行16列,无缺失值。
- 问题:Churn和gender是object类型。
- 解决:one-hot编码(pd.get_dummies)。
- 处理:删除冗余列(Churn_No, gender_male)。
- 标签:Churn_Yes → flag。
9 延伸思考与实践
- 实践:运行代码完成数据预处理。
- 预习:数据可视化。
- 思考:为什么one-hot编码后需要删除冗余列?