旅游网站用户留存预测:logistic回归实战与模型评估

发布时间:2026/10/6 14:19:16

旅游网站用户留存预测:logistic回归实战与模型评估 简介这份PDF文献面向从事用户行为分析、数据挖掘与推荐系统方向的研究者及工程技术人员以旅游网站为应用场景探讨如何借助机器学习技术预测访问用户的留存与流失情况属于偏应用型的学术参考文献。资源包内仅含1个PDF文件大小约1.87MB内容为期刊论文全文涵盖引言、机器学习基本原理、logistic回归模型推导及实验预测结果等完整章节便于直接阅读与引用。文中系统介绍了监督学习与自主学习的基本分类重点围绕logistic函数与多分类逻辑回归模型展开推导并对网站用户行为数据集进行预处理与按比例分类验证其服从相同统计分布后建立预测模型结果表明该模型能较准确地预估用户行为。目前已有251人学习适合需要了解用户留存分析、流失原因挖掘及logistic回归建模思路的读者参考也可作为相关课题的文献支撑与建模方法借鉴。1. 旅游网站用户留存预测一份能直接复现的 logistic 回归实战文档旅游网站每天有几十万用户访问但绝大多数最终都会流失。怎么提前识别哪些用户会留存、哪些会走掉这份文档给出的方案是用 logistic 回归建立用户行为预测模型基于某旅游网站 2016 年 7 月 15 日到 7 月 21 日的真实访问数据覆盖 348 596 个用户、35 个指标维度最终模型整体预测准确率约 67.8%负样本流失用户预测准确率达到 87.58%。文档完整记录了从数据预处理、变量选择、SPSS 建模操作到预测方程输出的全过程适合做机器学习入门项目、课程设计选题或者需要快速搭建用户流失预警基线模型的从业者。它不是纯理论推导而是一份带具体参数和操作路径的建模记录照着走能跑出结果。2. logistic 回归建模全流程从 35 个指标到预测方程2.1 为什么选 logistic 回归而不是随机森林文档里明确提到研究同时使用了 logistic 回归和随机森林两种算法做对比最终选择 logistic 回归作为主模型。原因不复杂用户留存预测的本质是一个二分类问题——用户要么留存label1要么流失label0。logistic 回归在这个场景下有天然优势。第一可解释性强。logistic 回归输出的是一组系数每个系数直接对应一个特征对留存概率的影响方向和大小。比如文档最终得到的预测方程里visit_to_buy的系数是 0.566nums_visit的系数是 1.402这意味着访问到购买的转化行为和访问次数对用户留存有正向影响而且访问次数的权重更大。这种系数级别的可解释性对业务方理解“用户为什么留存”至关重要。随机森林虽然预测能力可能更强但它是一个黑匣子你很难跟运营团队解释清楚某个特征到底起了多大作用。第二计算成本低。35 个指标、34 万条数据logistic 回归在 SPSS 17.0 这种桌面级软件上就能跑完不需要 GPU 集群。对于旅游网站这种需要快速迭代模型的场景低计算成本意味着可以更频繁地更新模型。第三概率输出直接可用。logistic 回归输出的是用户留存的概率值文档中设定概率大于 0.5 判定为留存label1否则为流失label0。这个阈值可以根据业务需求灵活调整——如果网站更关心“宁可错杀不可放过”可以把阈值调低如果更关心精确率可以把阈值调高。当然logistic 回归也有边界。它假设特征与 log-odds 之间是线性关系如果特征和留存概率之间存在复杂的非线性关系logistic 回归的表现会受限。文档中模型的正样本预测准确率只有 32.99%远低于负样本的 87.58%这很可能就是因为留存用户的行为模式更复杂线性模型难以完全捕捉。2.2 数据预处理与数据集划分文档使用的原始数据包含用户信息、酒店信息和浏览信息三类共 35 个指标。在建模之前需要做几件事。首先是缺失值处理。旅游网站的用户行为数据里很多字段天然存在缺失——比如用户没有评论过酒店hotel_comment_nums就是空的。常见做法是用中位数或众数填充或者把“是否缺失”本身作为一个特征。文档没有详细展开缺失值处理的具体方法但从最终模型能跑出结果来看缺失值应该是做了填充或剔除处理。其次是数据集划分。文档按照固定比例将数据分为训练集和测试集最终测试集包含 14 630 组数据。这里的关键是验证训练集和测试集的分类是否服从相同的统计分布——如果两个集合的分布差异太大模型在测试集上的表现就没有参考意义。常见做法是用分层抽样stratified sampling保证训练集和测试集中正负样本的比例一致。import pandas as pd from sklearn.model_selection import train_test_split # 假设 df 是原始数据label 是目标变量 # 检查正负样本比例 print(df[label].value_counts(normalizeTrue)) # 分层抽样划分数据集test_size0.2 表示测试集占 20% # stratifydf[label] 保证训练集和测试集的正负样本比例一致 train_df, test_df train_test_split( df, test_size0.2, random_state42, stratifydf[label] ) # 验证两个集合的分布是否一致 print(训练集 label 分布, train_df[label].value_counts(normalizeTrue)) print(测试集 label 分布, test_df[label].value_counts(normalizeTrue))这段代码的核心是stratify参数。如果不加这个参数随机划分可能导致训练集里留存用户占 15%、测试集里占 25%模型评估结果就会失真。random_state42是固定随机种子保证每次运行划分结果一致方便复现。2.3 SPSS 中的二元 logistic 回归操作路径文档使用的是 SPSS 17.0操作路径记录得很详细。虽然现在更多人用 Python 的 scikit-learn 或 statsmodels但理解 SPSS 的操作逻辑有助于理解模型参数的含义。在 SPSS 中的操作步骤是点击“分析”→“回归”→“二元 logistic”。然后设置因变量为label协变量选择hotel_comment_nums、id等特征。在“选项”中勾选“分类图”“Hosmer-Lemeshow 拟合度”“exp(B)”三项。输出选项选择“在最后一个步骤中”步进概率保持默认。这里重点说三个选项的作用。“Hosmer-Lemeshow 拟合度”检验的是模型预测值与实际观测值的吻合程度p 值大于 0.05 说明模型拟合良好。“exp(B)”输出的是优势比odds ratio表示某个特征每增加一个单位用户留存 odds 变化的倍数。“分类图”则直观展示模型在不同阈值下的分类表现。如果用 Python 复现对应的代码是import statsmodels.api as sm # 选择特征列 feature_cols [visit_to_buy, nums_visit, land_time, perfer_star, nums_order, fir_order_bu, weight_cust_value, hotel_uv, hotel_cr, low_price, weight_perfer_busi, cr_prefer, cust_cr, weight_comment_num, last_order_diff, cust_visit_pages] X train_df[feature_cols] y train_df[label] # 添加常数项statsmodels 默认不包含截距 X sm.add_constant(X) # 拟合 logistic 回归模型 model sm.Logit(y, X) result model.fit() # 输出模型摘要包含系数、标准误、p 值等 print(result.summary()) # 输出优势比 print(优势比) print(pd.DataFrame({ feature: feature_cols, coef: result.params[1:], odds_ratio: np.exp(result.params[1:]) }))sm.add_constant(X)这一步容易漏掉。statsmodels 的Logit默认不包含截距项如果不手动添加模型会强制过原点导致系数估计有偏。result.summary()输出的表格里P|z|列就是每个特征的显著性 p 值小于 0.05 说明该特征对留存预测有显著贡献。2.4 预测方程的参数解读文档最终给出的预测方程是p(y1) 1 / exp(0.644 0.566*visit_to_buy 1.402*nums_visit - 0.09*land_time 0.066*perfer_star - 0.238*nums_order 0.054*fir_order_bu - 0.176*weight_cust_value - 0.074*hotel_uv - 0.125*hotel_cr 0.075*low_price - 0.086*weight_perfer_busi - 0.051*cr_prefer - 0.385*cust_cr - 0.103*weight_comment_num 0.075*last_order_diff - 0.064*cust_visit_pages)这个方程里常数项是 0.644nums_visit访问次数的系数最大为 1.402说明访问次数是影响留存的最强正向因素。visit_to_buy访问到购买的转化系数 0.566也是正向影响。负向影响最大的特征是cust_cr客户转化率系数为 -0.385以及nums_order订单数系数为 -0.238。这里有一个反直觉的点nums_order的系数是负的意味着订单数越多留存概率反而越低这看起来不合理。可能的解释是nums_order和visit_to_buy之间存在多重共线性——下单多的用户可能本身就已经是高频访问用户visit_to_buy已经捕捉了这部分信息nums_order的负系数反映的是其他维度的效应。另一种可能是nums_order衡量的是历史订单总数而高历史订单用户可能已经进入生命周期末期留存概率自然下降。文档中模型的显著性检验结果是卡方统计量 χ² 4714.658自由度 df 21临界值 χ²临 32.5892p ≈ 0远小于 α 0.05。这说明模型整体是显著的。模型汇总表中对数似然值 52 829.756Cox and Snell R² 0.108Nagelkerke R² 0.146。这两个 R² 值都不高说明模型解释了留存行为中约 10%15% 的变异还有大量未捕捉的因素。这在用户行为预测中很常见——人的行为本身就有很大的随机性。3. 模型评估与踩坑排查准确率 67% 背后的细节3.1 分类表与评估指标的正确读法文档给出的分类表显示模型整体准确率 67.8%负样本流失用户预测准确率 87.63%正样本留存用户预测准确率 32.89%。测试集上的结果是整体准确率 67.59%正样本准确率 32.99%负样本准确率 87.58%。这里有一个非常容易踩的坑整体准确率 67.8% 看起来还不错但如果数据本身的正负样本比例就是 7:3 左右那么一个“全部预测为流失”的傻瓜模型也能达到 70% 的准确率。所以评估二分类模型时不能只看整体准确率必须看正样本的召回率和精确率。文档中正样本预测准确率只有 32.89%意味着模型预测为“留存”的用户中只有约三分之一真的留存了。这个精确率在业务上能不能用取决于场景。如果旅游网站用这个模型来筛选“高留存概率用户”做精准营销32.89% 的精确率意味着每触达 100 个用户只有 33 个是真正会留存的营销成本会比较高。但如果用来做“流失预警”负样本 87.58% 的准确率就很有价值——模型预测会流失的用户大概率真的会流失可以提前做挽留动作。from sklearn.metrics import confusion_matrix, classification_report # 在测试集上预测 X_test sm.add_constant(test_df[feature_cols]) y_pred_prob result.predict(X_test) y_pred (y_pred_prob 0.5).astype(int) # 输出混淆矩阵 print(混淆矩阵) print(confusion_matrix(test_df[label], y_pred)) # 输出分类报告包含精确率、召回率、F1 print(\n分类报告) print(classification_report(test_df[label], y_pred))confusion_matrix输出的四个数字分别是真负例TN、假正例FP、假负例FN、真正例TP。文档中 F 值是 43.76%这个 F1 值偏低主要就是被正样本的低精确率拖累了。3.2 避坑建模过程中最容易翻车的五个点现象一模型跑出来所有系数都是正的和业务常识矛盾。原因通常是特征之间存在严重的多重共线性。比如nums_visit和cust_visit_pages都是衡量访问行为的指标两者高度相关模型无法稳定估计各自的系数。解决办法是先计算特征间的相关系数矩阵把相关系数大于 0.8 的特征挑出来只保留业务含义更清晰的那个。或者用 VIF方差膨胀因子检验VIF 大于 10 就说明共线性严重。现象二训练集准确率 90%测试集只有 60%。这是典型的过拟合。logistic 回归虽然比深度学习模型简单但如果特征数量相对于样本量太多也会过拟合。文档中 35 个指标、34 万条数据样本量足够大过拟合风险较低。但如果你的数据集只有几千条就要考虑减少特征数量或者加 L2 正则化。在 statsmodels 中可以用model.fit_regularized()在 sklearn 中可以用LogisticRegression(penaltyl2, C1.0)。现象三Hosmer-Lemeshow 检验 p 值小于 0.05。这说明模型拟合度不够好预测值和实际值有系统性偏差。常见原因是遗漏了重要的非线性关系。比如年龄对留存的影响可能不是线性的——25 岁和 45 岁的用户留存率可能都高但 35 岁的用户留存率低。解决办法是把连续变量分箱或者加入多项式项。现象四预测概率全部集中在 0.40.6 之间。这说明模型的区分度不够无法把留存用户和流失用户拉开。原因可能是特征的信息量不足或者特征与 log-odds 的关系确实很弱。文档中 Nagelkerke R² 只有 0.146说明模型解释力有限。解决办法是引入更多特征比如用户的设备信息、访问时间段、页面停留时长等。现象五SPSS 输出的 exp(B) 值异常大或异常小。exp(B) 是优势比如果某个特征的 exp(B) 是 1000 以上说明该特征的一个单位变化会导致留存 odds 变化 1000 倍这通常不合理。原因可能是该特征的量纲太小比如以“元”为单位的消费金额系数会很大。解决办法是对连续特征做标准化处理让所有特征处于同一量纲。注意logistic 回归对异常值敏感。在建模前建议对连续特征做缩尾处理winsorize把超过 1% 和 99% 分位数的值替换为分位数本身避免极端值扭曲系数估计。4. 从 67% 到更高模型迭代与特征工程的实操技巧文档中的模型准确率停留在 67% 左右正样本精确率只有 33%。如果这是你的项目下一步该怎么提升我一般会从三个方向入手。第一个方向是特征工程。文档使用的 35 个指标里很多是原始计数或金额直接扔进模型效果有限。可以构造比率型特征比如“访问到购买的转化率 visit_to_buy / nums_visit”“平均每次访问的页面数 cust_visit_pages / nums_visit”。比率型特征往往比原始计数更有区分度。还可以构造时间窗口特征比如“最近 7 天的访问次数”“最近 30 天的订单数”捕捉用户行为的近期变化趋势。第二个方向是模型融合。logistic 回归的可解释性强但预测能力有限随机森林、XGBoost 等树模型的预测能力更强但可解释性差。可以把两者结合用 logistic 回归做基线模型输出概率用 XGBoost 做提升模型输出另一个概率最后用加权平均或 stacking 融合两个概率。文档中提到研究同时使用了 logistic 回归和随机森林但最终只展示了 logistic 回归的结果没有展示融合方案。如果补上融合正样本精确率可能有明显提升。第三个方向是阈值调优。文档中默认使用 0.5 作为分类阈值但这个阈值不一定最优。如果业务目标是“尽可能多地识别出会留存的用户”可以把阈值调低到 0.3提高正样本召回率如果业务目标是“精准触达”可以把阈值调高到 0.7提高正样本精确率。阈值的选择应该基于业务成本和收益来定而不是固定用 0.5。from sklearn.metrics import precision_recall_curve import matplotlib.pyplot as plt # 获取不同阈值下的精确率和召回率 precision, recall, thresholds precision_recall_curve( test_df[label], y_pred_prob ) # 找到 F1 最大的阈值 f1_scores 2 * precision * recall / (precision recall 1e-10) best_threshold thresholds[f1_scores.argmax()] print(f最佳阈值{best_threshold:.4f}) print(f该阈值下 F1{f1_scores.max():.4f}) # 绘制 P-R 曲线 plt.plot(recall, precision) plt.xlabel(召回率) plt.ylabel(精确率) plt.title(P-R 曲线) plt.show()这段代码帮你找到 F1 最大的阈值。precision_recall_curve返回的thresholds数组长度比precision和recall少一个所以计算 F1 时要注意对齐。找到最佳阈值后用y_pred (y_pred_prob best_threshold).astype(int)重新生成预测标签再跑一遍分类报告对比默认 0.5 阈值下的表现。还有一个容易被忽略的点文档中模型的负样本准确率高达 87.58%但正样本只有 32.99%。这种不对称的表现说明模型对“流失”的识别能力远强于“留存”。如果你的业务场景更关心留存预测可以考虑对正样本做过采样比如 SMOTE或者在损失函数中给正样本更高的权重。在 sklearn 中LogisticRegression(class_weightbalanced)会自动调整权重让模型更关注少数类。从那以后我每次做二分类模型都会先跑一遍class_weightbalanced的版本对比默认版本的表现再决定用哪个。这个习惯帮我避免了好几次“模型看起来准确率不错但业务方说没用”的尴尬。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/6 14:14:15

