ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

基于随机森林与多准则决策的财产保险风险评估与策略优化实战

2026/8/27 2:15:59 拓冰建站 浏览量
基于随机森林与多准则决策的财产保险风险评估与策略优化实战 1. 从赛题到模型一次真实的财产保险建模实战复盘去年带队打美赛E题的经历现在回想起来依然觉得信息量巨大。题目聚焦财产保险的可持续性说白了就是给保险公司建个模型预测未来会不会赔穿以及怎么定价才能既赚钱又稳当。这玩意儿听起来是金融精算的活儿但美赛的魅力就在于它把问题抽象成了一个典型的“数据驱动决策”问题。我们当时核心用了两种方法多准则决策分析MCDA来搭建评估框架和进行方案排序用随机森林Random Forest来做核心的风险预测和关键因子挖掘。网上很多思路分享要么只讲理论要么只丢代码缺了中间最关键的“为什么这么选”以及“怎么把模型结果用起来”的桥段。这篇复盘我就结合那次实战把从理解问题、选择方法、到代码实现、结果解读的全链路掰开揉碎讲清楚特别是MCDA和随机森林在这个场景下是怎么“打配合”的。2. 问题拆解保险可持续性到底在问什么美赛E题通常不会直接让你算保费它会把问题包装在一个更宏观的叙事里。那年题目大致是评估财产保险特别是应对极端天气事件的的长期可持续性并探讨可能的策略如保费调整、风险共担、政府补贴等。第一步不是急着找数据跑模型而是把“可持续性”这个模糊的目标翻译成可量化的建模目标。2.1 定义核心决策目标与评价准则可持续性不是一个单一指标。我们团队当时通过大量阅读背景材料题目会提供一些参考文献线索把它分解为三个核心维度这也是后续MCDA的基石财务稳健性保险公司不能破产。这可以量化为核心指标如偿付能力充足率模拟未来的赔付支出与资本金、长期平均承保利润率、破产概率在极端情景下的模拟。这部分需要预测未来的赔付。社会可负担性保费不能高到让居民买不起保险失去保障意义。可量化指标如保费收入占地区居民收入的中位数比例、保险渗透率的变化。风险减量有效性保险不能只是事后赔钱应该能激励或支持事前防灾减灾。这部分较难量化但我们尝试用指标如保费折扣与防灾措施挂钩的参保比例、保险赔付资金中用于灾后重建加固的比例假设。仅仅有这三个维度还不够题目要求评估“不同策略”。所以我们定义了四到五个待评估的策略方案例如方案A激进市场价、方案B温和涨价免赔额提高、方案C政府再保险兜底、方案D社区风险共担池。于是我们的问题就转化为了一个经典的多准则决策问题在“财务稳健性”、“社会可负担性”、“风险减量有效性”这三个准则Criteria下比较A、B、C、D这几个方案Alternatives的优劣并给出排序或推荐。这就是引入MCDA的动机。2.2 数据需求与处理难点要支撑上述评估尤其是财务稳健性的预测我们需要数据。理想数据包括历史灾害损失数据、地区财产价值分布、保单信息、气候预测数据等。美赛通常只提供有限数据或指引你寻找公开数据。我们当时的策略是核心驱动数据使用公开的历史飓风/洪水损失数据如美国NOAA的数据库和地区化的人口、财产GDP数据作为风险暴露度。关键处理将大区域数据降尺度到更小的评估单元如县级别这里就用到了简单的空间插值或按比例分配。构建特征对于每个评估单元我们构造了用于预测未来损失的特征例如历史平均损失、暴露价值财产总值、到海岸线距离、海拔中位数、气候预测的极端降水指数变化率等。这就是随机森林模型的输入特征X。目标变量Y我们设定为“未来特定年份的期望损失率损失/暴露价值”。由于没有真实未来数据我们采用了一种模拟方法用历史损失数据拟合一个分布例如伽马分布或广义帕累托分布用于刻画极端值然后根据气候预测趋势调整该分布的参数生成多条可能的未来损失情景。这样我们就得到了一个包含多个样本不同评估单元、不同模拟情景的训练数据集。注意这里是一个巨大的简化点也是建模的“艺术”所在。真实精算模型复杂得多但在数模竞赛72小时内必须做出合理且可解释的假设并明确写在论文中。3. 模型核心一随机森林预测未来风险随机森林不是黑箱在这个场景下我们看重它两个不可替代的优点1) 能处理特征间的复杂非线性关系2) 能给出特征重要性排序告诉我们哪些因素对损失预测影响最大这本身就是极具价值的洞察。3.1 模型训练与调参实战我们用的是scikit-learn的RandomForestRegressor来预测连续值的“损失率”。代码骨架如下但重点是参数背后的思考import pandas as pd import numpy as np from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.metrics import mean_squared_error, r2_score # 假设 df 是准备好的DataFrame包含特征列和‘loss_ratio’目标列 X df.drop(columns[loss_ratio, region_id]) # 特征 y df[loss_ratio] # 目标变量 # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 初始化随机森林模型 rf RandomForestRegressor(random_state42, n_jobs-1) # n_jobs-1 用上所有CPU核心 # 关键参数网格搜索 param_grid { n_estimators: [100, 200, 300], # 树的数量太少欠拟合太多计算慢且可能过拟合 max_depth: [10, 20, 30, None], # 树的最大深度控制模型复杂度None表示不限制容易过拟合 min_samples_split: [2, 5, 10], # 内部节点再划分所需最小样本数值越大树越简单 min_samples_leaf: [1, 2, 4], # 叶节点最小样本数同上平滑模型 max_features: [sqrt, log2] # 寻找最佳分割时考虑的特征数经典设置防止过拟合 } # 网格搜索交叉验证 grid_search GridSearchCV(estimatorrf, param_gridparam_grid, cv5, scoringneg_mean_squared_error, verbose1) grid_search.fit(X_train, y_train) # 输出最佳参数 print(Best Parameters:, grid_search.best_params_) best_rf grid_search.best_estimator_ # 在测试集上评估 y_pred best_rf.predict(X_test) mse mean_squared_error(y_test, y_pred) r2 r2_score(y_test, y_pred) print(fTest MSE: {mse:.4f}) print(fTest R^2: {r2:.4f})调参心得n_estimators在计算资源允许下大一点好我们选了300因为随机森林是“集大成者”树越多越稳定。可以用learning_curve观察误差是否已收敛。max_depth我们最终选择了20而不是None。因为我们的特征数量有限10个左右且数据有噪声限制深度可以有效防止对历史噪声的过拟合增强模型泛化到未来情景的能力。max_features选择sqrt特征数的平方根。这是分类问题的常见默认值对于回归问题也适用它能保证每棵树有足够的差异性这是集成学习效果好的关键。3.2 特征重要性分析与业务解读模型训练好后预测只是第一步。更重要的是利用随机森林内置的特征重要性分析。# 获取特征重要性 importances best_rf.feature_importances_ feature_names X.columns indices np.argsort(importances)[::-1] # 降序排列 # 打印重要性排序 print(Feature ranking:) for f in range(X.shape[1]): print(f{f 1}. {feature_names[indices[f]]} ({importances[indices[f]]:.4f})) # 可视化 import matplotlib.pyplot as plt plt.figure(figsize(10, 6)) plt.title(Feature Importances) plt.bar(range(X.shape[1]), importances[indices], aligncenter) plt.xticks(range(X.shape[1]), [feature_names[i] for i in indices], rotation45, haright) plt.tight_layout() plt.show()我们当时的发现历史平均损失和暴露价值的重要性最高这符合直觉。但排第三的是气候预测的极端降水指数变化率而非到海岸线距离。这给了我们一个关键论据在未来风险评估中气候变化因子的影响权重正在提升甚至可能超过某些静态地理因素。这个结论直接支撑了我们后续在策略评估中强调方案必须包含对气候长期变化的适应性。3.3 预测结果用于MCDA输入对于每一个评估单元县我们用训练好的最佳随机森林模型预测其在未来某个时间窗口如2050年下的“期望损失率”。然后将这个损失率乘以该单元的“暴露价值”就得到了预测的期望赔付额。对于每一个待评估的策略方案A/B/C/D我们根据其规则如保费变化、免赔额变化、政府分担比例调整模型的输入或对输出进行后处理。例如方案B提高免赔额在计算保险公司实际赔付时将预测的损失额减去免赔额部分设定一个阈值。方案C政府再保险当预测损失超过某个巨灾阈值时超过部分按一定比例如80%从损失中扣除模拟政府承担。这样对于每一个方案我们都能得到一套新的、模拟未来的财务指标如赔付成本、净保费收入这些指标将成为MCDA中“财务稳健性”准则下的具体量化值。4. 模型核心二MCDA综合评估与策略排序有了随机森林提供的量化基础MCDA就登场了。它的任务是把不同维度准则、不同量纲的指标综合起来给方案排个座次。我们选用的是层次分析法AHP与TOPSIS结合的路径因为AHP适合确定准则权重需要主观判断而TOPSIS适合对方案进行客观排序。4.1 利用AHP确定准则权重财务稳健性、社会可负担性、风险减量这三个准则哪个更重要这没有标准答案但需要一套自洽的逻辑。我们通过查阅文献和内部讨论构建了判断矩阵准则比较矩阵 (1-9标度法) 财务稳健性 社会可负担性 风险减量 财务稳健性 1 3 5 社会可负担性 1/3 1 3 风险减量 1/5 1/3 1解读我们认为财务稳健性比社会可负担性稍微重要一点3比风险减量明显重要5社会可负担性比风险减量稍微重要一点3。import numpy as np # 定义判断矩阵 judgment_matrix np.array([ [1, 3, 5], [1/3, 1, 3], [1/5, 1/3, 1] ]) # 计算权重特征向量法 def ahp_weight(matrix): # 计算每列的几何平均数 geom_mean np.prod(matrix, axis1) ** (1.0 / matrix.shape[1]) # 归一化得到权重 weights geom_mean / np.sum(geom_mean) return weights weights ahp_weight(judgment_matrix) print(AHP计算得到的准则权重) print(f财务稳健性: {weights[0]:.3f}) print(f社会可负担性: {weights[1]:.3f}) print(f风险减量有效性: {weights[2]:.3f}) # 一致性检验略但论文中必须展示并满足CR0.1计算后我们得到的权重可能是财务稳健性 0.65社会可负担性 0.25风险减量有效性 0.10。这反映了我们的核心判断保险公司先要活下来财务稳健才能谈社会责任。4.2 构建决策矩阵与TOPSIS排序接下来我们需要每个方案在每个准则下的得分。财务稳健性准则下的得分来源于随机森林模型模拟出的财务指标如净利润的现值我们将其归一化到效益型指标越大越好。社会可负担性可能用保费负担率越小越好需转化为成本型指标处理。风险减量有效性我们用假设的评分1-10分。假设我们得到如下决策矩阵数据已做归一化处理且统一为效益型即数值越大越好方案财务稳健性 (权重0.65)社会可负担性 (权重0.25)风险减量 (权重0.10)方案A0.900.403方案B0.750.707方案C0.600.856方案D0.800.608import numpy as np # 决策矩阵 (行方案 列准则) decision_matrix np.array([ [0.90, 0.40, 3], [0.75, 0.70, 7], [0.60, 0.85, 6], [0.80, 0.60, 8] ]) weights np.array([0.65, 0.25, 0.10]) # AHP得到的权重 # 1. 加权规范化决策矩阵 norm_matrix decision_matrix / np.sqrt((decision_matrix ** 2).sum(axis0)) # 向量归一化 weighted_norm_matrix norm_matrix * weights # 2. 确定理想解和负理想解 ideal_best weighted_norm_matrix.max(axis0) # 每个准则的最大值 ideal_worst weighted_norm_matrix.min(axis0) # 每个准则的最小值 # 3. 计算各方案到理想解和负理想解的距离 dist_to_best np.sqrt(((weighted_norm_matrix - ideal_best) ** 2).sum(axis1)) dist_to_worst np.sqrt(((weighted_norm_matrix - ideal_worst) ** 2).sum(axis1)) # 4. 计算相对贴近度 closeness dist_to_worst / (dist_to_best dist_to_worst) # 5. 排序 scheme_names [方案A, 方案B, 方案C, 方案D] ranking np.argsort(closeness)[::-1] # 降序排列贴近度越大越好 print(TOPSIS相对贴近度及排序) for i, idx in enumerate(ranking): print(f第{i1}名: {scheme_names[idx]} (贴近度: {closeness[idx]:.4f}))结果解读在我们的假设数据下可能方案B或D会胜出因为它们在不同准则间取得了更好的平衡。方案A虽然财务上好但社会可负担性太差方案C社会可负担性好但财务表现弱。TOPSIS的结果给出了一个量化的综合排序。在论文中我们必须对权重的敏感性进行分析即如果权重发生变化例如决策者更看重社会公平排序结果是否会改变这能体现模型的鲁棒性和决策的灵活性。5. 全流程集成、论文呈现与避坑指南模型跑通只是完成了技术部分如何将其整合成一个有说服力的故事并体现在论文中是拿奖的关键。5.1 模型链条的串联与可视化在论文的“模型”部分我们需要画一个清晰的流程图展示从数据到最终决策的完整链条[历史数据 气候预测] - (特征工程) - [随机森林模型] - (预测未来损失) - [财务模拟器] - (生成各方案财务指标) - [MCDA评估矩阵] - (AHP确定权重 TOPSIS排序) - [策略推荐]这个图能让评委一眼看懂你的建模逻辑。5.2 结果可视化与故事线随机森林部分展示特征重要性柱状图用地图展示不同区域预测的未来风险变化热力图对关键区域进行损失分布的模拟箱线图或概率密度图。MCDA部分展示准则权重的雷达图或条形图用TOPSIS的贴近度绘制方案排序的条形图制作敏感性分析的表格或线图展示权重变化时排序的稳定性。故事线论文的摘要和引言就要点明“我们用一个数据预测模型RF驱动一个多目标决策模型MCDA来解决保险可持续性问题”。在分析部分先讲风险预测发现了什么如气候因子重要性上升再讲基于此的财务模拟结果最后讲综合权衡下的策略选择。结论要回应题目所有要求并提出具体、可操作的建议。5.3 实战中踩过的坑与应对策略数据尺度不一致历史损失数据可能是州级别的但财产暴露数据是县级别的。直接合并会出问题。我们采用按财产价值比例进行分配的方法并在论文中说明了这一假设及其局限性。随机森林过拟合初期模型在训练集上R²很高但模拟未来情景时波动巨大。通过交叉验证、限制树深度max_depth、增加min_samples_leaf来增加正则化并最终使用OOBOut-of-Bag误差作为泛化能力的参考。MCDA权重主观性被挑战这是AHP方法的固有缺点。应对方法是a) 引用相关文献支持我们的权重判断b) 进行广泛的敏感性分析展示当权重在合理范围内变动时我们的核心结论例如方案B和D始终优于A和C是否依然成立。这反而成了模型稳健性的证明。计算时间过长随机森林网格搜索加上对多个方案、多个情景的模拟计算量很大。我们提前将数据预处理和特征工程写好脚本在性能好的电脑上运行。并在论文中注明“所有模拟均在配备XX处理器的计算机上完成总计算时间约X小时”体现实操可行性。忽略模型不确定性只给出一个点预测期望损失是不够的。我们利用随机森林可以输出预测区间的特性如用sklearn的quantile_forest或自助法展示了未来损失的置信区间并在财务模拟中进行了压力测试例如采用95%分位数的损失让评估更稳健。这次美赛E题的建模经历本质上是一次标准的“数据科学解决商业问题”的演练。随机森林提供了强大的预测能力和因子洞察而MCDA则提供了一个将复杂、多目标的业务问题结构化的决策框架。两者的结合使得模型既有数据驱动的客观性又能容纳决策者的主观价值判断。代码和公式只是工具真正的核心在于你如何定义问题、如何解释结果、如何将一个复杂的现实世界问题拆解、转化并封装进这些工具里最后讲出一个逻辑自洽、有洞察力的故事。这或许才是数学建模竞赛乃至之后解决真实世界问题最需要打磨的能力。