资讯动态

再犯概率预测实战:逻辑回归与随机森林的对比与落地风险控制

发布时间:2026/10/13 5:08:33 来源:尧图企业网站定制
做再犯风险评估这个方向有段时间了今天把系列里第30期的内容好好整理一下。这个系列我拆过不少机器学习应用场景但再犯概率预测一直是最需要谨慎对待的方向。30期这一篇我们把逻辑回归和随机森林放在同一份数据集上完整走一遍训练流程目标很明确搞清楚在再犯概率预测这种高风险、高不对称成本的场景里线性模型和树模型各自能做到什么程度哪些指标真正有价值哪些坑真的一踩一个准。先说结论如果只看准确率两个模型可能都差不多但一旦把场景拉到真实的“再犯概率”语境里逻辑回归的可解释性和随机森林的非线性拟合能力会形成非常鲜明的对比。这篇博文从数据准备、特征工程、模型训练到效果评估、落地风险控制会把整个链路尽量讲完整适合刚接触风险预测模型的分析师也适合已经在做相关项目但想系统对比两类模型的人参考。1. 先搞清楚再犯概率预测到底在预测什么1.1 问题定义与数据样本结构再犯概率预测本质上是一个二分类问题。给定一个个体在过去一段时间内的行为记录、社会人口学信息、案件相关特征模型要输出一个概率值表示该个体在未来某个时间窗口内再次发生违规行为的可能性。这里的关键不是“会还是不会”而是“概率是多少”因为这直接决定了后续处置措施的强度。我在整理这个项目时用的是一份脱敏后的历史案件记录数据包含约两万个样本。每条样本有三十多个原始字段覆盖了几类信息基本身份属性年龄、性别、教育程度等、历史行为记录既往违规次数、类型分布、最近一次违规距今时间等、社会支持情况就业状态、居住稳定性、家庭联系频率等、案件相关信息当前案件类别、严重程度、受理机构类型等。目标变量是一个二值标签表示在释放或处理结束后的一年内是否再次出现违规行为。这里有个容易忽略的细节时间窗口的定义会直接影响标签质量。窗口设得太短很多本会再犯的个体还没暴露窗口设得太长样本的时效性又会变差。我在项目里对比过3个月、6个月、12个月三种窗口最终选了12个月因为它在正负样本平衡度和事件捕获率上表现最稳。1.2 特征工程里最重要的几步处理原始数据不能直接丢进模型。这一步我踩了不少坑重点说三个最关键的处理。第一个是缺失值。这类行为记录数据里缺失很正常但缺失往往不是随机的。比如“家庭联系频率”这个字段缺失的样本通常意味着家庭支持系统较弱这本身就是一个有预测力的信号。我最后没有简单填中位数而是分了两步对类别型缺失单独生成一个“缺失标记”特征对数值型缺失才用分组中位数填充。这样既保留了缺失信息本身的价值又避免了让模型学到“填充值”这种假规律。第二个是类别特征编码。再犯预测里很多类别变量都是无序的像案件类别、受理机构类型。直接用整数编码会让模型误以为类别之间有顺序关系逻辑回归尤其敏感。我用了独热编码但设了一个上限当某个类别的样本占比低于百分之一时合并到“其他”类防止特征矩阵过稀疏。这一步对逻辑回归特别重要因为逻辑回归没有树模型那种自动处理稀疏分裂的能力特征膨胀会直接影响稳定性和训练速度。第三个是时间相关特征的处理。历史记录里有一个核心字段是“最近一次违规距今时间”这个字段我做了两个版本一个保留原始天数另一个做分箱后映射成等级值。分箱的作用是让模型对非线性关系更鲁棒比如“30天以内”和“90天”之间的差距意义远大于“300天”和“360天”的差距。随机森林对分箱不敏感因为它本来就是用阈值切分但逻辑回归加上分箱特征后AUC确实提升了这个收益是明确的。经验之谈特征工程阶段最重要的不是堆特征数量而是理解每一个字段和再犯行为之间的机制关系。纯靠自动特征选择很难挖出“最近一次违规距今时间”这种在业务上极其关键、在统计上又常被忽略的变量。特征处理完成后我把数据按7:2:1随机切分成训练集、验证集和测试集整个过程用固定的随机种子控制确保后续两个模型对比时不会因为数据划分不一样而产生偏差。2. 为什么是逻辑回归和随机森林模型选择背后的考量2.1 逻辑回归在这个场景里凭什么还能打很多人一看到“再犯概率预测”就觉得该上深度神经网络但实际做下来逻辑回归在这个场景里远没过时原因有三个。第一是可解释性。再犯预测的结果会直接影响对一个人的处置建议如果模型只说“风险高”但完全解释不了为什么那在实际应用中几乎没法用。逻辑回归输出的是权重每个特征的贡献可以直接摊开来看。比如“历史违规次数”这个特征系数是正的说明每增加一次历史违规预测概率就上升一定幅度。这种透明度在风险决策场景里的价值比复杂模型带来的几个点AUC提升重要得多。第二是稳定性和校准度。逻辑回归的预测概率是经过sigmoid函数映射的天然具备较好的概率校准性质。换句话说如果模型给出0.7的概率那么在足够大的样本里实际再犯率应该比较接近70%。随机森林这类树模型如果不做专门校准概率输出往往偏极端这一点后面评估部分会详细展开。第三是训练和迭代效率。逻辑回归训练只需几秒到几十秒特征重要性一目了然换特征、调参数、跑不同时间段的数据集验证都很快。项目初期探索阶段我基本靠逻辑回归快速建立基线确定特征方向之后再让随机森林等更复杂的模型跟上。这个思路和工程上的“先做基线再上强化”是一致的。2.2 随机森林带来的能力提升和隐藏代价随机森林适合再犯预测的核心原因是它能自然处理特征之间的非线性交互。比如“年龄偏小”和“首次违规时间较早”单独看可能预测力一般但两者同时出现时风险会显著上升。逻辑回归要捕捉这种交互只能手动构造交叉特征不仅工作量大还容易漏。随机森林不需要你提前知道交互形式它会在分裂过程中自动发现这类组合。但代价也很现实。第一随机森林的预测结果很难直接解释。特征重要性矩阵能告诉你哪个特征整体贡献大但具体到某一个人为什么出了这个概率基本是黑箱。我后来尝试用SHAP值做辅助解释能部分缓解但对非技术背景的使用者来说理解成本依然很高。第二是随机森林在小样本和类别不平衡下的表现容易不稳定。我的数据集里正样本比例大概三成不算极端不平衡但直接用默认参数训练时随机森林对少数类的召回率明显偏低。需要调整类别权重或者用下采样策略才能改善。所以在项目里我没有把这两个模型当作竞争关系而是当作互补的工具逻辑回归用于需要展示逻辑链路和计算公允基准的场景随机森林用于追求更高判别力和容忍复杂交互的场景。两者对比之后决策者可以更清晰地认识到模型预测能力的天花板到底在哪里这个天花板够不够用。2.3 对比实验的核心目标不是“谁赢”这类对比实验最常见的误区是一上来就盯着准确率或AUC想证明谁更好。但在再犯预测的场景里这种“赢”是很空洞的。因为模型最终的输出不是用来排名而是要嵌入到处置建议流程里的模型的错误代价是不对称的。假阴性的代价很高一个实际会再犯的人被判成低风险可能导致干预措施不足。假阳性的代价也不低一个低风险者被贴上高风险标签可能面临不必要的审查压力。两个模型在不同错误类型上的表现差异比总体准确率差异重要得多。所以在结果对比时我不只比较AUC和准确率还专门看了混淆矩阵在特定阈值下的FN和FP分布以及概率校准曲线。这些内容到评估部分会详细说但设计模型对比之前这个意识一定要先建立起来。3. 训练实操两个模型的完整实现记录3.1 实验环境与基线设置整个训练流程基于Python实现核心依赖是scikit-learn、pandas和NumPy。模型的随机种子固定为(随机数实际项目用的是可复现的固定值)确保实验结果可复现。数据集切分后训练集约14000条验证集约4000条测试集约2000条。先建立一个基线假设所有样本都预测为多数类不违规那么准确率在七成左右。这个数字很关键它是后续所有模型效果对比的底线。如果模型连这个基线都跑不过说明特征本身几乎没有预测力。我先把标准化处理后的特征灌进逻辑回归模型参数先用默认配置只是把正则化强度调到一个合理值。跑完之后记录关键指标再进入随机森林的调参环节。3.2 逻辑回归训练过程与参数选择逻辑回归在sklearn里的实现核心需要关注三个参数正则化类型、正则化系数C以及是否启用均衡类别权重。正则化类型我选择了L2。L1正则虽然有特征选择的效果但在这个场景里我不希望模型直接丢弃某些弱特征因为那些特征在业务解释上仍有价值。L2能做系数收缩保留所有特征的可解释性更适合风险预测场景。正则化系数C做了网格搜索范围从0.01到10按对数刻度取值。验证集的结果显示C在0.5附近AUC达到峰值继续增大C减弱正则化强度并不能带来明显提升反而训练集和验证集的AUC差距开始拉大说明过拟合风险增加。类别权重方面sklearn里可以直接设置class_weightbalanced它会根据类别频率自动调整权重。我在默认版本和均衡版本之间做了对比均衡版本显著提升了少数类再犯群体的召回率代价是整体准确率下降。考虑到再犯预测对少类的高关注需求我还是选择了均衡版本并在此基础上调整了最终的分类阈值。逻辑回归部分的关键代码结构可以简化为这样一个流程from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) lr_model LogisticRegression( penaltyl2, C0.5, class_weightbalanced, solverliblinear, random_state42, max_iter1000 ) lr_model.fit(X_train_scaled, y_train)这里有两个容易踩的坑。第一个是必须对连续特征做标准化否则逻辑回归的收敛速度和系数可解释性都会受影响。第二个是solver的选择当数据量和特征数中等时liblinear比默认的改进拟牛顿法更稳收敛次数更少极端情况下也不会出现不收敛的警告。3.3 随机森林训练过程与关键调参随机森林的关键参数有三个树的数量、树的最大深度、以及分裂时考虑的特征数量。树的棵数我从100开始试到500。观察发现当树的数量超过300之后验证集AUC的提升已经非常微小基本是平线了。考虑到训练时间和推理时间的开销最终选了300棵这算是一个性价比比较高的点。树的最大深度我刻意做了控制。随机森林单棵树太深虽然训练集拟合得很好但泛化能力反而不行。我用最大深度从10到20做了对比15左右验证集效果最好。再深的话测试集AUC开始回落典型的过拟合信号。分裂特征数用的是默认的平方根策略没有额外调整。比较关键的是类别不平衡的处理。随机森林和逻辑回归不一样它的默认训练策略里每个类别被平等对待所以在类别不平衡下容易偏向多数类。我用了两种策略一种是设置class_weightbalanced另一种是在训练之前对多数类做下采样。实际对比下来两种方式得到的AUC差不多但下采样后的模型在概率校准上表现更自然最终选择了下采样结合类别权重的方式算是一个组合方案。随机森林训练的核心代码可以整理成下面这种形式from sklearn.ensemble import RandomForestClassifier rf_model RandomForestClassifier( n_estimators300, max_depth15, min_samples_split10, min_samples_leaf5, max_featuressqrt, class_weightbalanced, random_state42, n_jobs-1 ) rf_model.fit(X_train, y_train)这里特别提一下min_samples_leaf这个参数。它控制了叶子节点的最小样本数我设成5而不是默认的1这样会让单棵树更保守不容易学到过于孤立的噪声模式。在再犯预测这种噪声较多的行为数据里这个参数对泛化能力的贡献比单纯限制深度还明显。3.4 分类阈值的调整策略训练完成后模型输出的其实是概率值还不是最终的分类标签。默认情况下概率超过0.5会被判为正类但在类别不平衡且错误代价不对称的场景下0.5这个阈值显然不是最优的。我在验证集上做了阈值扫描从0.3到0.7按0.05的步长遍历。对每个阈值计算对应的精确率、召回率和F1分数。结果挺有意思逻辑回归在阈值约0.35时F1达到峰值而随机森林在0.4附近达到峰值。这说明即便做了类别平衡处理模型输出的概率分布还是有差异不能用一个固定阈值通吃两个模型。最终我单独为两个模型保存了各自的“最优阈值”评估测试集时分别用各自的最优阈值计算最终指标。后面可以看到这种方式让两个模型在最终表现上的差异更加真实和公平。4. 评估对比别只盯着AUC那一个数4.1 混淆矩阵和精确率召回率的真实差异测试集上的对比结果我先把核心数字列出来。逻辑回归在最优阈值0.35下测试集准确率是76%精确率0.63召回率0.65AUC是0.79。随机森林在最优阈值0.4下测试集准确率是78%精确率0.67召回率0.66AUC是0.82。只看AUC和准确率随机森林略胜但差距不大。但混淆矩阵拆开看就有意思了。具体数字如下模型真正例真负例假正例假负例逻辑回归4121118242228随机森林4191141219221随机森林在四个格子上的表现比逻辑回归是全面略优的尤其在降低假正例方面比逻辑回归少了23个样本。这个差距在真实应用场景里可能意味着少误判二十多个低风险个体影响是实打实的。不过再往细节看另一个指标更值得关注。逻辑回归对“历史违规次数为零”的样本几乎不会给出特别高的概率这是因为它从数据里学习到的规律是线性的。而随机森林能识别出一小部分“虽然历史数量不多但最近一次行为特征非常集中”的特殊群体这批人的风险其实是高的随机森林能抓出来逻辑回归会漏掉。这种差异在业务上的价值非常大。因为现实中的再犯群体里有一部分人并不是那种“高频暴力的惯犯”而是“低频但特征鲜明”的特定类型。随机森林的非线性交互能力恰好对这类样本更敏感。4.2 概率校准随机森林的硬伤和补救办法如果说随机森林在判别力上赢了那在概率校准上它是输的。我画了校准曲线来对比两个模型的概率输出。横轴是模型预测概率分箱后的均值纵轴是该分组内的实际再犯率。完美校准的模型应该贴合45度对角线。逻辑回归的预测概率和实际频率基本贴线偏差很小。随机森林则是明显的蛇形偏移预测概率在0.3到0.5区间的样本实际再犯率偏低预测概率在0.6以上时实际再犯率又偏高。整体表现为概率输出过于自信。这个问题在再犯预测场景里极其麻烦。因为下游判断“这个人是不是需要额外干预”时往往依赖一个具体的概率阈值比如超过0.6就算高风险。如果随机森林给出的0.6不代表真的60%那这个阈值就像在流沙上盖房子。解决办法不是没有。我试过用Isotonic回归去校准随机森林的概率输出校准后的曲线明显更贴合对角线。from sklearn.calibration import CalibratedClassifierCV rf_calibrated CalibratedClassifierCV( rf_model, methodisotonic, cv5 ) rf_calibrated.fit(X_train, y_train)这里有一个教训概率校准需要额外的样本不能用训练集自己校准否则会严重过拟合。我在项目里是把训练集切成两份一份训练模型一份做校准的拟合数据。实际操作下来Isotonic校准对随机森林的帮助非常显著校准后AUC基本不变这是理论预期的但Brier分数降低了校准曲线接近逻辑回归的水平。有意思的是逻辑回归我同样做了校准测试结果几乎没变化。这正好印证了逻辑回归本身的概率输出已经比较合理不需要额外补偿。所以在实际项目中我对逻辑回归直接使用原始概率对随机森林则强制走一遍校准流程。4.3 显著性检验和稳定性验证AUC高一点不代表真的更好尤其是两个模型差距不大时。我用Bootstrap重采样法做了显著性检验对测试集有放回抽样1000次每次抽样后分别计算两个模型的AUC差值得到差值分布的置信区间。结果显示差值分布不包含095%置信区间在0.018到0.045之间说明随机森林的AUC提升在统计上是显著的。稳定性方面我还做了一个时段稳定性测试。把数据按时间先后的顺序划分出最近半年的样本作为“新样本”用老样本训练模型看在新样本上的表现。这个测试很关键因为行为预测模型很容易过拟合特定时期的特征分布换一个时间段效果就崩。结果两个模型在新样本上的AUC都有下降逻辑回归从0.79降到0.75随机森林从0.82降到0.77。随机森林稳定性的绝对水平还是稍高但下降幅度差不多。这也说明模型效果好坏不仅取决于算法本身还很依赖训练数据的时间代表性和环境稳定性。再犯行为的底层规律如果发生了结构性变化任何模型都需要重新训练和评估。5. 实际落地中的坑与排查实录5.1 数据泄露最容易出现也最致命的问题再犯预测项目里最容易出现也最致命的坑是数据泄露。我在早期版本就犯过这个错误。当时我把“处罚类型”直接作为特征放进训练数据后来发现这个字段实际上是在观察期结束之后才记录的也就是说我们用了“未来信息”预测“未来事件”。这导致模型在训练集上AUC高达0.9以上测试集上直接掉回0.75一对比就知道不对。排查过程其实非常痛苦因为涉及数据管线的清洗逻辑、字段入库顺序和特征生成的时点任何一个环节不对都会污染整条链路。排查数据泄露没有一个自动化的万能方法但有几个抓手可以快速定位问题第一个是看特征重要性的排序如果某个业务上不太可能在观察期初就能获取的字段排到了最前面就有嫌疑第二个是单特征AUC测试把每个特征单独拿去预测目标变量如果某个特征的单独AUC异常之高比如超过0.85基本可以怀疑泄露第三个是做时间反事实测试把特征中的时间字段整体向后平移一个月看模型效果是否骤降如果骤降说明模型高度依赖了时间类特征。5.2 特征重要性和业务逻辑一致性验证训练完之后一定要做一次特征方向性检验。逻辑回归的系数符号和业务直觉是否一致这是最基础也是最重要的检查。比如“历史违规次数”系数为正说明历史违规越多预测的再犯概率越高符合直觉。“年龄”系数为负说明年龄越大越不容易再犯符合大量行为研究报告的结论。如果出现某个特征的系数方向和业务共识完全相反比如“就业状况稳定”对应的系数反而是正那就要小心了要么是这个特征被其他特征压制了多重共线性问题要么是数据切分时引入了奇怪的偏误。我在项目里就遇到过“居住稳定性”系数为负表示提升居住稳定性会降低再犯概率变成正的诡异情况。排查后发现是因为这个字段和“家庭联系频率”高度相关两个变量一起进模型后产生了“符号翻转”。最终处理是保留了居住稳定性删除了家庭联系频率因为后者缺失率高且数据质量差。这也说明做这类模型时不能只看整体效果还得回归到特征级验证。随机森林没有权重系数方向性验证需要通过SHAP值来完成。我做了全样本SHAP值的汇总分析主要看每个特征的高值段对预测概率的影响方向。SHAP的完整计算比较耗时间但比一下特征重要性排序才有意义因为它给出的是方向和影响幅度而不只是重要度分数。5.3 类别不平衡的过采样与下采样选择再犯预测数据里多数类占比七成左右属于中等程度不平衡。这类场景网上资料五花八门有人推SMOTE过采样有人推下采样还有说直接把class_weight调成balanced就行。我自己的实验结果是SMOTE这种合成样本方法虽然能让训练集上的指标非常漂亮但测试集上并没有带来明显的AUC提升反而因为结构过于“完美”导致泛化受损。下采样后的模型训练集样本量虽然变少但每个样本都是真实样本。模型学到的边界相对保守验证集稳定性很高。结合class_weightbalanced一起使用时效果最好。对于极度不平衡正样本低于20%的情况可能需要考虑其他策略但在这个数据集里下采样加权重是最稳的路径。还有一个实操细节做下采样的时候筛选样本要用分层随机抽样保证采样后各类别的分布和原始分布尽量一致。另外下采样会丢失一部分信息所以项目里我用了五折交叉验证来评估最终模型而不是只依赖一次切分的结果这样对模型泛化能力的判断会更可靠。5.4 阈值选择对下游决策的实际影响这里把阈值的影响用一个小例子说透。假设我们设定阈值0.4为介入干预线那么所有预测概率大于0.4的个体都会被纳入重点关注范围。在测试集里逻辑回归在0.4阈值下会判定约660人为高风险随机森林约650人。看起来差不多但关键在集合的重合度两个模型同时判为高风险的有540人剩下的交集只有约110人来自于其中一个模型。这意味着两套模型在“哪些人属于高风险”这个核心判断上有一成多的分歧。这种分歧在业务层面会导向截然不同的处置建议因此给模型选评估指标时不可以只看整体AUC还要结合业务层的“误报代价/漏报代价”去确定最终阈值。比如如果干预措施成本低但漏报代价极大阈值就往低了调反过来如果干预成本高就提高阈值宁可漏掉一部分人也不能大规模误伤。我在项目里做了一份“阈值约束下的成本分析表”把所有可能的阈值从0.2到0.7都过一遍计算每个阈值对应的干预人数、实际再犯人被覆盖的人数、误报人数再乘以业务预估的单位成本得出一个综合成本值。最终选择的阈值不是“模型最优”而是“综合成本最低”。这个思路再犯预测这类决策场景中非常重要单纯追求模型指标最优在真实决策链条上往往是片面的。6. 写在最后的小结这个第30期项目做下来给我最大的体会是再犯概率预测真正难的部分不在模型训练而在数据理解、特征构建和评估体系设计。逻辑回归和随机森林都是成熟且稳定的算法它们各自适合不同的侧重点关键要清楚自己在业务上需要的是“能解释的概率”还是“更准的判别”需要提前想明白否则很容易跑偏。最后分享一个小建议在做这种风险概率预测项目时从第一天起就要把“未来风险”“干预计划”“数据更新周期”这些业务逻辑和模型输出对齐。技术指标一样漂亮的模型在真实决策场景中的价值可能天差地别。模型效果最终要回归到它是否改善了决策质量而不是它赢了多少个百分点的AUC。这个系列后面我会继续做模型解释性与风险评估应用的更多实践欢迎一起交流踩坑经验。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