功放音箱线连接全攻略:从阻抗、极性到接头选型的底层逻辑

1. 连接前必须搞懂的几件事:线材、阻抗与信号的底层逻辑玩功放这件事,很多人一开始就纠结“换什么线”“买什么头”,结果喇叭端子松了、正负极反了,还在那儿怀疑功放推力不行,最后把好端端一套系统玩成玄学。我做这行十…

2026/10/6 14:14:15

LeetCode 208:手写Trie前缀树,搞定搜索联想与自动补全核心逻辑

面试场上被问到“你项目里的搜索联想是怎么做的”,很多人的第一反应是拉倒排索引。其实在数据规模不大、只想快速支持前缀匹配的场景里,一棵前缀树Trie往往更直接。LeetCode 208这道题——实现Trie(前缀树),常年霸占热…

2026/10/6 14:14:15

Spring Boot高校心理咨询管理系统设计与实现全解析

高校大学生心理咨询管理系统这种题目,在Java Spring Boot的课设和毕设里属于热度很高的类型。它不像电商、博客那些项目那么烂大街,业务逻辑又足够完整:有角色、有预约、有测评、有档案,前后端能串成一条清晰的主线。拿来做毕设、…

2026/10/6 15:14:21

单文件AI编码代理:GUI自动化与MCP协议实战

