Python 中的倾向性二分类Logistic建模简单案例
本篇文章Propensity Modeling in Python: A Marketing Data Science Approach适合希望通过数据科学提升营销效果的读者。文章的技术亮点在于详细介绍了如何利用Python及其强大的库(如pandas和scikit-learn)构建倾向模型,帮助预测客户行为。适用场景包括精准营销、客户留存和广告投放优化等。实际案例展示了零售商和电信公司如何通过倾向评分提高转化率和降低流失率,具有很强的实用性和指导意义。
1 引言
倾向性建模是一种强大的数据科学技术,在营销中用于预测客户采取特定行动的可能性,例如购买产品、响应营销活动或流失。通过利用历史数据,这些模型可以帮助营销人员优化营销活动、高效分配资源并个性化客户体验。Python 及其强大的库,如 pandas、scikit-learn 和 statsmodels,是构建倾向性模型的理想平台。本文将探讨倾向性建模的原理、其在营销中的应用以及在 Python 中的实际实现。

倾向性建模涉及根据客户属性和行为预测二元或分类结果的概率。常见示例包括:
- 购买倾向性:客户购买产品的可能性。
- 流失倾向性:客户停止服务的可能性。
- 响应倾向性:客户响应营销活动的机会。
这些模型通常使用监督式机器学习,将结果(例如,购买或不购买)作为目标变量,将客户特征(例如,人口统计数据、购买历史)作为预测变量。输出是一个介于 0 和 1 之间的概率分数,使营销人员能够优先考虑高倾向性客户。
1.1 为什么倾向性建模在营销中很重要
- 精准营销:将精力集中在最有可能转化的客户身上,从而降低成本。
- 个性化:根据预测行为定制营销活动。
- 资源分配:通过优先考虑高价值细分市场来优化预算。
- 客户留存:识别有风险的客户以进行主动干预。
1.2 倾向性建模的关键步骤
构建倾向性模型涉及几个阶段,每个阶段对于生成准确且可操作的预测都至关重要。
1.2.1 问题定义
定义业务目标和目标结果。例如:
- 目标:提高电子邮件营销活动的响应率。
- 目标:预测哪些客户会点击促销电子邮件(1 = 点击,0 = 未点击)。
1.2.2 数据收集
收集相关数据,包括:
- 客户属性:年龄、性别、位置、收入。
- 行为数据:购买历史、网站访问、电子邮件打开。
- 结果数据:目标行动的历史记录(例如,营销活动响应)。
1.2.3 数据预处理
通过处理缺失值、编码分类变量和缩放特征来准备数据以进行建模。
1.2.4 模型选择
根据可解释性和性能需求选择合适的算法,例如逻辑回归、随机森林或梯度提升。
1.2.5 模型训练与评估
训练模型,使用 AUC-ROC 或精确度-召回率等指标验证其性能,并优化超参数。
1.2.6 部署与解释
使用模型对客户进行评分,将预测结果集成到营销系统中,并解释结果以指导策略。
1.3 Python 倾向性建模库
Python 的生态系统支持倾向性建模的每个阶段:
- 数据操作:
pandas用于数据清洗和转换。 - 机器学习:
scikit-learn用于模型训练和评估。 - 统计建模:
statsmodels用于可解释的逻辑回归。 - 可视化:
matplotlib和seaborn用于探索性数据分析 (EDA) 和模型洞察。 - 特征工程:
category_encoders用于编码分类变量。 - 模型解释:
SHAP用于解释预测结果。
2 在 Python 中构建倾向性模型
让我们通过一个完整的倾向性建模工作流程,使用合成数据集预测客户购买的可能性。
2.1 步骤 1:数据准备
假设我们有一个包含客户特征(年龄、收入、网站访问、先前购买)和二元目标(已购买:1 或 0)的数据集。
import pandas as pd
import numpy as np
np.random.seed(42)
n_samples = 1000
data = pd.DataFrame({
'age': np.random.randint(18, 80, n_samples),
'income': np.random.normal(60000, 15000, n_samples),
'website_visits': np.random.randint(0, 50, n_samples),
'prior_purchases': np.random.randint(0, 10, n_samples),
'purchased': np.random.choice([0, 1], n_samples, p=[0.7, 0.3])
})
data.to_csv('customer_data.csv', index=False)
2.2 步骤 2:探索性数据分析 (EDA)
探索数据以了解分布和关系。
import seaborn as sns
import matplotlib.pyplot as plt
print(data.describe())
sns.heatmap(data.corr(), annot=True, cmap='coolwarm')
plt.title('Correlation Heatmap')
plt.show()
sns.countplot(x='purchased', data=data)
plt.title('Purchase Distribution')
plt.show()
洞察:热力图揭示了相关性(例如,website_visits 和 prior_purchases 可能强烈预测购买)。计数图显示了类别不平衡(70% 未购买者),这表明可以使用过采样或类别权重等技术。
2.3 步骤 3:数据预处理
处理缺失值,编码分类变量(如果有),并缩放数值特征。
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
data = data.fillna(data.median())
X = data.drop('purchased', axis=1)
y = data['purchased']
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)
注意:缩放确保像 income 和 website_visits 这样的特征处于相同的尺度,从而提高模型性能。分层拆分保持目标类别的分布。
2.4 步骤 4:模型训练
逻辑回归是倾向性建模的常见选择,因为它具有可解释性和概率输出。
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, classification_report
model = LogisticRegression(class_weight='balanced', random_state=42)
model.fit(X_train_scaled, y_train)
y_pred_proba = model.predict_proba(X_test_scaled)[:, 1]
y_pred = model.predict(X_test_scaled)
print(f"AUC-ROC: {roc_auc_score(y_test, y_pred_proba):.4f}")
print(classification_report(y_test, y_pred))
输出示例:
AUC-ROC: 0.7854
precision recall f1-score support
0 0.75 0.82 0.78 140
1 0.52 0.42 0.47 60
accuracy 0.70 200
macro avg 0.64 0.62 0.63 200
weighted avg 0.69 0.70 0.69 200
解释:AUC-ROC 为 0.7854 表明具有不错的判别能力。该模型在正类别(购买者)的召回率方面表现不佳,这很可能是由于类别不平衡造成的。
2.5 步骤 5:使用梯度提升进行高级建模
为了获得更好的性能,可以尝试像 XGBoost 这样的梯度提升模型,它能够处理非线性关系和类别不平衡。
from xgboost import XGBClassifier
xgb_model = XGBClassifier(scale_pos_weight=2, random_state=42)
xgb_model.fit(X_train_scaled, y_train)
y_pred_proba_xgb = xgb_model.predict_proba(X_test_scaled)[:, 1]
y_pred_xgb = xgb_model.predict(X_test_scaled)
print(f"XGBoost AUC-ROC: {roc_auc_score(y_test, y_pred_proba_xgb):.4f}")
print(classification_report(y_test, y_pred_xgb))
输出示例:
XGBoost AUC-ROC: 0.8123
precision recall f1-score support
0 0.78 0.85 0.81 140
1 0.58 0.47 0.52 60
accuracy 0.73 200
macro avg 0.68 0.66 0.66 200
weighted avg 0.72 0.73 0.72 200
解释:XGBoost 将 AUC-ROC 提高到 0.8123,表明性能更好,尽管正类别的召回率仍然是一个挑战。
2.6 步骤 6:模型解释
使用 SHAP 解释模型预测,识别购买倾向性的关键驱动因素。
import shap
explainer = shap.TreeExplainer(xgb_model)
shap_values = explainer.shap_values(X_test_scaled)
shap.summary_plot(shap_values, X_test, feature_names=X.columns)
洞察:像 website_visits 和 prior_purchases 这样的特征可能具有较高的 SHAP 值,表明它们强烈影响购买可能性。
2.7 步骤 7:评分和部署
为客户提供倾向性概率评分,并将其集成到营销系统中。
data['propensity_score'] = xgb_model.predict_proba(scaler.transform(X))[:, 1]
top_prospects = data[data['propensity_score'] > 0.7][['age', 'income', 'propensity_score']]
top_prospects.to_csv('top_prospects.csv', index=False)
用例:向这些高倾向性客户提供个性化优惠,最大化营销活动的投资回报率。
3 营销中的实际应用
倾向性建模驱动着许多营销策略:
客户获取:识别可能购买的潜在客户,优化广告支出。
- 示例:一家零售商使用倾向性分数在社交媒体上投放广告,将转化率提高了 15%。
流失预防:预测有流失风险的客户并提供挽留激励。
- 示例:一家电信公司向高流失风险客户提供折扣,将流失率降低了 10%。
营销活动优化:优先考虑可能响应电子邮件或促销活动的客户。
- 示例:一个电子商务平台向高倾向性客户发送电子邮件,提高点击率。
交叉销售和向上销售:向可能购买的客户推荐其他产品。
- 示例:一家银行向具有高倾向性分数的客户提供信用卡,将办理率提高了 20%。
客户细分:根据倾向性对客户进行分组,以制定量身定制的营销策略。
- 示例:一项订阅服务将用户细分为高、中、低续订倾向性,并定制外展活动。
4 倾向性建模中的高级技术
4.1 处理类别不平衡
类别不平衡(例如,购买者很少)可能会使模型产生偏差。技术包括:
- 过采样:使用 SMOTE 生成合成的正样本。
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=42)
X_train_balanced, y_train_balanced = smote.fit_resample(X_train_scaled, y_train)
- 类别权重:调整逻辑回归或 XGBoost 等模型中的权重。
- 评估指标:关注 AUC-ROC、精确度-召回率或 F1-分数,而不是准确率。
4.2 特征工程
通过派生特征增强模型性能:
- 交互项:组合特征(例如,
age * income)。 - 行为聚合:计算平均购买频率等指标。
- 基于时间的特征:包括上次购买或网站访问的近因。
data['visit_purchase_ratio'] = data['website_visits'] / (data['prior_purchases'] + 1)
4.3 模型集成
组合多个模型(例如,逻辑回归、XGBoost、神经网络)以实现稳健的预测。
from sklearn.ensemble import VotingClassifier
ensemble = VotingClassifier(
estimators=[('lr', LogisticRegression()), ('xgb', XGBClassifier())],
voting='soft'
)
ensemble.fit(X_train_scaled, y_train)
4.4 因果推断
倾向性分数用于因果推断以估计治疗效果,例如营销活动的影响。
from causalinference import CausalModel
causal = CausalModel(
Y=data['purchased'].values,
D=data['campaign_exposure'].values,
X=data[['age', 'income']].values
)
causal.est_propensity()
5 挑战与限制
数据质量:不准确或不完整的数据可能导致不可靠的预测。
- 解决方案:投资于数据清洗和验证。
类别不平衡:稀有事件(例如,购买)会扭曲模型性能。
- 解决方案:使用 SMOTE、类别权重或过采样。
可解释性:像 XGBoost 这样复杂的模型更难向利益相关者解释。
- 解决方案:使用 SHAP 或更简单的模型(如逻辑回归)。
过拟合:模型可能过于紧密地拟合训练数据,从而降低泛化能力。
- 解决方案:使用交叉验证和正则化。
动态行为:客户行为随时间变化,需要更新模型。
- 解决方案:实施使用新数据进行再训练的管道。
6 案例研究:电子邮件营销活动优化
一家零售公司希望优化新产品发布的电子邮件营销活动。数据集包括客户人口统计数据、浏览历史和过去的营销活动响应。
6.1 工作流程
- 数据:加载包含年龄、收入、电子邮件打开和过去购买等特征的客户数据。
- 预处理:处理缺失值、编码分类变量并缩放特征。
- EDA:可视化相关性和响应率。
- 建模:训练 XGBoost 模型以预测响应倾向性。
- 评分:生成倾向性分数并选择前 10% 的客户。
- 部署:将分数导出到 CRM 系统以进行目标电子邮件发送。
代码片段:
df = pd.read_csv('campaign_data.csv')
X = df.drop('responded', axis=1)
y = df['responded']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
model = XGBClassifier(scale_pos_weight=3, random_state=42)
model.fit(X_train_scaled, y_train)
df['propensity_score'] = model.predict_proba(scaler.transform(X))[:, 1]
top_prospects = df.nlargest(int(0.1 * len(df)), 'propensity_score')
top_prospects.to_csv('campaign_targets.csv', index=False)
结果:通过针对高倾向性客户,该营销活动实现了 20% 的更高响应率,与全面营销活动相比降低了成本。
7 未来方向
- 自动化机器学习 (AutoML):像 Google 的数据科学代理 (2025 年 3 月) 这样的工具可以自动化倾向性模型的开发。
- 实时评分:将模型与 Kafka 等流媒体平台集成,以实现动态倾向性评分。
- 可解释性:SHAP 和 LIME 等工具的进步将提高营销团队的模型透明度。
- 大规模个性化:将倾向性模型与强化学习相结合,以实现自适应营销活动。
- 隐私保护技术:使用联邦学习或差分隐私来建模倾向性,同时不损害客户数据。
8 结论
Python 中的倾向性建模使营销人员能够预测客户行为、优化营销活动并增强个性化。通过利用 pandas、scikit-learn 和 XGBoost 等库,数据科学家可以构建强大的模型,从而推动业务价值。该过程涉及定义目标、预处理数据、训练模型和解释结果,其中逻辑回归和梯度提升等技术提供了灵活性和准确性。尽管存在类别不平衡和可解释性等挑战,但 SMOTE、SHAP 和集成等解决方案有效地解决了这些问题。随着营销数据科学的发展,倾向性建模仍将是基石,而 Python 提供了一个多功能平台来提供可操作的洞察和可衡量的投资回报率。
更多推荐


所有评论(0)