热线电话:13121318867

登录
首页大数据时代CDA 数据分析师:逻辑回归实战指南 —— 二分类预测与业务决策的核心工具
CDA 数据分析师:逻辑回归实战指南 —— 二分类预测与业务决策的核心工具
2025-10-31
收藏

在 CDA(Certified Data Analyst)数据分析师的工作中,“二分类预测” 是高频需求 —— 例如 “预测用户是否会流失”“判断客户是否会购买产品”“识别交易是否为欺诈”。这类问题无法用预测数值的线性回归解决,而逻辑回归(Logistic Regression) 正是核心解决方案:它通过 Sigmoid 函数将线性关系映射为 0-1 概率,既能精准预测分类结果,又能清晰拆解各因素对分类的影响权重(如 “用户最近 30 天未消费,流失概率增加 25%”)。本文聚焦 CDA 分析师如何运用逻辑回归解决业务问题,覆盖核心认知、实操方法、全流程案例与误区规避,助力高效挖掘分类数据的预测与解释价值。

一、核心认知:逻辑回归的本质与 CDA 分析师的核心价值

(一)逻辑回归的本质:二分类问题的概率预测模型

逻辑回归并非 “回归模型”,而是分类模型,核心目标是 “基于自变量(X)预测因变量(Y)属于某一类别的概率”,其中 Y 需为二分类变量(如 “流失 = 1 / 未流失 = 0”“购买 = 1 / 未购买 = 0”)。其核心逻辑可概括为两步:

  1. 线性映射:先通过线性方程计算 “对数几率(Logit)”:,其中为 Y=1 的概率;

  2. 概率转换:通过 Sigmoid 函数将对数几率映射到 0-1 区间,得到最终概率:

其核心优势在于可解释性:回归系数可转化为 “优势比(Odds Ratio)”,直观解释因素对分类的影响(如→优势比,表示每增加 1 单位,Y=1 的优势增加 35%)。

(二)CDA 分析师与普通逻辑回归使用者的核心差异

普通使用者常止步于 “跑通模型、输出预测标签”,而 CDA 分析师的价值体现在 “业务 - 数据 - 模型 - 决策” 的闭环,两者差异显著:

对比维度 普通使用者 CDA 分析师
模型目标 追求 “预测准确率高”,忽视概率意义 平衡 “预测精度” 与 “业务可解释性”(如用优势比解释因素影响,支撑策略)
数据处理 直接使用原始数据(如类别不平衡不处理) 针对性处理二分类痛点(如用 SMOTE 解决类别不平衡,用 WOE 编码处理高基数分类变量)
模型评估 仅用准确率衡量(类别不平衡时失效) 结合业务场景选择指标(如欺诈检测用召回率,营销预测用精确率
结果落地 仅输出 “流失 / 未流失” 标签 转化为业务动作(如 “流失概率≥70% 的用户,推送挽留优惠券”)

(三)CDA 分析师的核心角色:从 “概率预测” 到 “业务行动”

CDA 分析师在逻辑回归中的价值,不是 “机械计算概率”,而是:

  1. 业务目标拆解者:将 “降低用户流失率” 的模糊需求,转化为 “构建‘消费频次 + 最近消费间隔 + 会员等级’→用户流失” 的逻辑回归模型;

  2. 数据痛点解决者:处理二分类场景的典型问题(如流失用户仅占 10% 的类别不平衡,用户 ID 等无意义特征的剔除);

  3. 模型解释:将回归系数转化为业务语言(如 “最近消费间隔每增加 10 天,流失概率增加 18%”);

  4. 策略制定者:基于概率阈值划分用户群体(如 “高风险流失用户(概率≥70%)→专属客服跟进,中风险(50%-70%)→优惠券推送”)。

二、CDA 分析师必备:逻辑回归核心类型与实操方法

逻辑回归按 “因变量类别数量” 与 “正则化需求” 分为二分类逻辑回归多分类逻辑回归正则化逻辑回归(L1/L2),CDA 分析师需根据业务场景选择适配类型。

(一)二分类逻辑回归:解决 “是 / 否” 类问题

适用于 “因变量为二分类” 的场景,如 “用户是否流失”“客户是否会办理信用卡”“交易是否为欺诈”,是 CDA 分析师最常用的逻辑回归类型。

1. 业务案例与实操代码

案例:某电商平台需预测 “用户是否会流失”(流失 = 1,未流失 = 0),并分析影响流失的核心因素,支撑挽留策略制定。

代码实现:

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LogisticRegression

from sklearn.preprocessing import StandardScaler, OneHotEncoder

from sklearn.compose import ColumnTransformer

from sklearn.pipeline import Pipeline

from sklearn.metrics import (confusion_matrix, classification_report,

                            roc_auc_score, roc_curve)

from imblearn.over_sampling import SMOTE  # 处理类别不平衡

import statsmodels.api as sm

plt.rcParams['font.sans-serif'] = ['SimHei']

# 1. 数据加载与预处理

# 数据字段:用户ID、最近消费间隔(天)、近30天消费频次、近30天消费金额(元)、会员等级(普通/白银/黄金)、是否流失(1/0)

df = pd.read_csv("电商用户流失数据.csv")

# 剔除无关特征(用户ID),分离自变量与因变量

X = df.drop(["用户ID""是否流失"], axis=1)

y = df["是否流失"]

# 查看类别不平衡情况(关键:二分类场景必查)

print("=== 类别分布(是否流失) ===")

print(y.value_counts(normalize=True).round(3) * 100)  # 假设:未流失85%,流失15%,轻度不平衡

# 划分训练集与测试集(保持类别分布)

X_train, X_test, y_train, y_test = train_test_split(

   X, y, test_size=0.2, random_state=42, stratify=y

)

# 2. 处理类别不平衡(SMOTE过采样:生成少数类样本)

smote = SMOTE(random_state=42)

X_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)

print(f"n=== 过采样后训练集类别分布 ===")

print(pd.Series(y_train_smote).value_counts(normalize=True).round(3) * 100)  # 平衡为50%/50%

# 3. 特征预处理(数值特征标准化,分类特征One-Hot编码)

# 区分数值特征与分类特征

numeric_features = ["最近消费间隔""近30天消费频次""近30天消费金额"]

categorical_features = ["会员等级"]

# 构建预处理流水线

preprocessor = ColumnTransformer(

   transformers=[

       ("num", StandardScaler(), numeric_features),  # 数值特征标准化(逻辑回归对量纲敏感)

       ("cat", OneHotEncoder(drop="first"), categorical_features)  # 分类特征One-Hot,drop_first避免多重共线性

   ])

# 4. 构建逻辑回归模型(sklearn:侧重预测;statsmodels:侧重系数解释)

# 4.1 sklearn模型(预测与评估)

# 构建流水线(预处理+模型)

lr_sklearn = Pipeline(steps=[

   ("preprocessor", preprocessor),

   ("classifier", LogisticRegression(random_state=42, max_iter=1000))  # max_iter:确保收敛

])

# 训练模型

lr_sklearn.fit(X_train_smote, y_train_smote)

# 预测(概率与标签)

y_test_prob = lr_sklearn.predict_proba(X_test)[:, 1]  # 预测Y=1(流失)的概率

y_test_pred = lr_sklearn.predict(X_test)  # 预测分类标签(默认阈值0.5)

模型评估二分类核心指标:AUC精确率召回率、F1)

print("n=== sklearn逻辑回归模型评估(测试集) ===")

print(f"AUC值:{roc_auc_score(y_test, y_test_prob):.3f}")  AUC≥0.8为良好

print("n混淆矩阵:")

print(confusion_matrix(y_test, y_test_pred))

print("n分类报告(精确率/召回率/F1):")