1. 项目概述:一个真正“开箱即用”的AI编码代理,不是概念演示,是能干活的工具 我最近花三周时间打磨了一个东西,名字就叫它“CodePilot Lite”——一个单文件、零依赖、不联网也能跑的AI编码代理。它不是那种需要你配环境、拉模型…

2026/10/6 15:14:21

思科N9K配置指南:NX-OS命令逻辑、vPC/FEX落地与避坑实践

简介:面向数据中心网络运维与云计算环境管理者的思科N9K系列产品配置命令说明书,系统梳理了N9K交换机在设备命名、功能特性开启、VLAN创建与管理地址分配、静态路由添加、端口接入、链路聚合、MTU调整、版本信息查看、运行配置查看与配置保存等高频场景下…

2026/10/6 15:14:21

单文件AI代理:MCP协议驱动的GUI自动化实践

1. 这不是“又一个AI编程助手”,而是一个能真正动手的数字分身 我去年在给一家做工业设备远程运维的客户做自动化方案时,遇到个典型场景:他们有套老旧的Windows桌面软件,界面是Delphi写的,没有API,也没有数…

2026/10/6 15:14:21

AI行业简报系统:人机协同三层过滤与结构化决策设计

1. 项目概述:这不是一份“新闻稿”,而是一套可复用的AI行业信息过滤系统“每日AI行业简报 - 2026-10-01”这个标题乍看像一份静态PDF或公众号推文,但在我过去八年持续运营技术类资讯栏目、为三家头部AI芯片公司搭建内部情报管道、并亲手维护过…

2026/10/6 15:14:21

电子图书馆网站设计:计算机网络课设中的VLAN划分与DNS/DHCP配置实战

简介:面向高校计算机网络课程设计的电子图书馆方案文档,聚焦网络工程专业学生及课程设计需求。方案立足电子图书馆实际应用,提出接入互联网、支持一百个以上站点、内部千兆主干百兆到点、划分至少四个子网的建设目标;围绕DNS、DHC…

2026/10/6 15:09:21

基于 langchain 的 RAG 问答应用实战:从搭建到调优

简介:面向大模型应用开发与RAG实战学习者,这份PDF以百度百科藜麦数据模拟私域数据,完整演示基于LangChain构建检索增强问答系统的流程,覆盖环境搭建、本地数据加载、文本分割、向量化入库与检索问答等关键环节,适合准备…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/5 17:38:27

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