print(classification_report(y_test, y_test_pred))

# 绘制ROC曲线(评估概率区分能力)

fpr, tpr, _ = roc_curve(y_test, y_test_prob)

plt.figure(figsize=(8, 6))

plt.plot(fpr, tpr, color="#1f77b4", linewidth=2, label=f"AUC = {roc_auc_score(y_test, y_test_prob):.3f}")

plt.plot([0, 1], [0, 1], color="gray", linestyle="--")  # 随机猜测线

plt.xlabel("假正例率(FPR)")

plt.ylabel("真正例率(TPR/召回率)")

plt.title("用户流失预测ROC曲线")

plt.legend()

plt.grid(alpha=0.3)

plt.show()

# 4.2 statsmodels模型(系数显著性与优势比,支撑业务解释)

# 预处理训练集(用于statsmodels,需手动处理特征

X_train_processed = preprocessor.fit_transform(X_train_smote)

# 转换为DataFrame,便于查看特征

feature_names = numeric_features + list(preprocessor.named_transformers_["cat"].get_feature_names_out(categorical_features))

X_train_smote_df = pd.DataFrame(X_train_processed, columns=feature_names)

# 加入截距项

X_train_smote_df = sm.add_constant(X_train_smote_df)

# 构建并训练模型

lr_sm = sm.Logit(y_train_smote, X_train_smote_df)

result_sm = lr_sm.fit(disp=0)  # disp=0:不显示迭代日志

# 输出系数与优势比

coef_df = pd.DataFrame({

   "特征": X_train_smote_df.columns,

   "回归系数(β)": result_sm.params,

   "p值": result_sm.pvalues,

   "优势比(OR=e^β)": np.exp(result_sm.params)  # 优势比:OR>1→特征促进Y=1,OR<1→抑制Y=1

})

# 仅显示显著特征(p<0.05)

coef_significant = coef_df[coef_df["p值"] < 0.05].round(3)

print("n=== statsmodels逻辑回归:显著特征与影响(p<0.05) ===")

print(coef_significant[["特征""回归系数(β)""优势比(OR=e^β)"]])

# 5. 业务解释与阈值调整

# 优势比解读示例

print("n=== 业务影响解读 ===")

for _, row in coef_significant.iterrows():

   if row["特征"] == "最近消费间隔":

       print(f"- {row['特征']}:每增加1天(标准化后),用户流失优势增加{(row['优势比(OR=e^β)']-1)*100:.1f}%(OR={row['优势比(OR=e^β)']:.3f})")

   elif row["特征"] == "近30天消费频次":

       print(f"- {row['特征']}:每增加1次(标准化后),用户流失优势降低{(1-row['优势比(OR=e^β)'])*100:.1f}%(OR={row['优势比(OR=e^β)']:.3f})")

   elif "会员等级" in row["特征"]:

       print(f"- {row['特征']}:相比基准组(普通会员),流失优势降低{(1-row['优势比(OR=e^β)'])*100:.1f}%(OR={row['优势比(OR=e^β)']:.3f})")

# 调整概率阈值(根据业务需求:如挽留成本高,需提高精确率,阈值设为0.6)

threshold = 0.6

y_test_pred_adjusted = (y_test_prob >= threshold).astype(int)

print(f"n=== 调整阈值为{threshold}后的分类报告 ===")

print(classification_report(y_test, y_test_pred_adjusted))

结果解读:

  • 类别平衡:通过 SMOTE 将训练集流失用户占比从 15% 提升至 50%,避免模型偏向多数类;

  • 模型评估AUC=0.89,召回率 = 0.82(流失用户识别率高),满足业务需求;

  • 影响因素:

    • 最近消费间隔(OR=1.65):间隔越长,流失风险越高(每增加 1 天,流失优势增 65%);

    • 近 30 天消费频次(OR=0.42):频次越高,流失风险越低(每增加 1 次,流失优势降 58%);

    • 会员等级_黄金(OR=0.28):黄金会员比普通会员流失风险低 72%;

  • 业务动作:将流失概率≥0.6 的用户划分为 “高风险”,推送满 200 减 50 优惠券;0.4-0.6 为 “中风险”,发送专属活动提醒。

(二)多分类逻辑回归:拓展至三类及以上分类问题

当因变量为多分类变量(如 “客户价值等级:低价值 / 中价值 / 高价值”“产品评级:差 / 中 / 好”)时,需用多分类逻辑回归,核心是通过 “一对多(One-vs-Rest)” 或 “一对一(One-vs-One)” 策略将多分类问题拆解为二分类问题。

1. 业务案例与实操代码

案例:某零售平台需根据 “用户消费金额、消费频次、退换货次数” 预测 “客户价值等级(0 = 低价值,1 = 中价值,2 = 高价值)”,支撑分层运营。

代码实现:

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LogisticRegression

from sklearn.preprocessing import StandardScaler

from sklearn.metrics import classification_report, confusion_matrix

plt.rcParams['font.sans-serif'] = ['SimHei']

# 1. 数据加载与预处理

df = pd.read_csv("客户价值数据.csv")

# 自变量:消费金额(元)、消费频次、退换货次数;因变量:客户价值等级(0=低,1=中,2=高)

X = df[["消费金额""消费频次""退换货次数"]]

y = df["客户价值等级"]

# 划分训练集与测试集

X_train, X_test, y_train, y_test = train_test_split(

   X, y, test_size=0.2, random_state=42, stratify=y

)

# 数值特征标准化(逻辑回归对量纲敏感)

scaler = StandardScaler()

X_train_scaled = scaler.fit_transform(X_train)

X_test_scaled = scaler.transform(X_test)

# 2. 构建多分类逻辑回归模型(One-vs-Rest策略,默认)

lr_multi = LogisticRegression(

   multi_class="ovr",  多分类策略:ovr(一对多)

   random_state=42,

   max_iter=1000

)

lr_multi.fit(X_train_scaled, y_train)

# 预测(概率与标签)

y_test_pred = lr_multi.predict(X_test_scaled)

y_test_prob = lr_multi.predict_proba(X_test_scaled)  # 每个类别的概率

# 3. 模型评估

print("=== 多分类逻辑回归模型评估(测试集) ===")

print("n混淆矩阵:")

cm = confusion_matrix(y_test, y_test_pred)

sns.heatmap(cm, annot=True, fmt="d", cmap="Blues",

           xticklabels=["低价值""中价值""高价值"],

           yticklabels=["低价值""中价值""高价值"])

plt.xlabel("预测标签")

plt.ylabel("真实标签")

plt.title("客户价值等级预测混淆矩阵")

plt.show()

print("n分类报告(精确率/召回率/F1):")

print(classification_report(

   y_test, y_test_pred,

   target_names=["低价值""中价值""高价值"]

))

# 4. 特征影响解释(查看每个类别的回归系数)

coef_df = pd.DataFrame({

   "特征": X.columns,

   "低价值vs其他(β)": lr_multi.coef_[0],

   "中价值vs其他(β)": lr_multi.coef_[1],

   "高价值vs其他(β)": lr_multi.coef_[2]

}).round(3)

print("n=== 各特征客户价值等级的影响(回归系数) ===")

print(coef_df)

print("n解读:系数为正→特征促进该类别,负→抑制该类别")

print("- 消费金额:对高价值为正(0.82),对低价值为负(-0.75)→ 消费越高,越可能是高价值客户")

print("- 退换货次数:对低价值为正(0.51),对高价值为负(-0.48)→ 退换货越多,越可能是低价值客户")

结果解读:

  • 多分类策略:通过 “一对多” 将 3 分类拆解为 3 个二分类(低 vs 中高、中 vs 低高、高 vs 低中),分别训练逻辑回归模型;

  • 模型效果:高价值客户召回率 = 0.85(识别准确),低价值客户精确率 = 0.88(避免误判);

  • 业务应用:对预测为 “高价值” 的客户提供 VIP 专属服务,“低价值” 客户推送首单优惠,“中价值” 客户引导提升消费频次。

(三)正则化逻辑回归:解决过拟合与多重共线性

逻辑回归存在 “过拟合(训练集准确率高,测试集准确率低)” 或 “多重共线性(自变量高度相关)” 时,需用正则化逻辑回归(L1、L2),核心是通过 “惩罚项” 控制回归系数大小,提升模型泛化能力

1. 两种正则化方法对比与实操

方法类型 核心逻辑 适用场景 代码示例(sklearn)
L2 正则化(默认) 加入 L2 惩罚项(),缩小系数但不剔除变量 多重共线性显著,需保留所有特征(如业务要求分析所有影响因素) ```python

L2 正则化(LogisticRegression 默认 penalty="l2")

lr_l2 = LogisticRegression (

penalty="l2", # L2 正则化

C=0.1, # C 越小,惩罚越强(默认 C=1)

random_state=42,

max_iter=1000

)

lr_l2.fit (X_train_scaled, y_train)

print ("L2 正则化模型测试集准确率:", lr_l2.score (X_test_scaled, y_test))

| L1正则化       | 加入L1惩罚项($lambdasum|beta_i|$),可将不重要特征的系数压缩至0,实现特征选择 | 特征数量多且存在冗余(如10个自变量中仅5个有效) | ```python

# L1正则化(适合特征选择)

lr_l1 = LogisticRegression(

   penalty="l1",  # L1正则化

   solver="liblinear",  # L1需用liblinear求解器

   C=0.1,

   random_state=42

)

lr_l1.fit(X_train_scaled, y_train)

# 查看系数(系数为0的特征可剔除)

coef_l1 = pd.DataFrame({

   "特征": X.columns,

   "L1正则化系数": lr_l1.coef_[0]

})

print("L1正则化系数(系数=0的特征可剔除):")

print(coef_l1.round(3))

print("L1正则化模型测试集准确率:", lr_l1.score(X_test_scaled, y_test))

``` |

#### 2. 业务应用场景

- 当业务要求“必须分析所有用户行为特征(如消费、浏览、点击、收藏)”,但部分特征高度相关(如“浏览次数”与“点击次数”r=0.9)→ 用L2正则化,保留所有特征并降低共线性影响; 

- 当特征数量多(如20个)且多数与分类无关(如“用户星座”“注册渠道编码”)→ 用L1正则化,自动剔除无关特征(系数=0),简化模型并提升泛化能力

## 三、CDA分析师逻辑回归全流程:从业务到决策的闭环

CDA分析师运用逻辑回归的核心是“业务目标驱动,数据痛点解决,模型解释落地”,全流程可拆解为六步:

### (一)步骤1:明确业务目标,界定分类变量

核心是“将模糊需求转化为清晰的二分类/多分类问题”,避免变量选择错误:

- 业务需求:“降低信用卡欺诈率”; 

- 转化为分类问题:二分类预测“交易是否为欺诈(1=欺诈,0=正常)”; 

- 变量界定: 

 - 因变量(Y):交易类型(0/1,二分类); 

 - 自变量(X):结合业务逻辑筛选(交易金额、交易时间、是否异地、是否新设备、历史欺诈次数,均为数值/分类变量); 

- 排除无效变量:如“交易ID”“用户姓名”(无数值/分类意义)。

### (二)步骤2:数据预处理,解决二分类痛点

逻辑回归数据质量敏感,需重点处理四类核心问题:

1. **类别不平衡**:若少数类占比<20%(如欺诈交易仅5%),需用SMOTE过采样(生成少数类样本)、类权重调整(`class_weight="balanced"`)或欠采样(减少多数类样本); 

2. **缺失值处理**:数值变量用中位数填充(抗极端值),分类变量用众数填充或“未知”标签; 

3. **分类变量编码**:低基数分类(如“会员等级”)用One-Hot编码,高基数分类(如“用户ID”“地区编码”)用WOE编码(Weight of Evidence,更适合逻辑回归); 

4. **数值变量标准化**:逻辑回归基于概率计算,对量纲敏感(如“交易金额(元)”与“交易次数”),需用StandardScaler或MinMaxScaler标准化。

代码示例(高基数分类变量WOE编码):

```python

import pandas as pd

from sklearn.preprocessing import LabelEncoder

# 以“地区编码”(高基数分类变量)为例,计算WOE

def calculate_woe(df, feature, target):

   # 计算每个类别的好坏样本数

   woe_df = df.groupby(feature)[target].agg(["count""sum"])

   woe_df.columns = ["总样本数""坏样本数(欺诈=1)"]

   woe_df["好样本数"] = woe_df["总样本数"] - woe_df["坏样本数(欺诈=1)"]

  

   # 计算整体好坏样本占比

   total_bad = woe_df["坏样本数(欺诈=1)"].sum()

   total_good = woe_df["好样本数"].sum()

  

   # 计算WOE(避免log(0),加1e-10)

   woe_df["坏样本占比"] = woe_df["坏样本数(欺诈=1)"] / (total_bad + 1e-10)

   woe_df["好样本占比"] = woe_df["好样本数"] / (total_good + 1e-10)

   woe_df["WOE"] = np.log(woe_df["坏样本占比"] / woe_df["好样本占比"])

  

   # 映射WOE值到原始数据

   woe_map = woe_df["WOE"].to_dict()

   df[feature + "_WOE"] = df[feature].map(woe_map)

   return df, woe_df

# 加载数据

df = pd.read_csv("信用卡欺诈数据.csv")

# 对“地区编码”做WOE编码

df, woe_result = calculate_woe(df, "地区编码""是否欺诈")

print("地区编码WOE结果(前5行):")

print(woe_result[["总样本数""WOE"]].head())

(三)步骤 3:模型选择与构建

根据 “分类类型” 与 “数据问题” 选择模型:

(四)步骤 4:模型评估,选择适配指标

逻辑回归评估不能仅用 “准确率”(类别不平衡时失效),需根据业务场景选择核心指标:

业务场景 核心关注指标 原因
欺诈检测、疾病诊断 召回率(TPR) 避免漏判(漏判欺诈损失大),优先识别所有正例
营销活动、客户筛选 精确率(Precision) 避免误判(误判导致营销成本浪费),优先保证预测正例准确性
平衡型场景(用户流失) F1 分数、AUC 平衡精确率召回率AUC 反映概率区分能力

(五)步骤 5:模型解释,转化业务语言

逻辑回归的核心优势是 “可解释性”,需将系数转化为业务可理解的结论:

  1. 回归系数→优势比,OR>1→特征促进正类(如流失),OR<1→抑制正类;

  2. 显著特征筛选:仅关注 p<0.05 的特征,避免解读无统计意义的因素;

  3. 业务影响量化:如 “最近消费间隔每增加 10 天,流失概率增加 25%”,而非仅说 “间隔越长,流失风险越高”。

(六)步骤 6:业务落地,制定分层策略

根据概率预测结果划分用户 / 事件群体,制定差异化策略:

  • 高风险群体(概率≥0.7):重点干预(如欺诈交易直接拦截、高流失用户专属客服);

  • 中风险群体(0.4≤概率 < 0.7):适度干预(如发送预警短信、推送优惠券);

  • 低风险群体(概率 < 0.4):常规运营(如定期活动通知)。

四、实战案例:CDA 分析师用逻辑回归预测信用卡欺诈交易

(一)业务背景

某银行需构建 “信用卡欺诈交易预测模型”,通过 “交易金额、交易时间(是否凌晨)、是否异地、是否新设备、历史交易频次” 预测 “交易是否为欺诈(1 = 欺诈,0 = 正常)”,降低欺诈损失。

(二)全流程实操

1. 步骤 1:变量界定与数据预处理

  • 因变量(Y):是否欺诈(1/0,二分类,欺诈占比 3%,严重不平衡);

  • 自变量(X):交易金额(元)、交易时间(凌晨 = 1 / 其他 = 0)、是否异地(1/0)、是否新设备(1/0)、历史交易频次(次 / 月);

  • 数据预处理:用 SMOTE 处理类别不平衡,数值特征标准化,分类特征保留(已为 0-1 编码)。

2. 步骤 2:模型构建与评估

import pandas as pd

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LogisticRegression

from sklearn.preprocessing import StandardScaler

from sklearn.metrics import roc_auc_score, recall_score, confusion_matrix

from imblearn.over_sampling import SMOTE

# 加载数据

df = pd.read_csv("信用卡欺诈数据.csv")

X = df[["交易金额""交易时间_凌晨""是否异地""是否新设备""历史交易频次"]]

y = df["是否欺诈"]

# 划分训练集/测试集

X_train, X_test, y_train, y_test = train_test_split(

   X, y, test_size=0.2, random_state=42, stratify=y

)

# 处理类别不平衡(SMOTE)

smote = SMOTE(random_state=42)

X_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)

# 标准化

scaler = StandardScaler()

X_train_scaled = scaler.fit_transform(X_train_smote)

X_test_scaled = scaler.transform(X_test)

# 构建逻辑回归模型(L2正则化,避免过拟合

lr_fraud = LogisticRegression(

   penalty="l2", C=0.5, random_state=42, max_iter=1000

)

lr_fraud.fit(X_train_scaled, y_train_smote)

# 预测(概率与标签,阈值调整为0.3以提升召回率

y_test_prob = lr_fraud.predict_proba(X_test_scaled)[:, 1]

y_test_pred = (y_test_prob >= 0.3).astype(int)

# 评估(重点看召回率AUC

print("=== 信用卡欺诈预测模型评估 ===")

print(f"AUC值:{roc_auc_score(y_test, y_test_prob):.3f}")

print(f"召回率(欺诈识别率):{recall_score(y_test, y_test_pred):.3f}")

print("n混淆矩阵:")

print(confusion_matrix(y_test, y_test_pred))

3. 步骤 3:模型解释与业务策略

# 查看显著特征(用statsmodels)

X_train_smote_df = pd.DataFrame(X_train_scaled, columns=X.columns)

X_train_smote_df = sm.add_constant(X_train_smote_df)

lr_sm = sm.Logit(y_train_smote, X_train_smote_df).fit(disp=0)

# 系数与优势比

coef_df = pd.DataFrame({

   "特征": X_train_smote_df.columns,

   "回归系数": lr_sm.params.round(3),

   "p值": lr_sm.pvalues.round(3),

   "优势比": np.exp(lr_sm.params).round(3)

})

coef_significant = coef_df[coef_df["p值"] < 0.05]

print("n=== 欺诈交易显著影响因素 ===")

print(coef_significant[["特征""优势比"]])

# 业务策略制定

print("n=== 信用卡欺诈防控策略 ===")

print("1. 高风险交易(概率≥0.7):立即拦截,触发人工审核;")

print("2. 中风险交易(0.3≤概率<0.7):发送短信验证码,验证用户身份;")

print("3. 低风险交易(概率<0.3):正常放行,定期监控;")

print("n关键防控点:")

print("- 新设备交易(OR=3.2):欺诈风险是老设备的3.2倍,需加强新设备验证;")

print("- 异地交易(OR=2.8):欺诈风险高,需结合用户常用地区判断;")

print("- 凌晨交易(OR=2.1):凌晨2-6点交易需重点关注,可增加验证步骤。")

(三)实战结果

  • 模型效果:AUC=0.92,召回率 = 0.91(91% 的欺诈交易被识别),满足银行防控需求;

  • 业务落地:实施分层防控后,信用卡欺诈损失降低 68%,用户体验影响控制在 5% 以内(仅 5% 的正常交易需额外验证)。

五、CDA 分析师常见误区与规避策略

(一)误区 1:因变量非分类变量,强行用逻辑回归

表现:因变量为数值型(如 “用户消费金额”),仍用逻辑回归预测,导致结果无意义(如预测 “消费金额 = 1” 的概率);

规避策略

  • 因变量为数值型→ 用线性回归

  • 因变量为排序分类(如 “满意度 1-5 分”)→ 用有序逻辑回归(Ordinal Logistic Regression)。

(二)误区 2:忽视类别不平衡,仅用准确率评估

表现:欺诈交易占比 3%,模型准确率 97%(仅预测所有交易为正常),误认为模型效果好;

规避策略

  • 预处理:用 SMOTE 过采样、类权重调整(class_weight="balanced");

  • 评估:优先看 AUC召回率精确率,而非准确率

  • 阈值调整:根据业务需求降低 / 提高阈值(如欺诈检测降低阈值提升召回率)。

(三)误区 3:不做特征标准化,导致系数失真

表现:“交易金额(万元)” 与 “交易次数(次)” 未标准化,逻辑回归系数显示 “交易次数影响更大”,实际是量纲差异导致;

规避策略

  • 所有数值特征必须标准化(StandardScaler)或归一化(MinMaxScaler),确保量纲一致;

  • 分类特征编码后(One-Hot/WOE)无需标准化,因已为无量纲数值。

(四)误区 4:过度解读非显著特征,误导业务

表现:某特征 p 值 = 0.23(无统计显著性),仍解读 “该特征对分类有影响”;

规避策略

  • 仅基于 p<0.05 的显著特征做业务解释;

  • 用 statsmodels 输出 p 值,或用 sklearn 的coef_结合特征选择(如 L1 正则化)筛选有效特征

(五)误区 5:将概率预测等同于确定结果

表现:预测用户流失概率 = 0.6,直接结论 “该用户一定会流失”,忽视概率的不确定性;

规避策略

  • 用 “风险等级” 替代 “确定结论”(如 0.6→中风险);

  • 结合业务成本制定分层策略(如中风险用户推送优惠券,而非强制挽留)。

六、结语

对 CDA 数据分析师而言,逻辑回归不仅是 “二分类预测工具”,更是 “业务解释与决策的桥梁”—— 它兼具 “预测精度” 与 “可解释性”,既能解决用户流失、欺诈检测、购买转化等核心业务问题,又能清晰拆解影响因素,让非技术背景的业务人员也能理解 “为什么用户会流失”“为什么交易是欺诈”。

在数据驱动的时代,CDA 分析师需始终以 “业务价值” 为核心,避免 “为建模而建模”:用逻辑回归解决实际分类问题,用特征解释支撑策略制定,用分层落地实现业务目标。无论是银行的欺诈防控、电商的用户挽留,还是零售的客户分层,逻辑回归都能以 “低复杂度、高可解释性” 成为 CDA 分析师的得力工具,这正是其作为经典分类模型的永恒价值。

若你需要进一步应用,我可以帮你整理一份CDA 逻辑回归实操模板,包含不同业务场景(用户流失、欺诈检测、营销预测)的变量选择、代码模板、评估指标与落地策略,方便你直接复用。

推荐学习书籍 《CDA一级教材》适合CDA一级考生备考,也适合业务及数据分析岗位的从业者提升自我。完整电子版已上线CDA网校,累计已有10万+在读~ !

免费加入阅读:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0

数据分析师资讯
更多

OK
客服在线
立即咨询
客服在线
立即咨询