ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

2024 MCM/ICM E题财产保险可持续性建模:Python源码全流程解析

2024 MCM/ICM E题财产保险可持续性建模:Python源码全流程解析 简介这份资源是2024年美国大学生数学建模竞赛MCM/ICME题「财产保险的可持续性」的完整参赛作品基于Python实现面向准备数模竞赛的高校学生、需要课程设计或毕设参考的进阶学习者。作品围绕极端天气下保险定价与承保策略展开涵盖模糊综合评价、灰色预测与关联分析、层次分析、支持向量机等多类建模方法并配有灵敏度分析与模型预测数据。压缩包共43个文件、约18.43MB包含7个Python脚本、3个xlsx数据表、16张png与7张svg图表、2份pdf文档及tex源码等图表覆盖ROC曲线、PCA降维、混淆矩阵、灰色预测等关键结果便于直接复现与二次修改。目前已有111人学习下载。读者可获得完整赛题方案、可运行代码、建模数据与可视化素材适合作为竞赛复盘、课程大作业或项目立项的参考模板。1. 从一份 2024 MCM/ICM E 题源码包说起财产保险可持续性到底怎么建模财产保险的可持续性说白了就是保险公司收上来的保费够不够赔极端天气带来的巨灾损失。2024 年美国大学生数学建模竞赛 E 题就卡在这个点上给定新西兰等地区的历史风暴、洪水、地震理赔数据要求建立模型评估保险定价是否可持续并给出承保策略建议。这份Fuck_2024_MCM-ICM-main.zip就是一套完整的参赛作品用 Python 把模糊综合评价、灰色预测、层次分析、支持向量机四类方法串成一条链覆盖了从风险评级到保费预测再到分类判定的全流程。它适合正在准备数学建模竞赛、需要一套能跑通的 Python 代码框架的读者也适合做课程设计或毕设时想找真实数据练手的人。包里除了代码还有 2024_ICM_Problem_E.pdf 原题、多份 xlsx 数据、ROC 与 PCA 可视化图、LaTeX 论文源文件基本是一个能直接复现的闭环。下面我按「数据怎么进、模型怎么搭、结果怎么验」的顺序拆一遍重点讲参数怎么设、坑在哪。2. 数据与代码结构先搞清楚每个文件在流水线里的位置2.1 目录拆解与运行顺序拿到压缩包解压后根目录下大致分四块2024_ICM_Problem_E.pdf是赛题原文data/放原始与中间数据code/放全部 Python 脚本figure/放输出图表。code目录里的脚本命名很直白按模型编号走模型一 隶属函数.py、模型一 模糊综合评价.py负责风险等级评定模型二 灰色预测.py、模型二 层次分析.py、模型二 灰色关联分析.py负责保费与赔付趋势预测模型三 支持向量机.py负责把样本分成可持续/不可持续两类svm_model.pkl训练好的 SVM 模型可直接加载推理运行顺序建议按模型编号来因为模型二的输出会作为模型三的输入特征。dataset.csv是汇总后的建模主表模型二预测数据.xlsx和灵敏度分析.xlsx是中间产物。draw_Figure_1.py单独负责画论文里的示意图不参与建模主链。提示先确认 Python 版本。这套代码用了sklearn、pandas、numpy、matplotlib没有锁定版本号但 SVM 的pickle文件对sklearn版本敏感建议用 1.0 以上版本加载否则可能报InconsistentVersionWarning。2.2 环境配置与依赖安装我一般会先建一个干净虚拟环境避免和系统里已有的包打架。命令如下python -m venv venv_mcm source venv_mcm/bin/activate # Windows 用 venv_mcm\Scripts\activate pip install numpy pandas scikit-learn matplotlib openpyxlopenpyxl必须装因为数据文件是.xlsxpandas.read_excel底层要靠它。如果后面要跑 LaTeX 论文还得装 TeX 发行版但那只影响文档编译不影响代码运行。装完后进code目录先跑模型一看能不能正常输出隶属度矩阵。常见报错是FileNotFoundError多半是脚本里用了相对路径../data/xxx.xlsx而你当前工作目录不对。解决办法要么cd到正确层级要么在脚本开头把路径改成绝对路径。2.3 数据字段与建模口径dataset.csv里通常包含地区、年份、风暴强度、理赔金额、保费收入、风险等级等列。模糊综合评价那一步会把连续指标转成隶属度比如把「理赔金额」按梯形分布映射到「低/中/高」三个等级。这里有个口径问题如果原始数据的量纲没统一隶属函数的阈值就会偏。我一般先做一遍describe()看分布再决定阈值取分位数还是业务经验值。灰色预测对数据长度有要求至少 4 个时间点否则预测结果波动会很大。SVM 那一步用的是PCA4到PCA8不同主成分数下的特征对应figure里那几张PCAx,AUCy.svg说明作者做了降维对比AUC 从 0.63 到 0.99 都有选主成分数时不能只看最高值还要看泛化能力。3. 模型一与模型二模糊综合评价和灰色预测怎么落地3.1 模糊综合评价的实现细节模型一的核心是「隶属函数 权重 合成算子」。模型一 隶属函数.py负责定义每个指标对风险等级的隶属度模型一 模糊综合评价.py负责把隶属度矩阵和权重向量合成得到最终风险等级。权重通常来自层次分析但模型一里可能先用了等权或专家给定权。代码骨架大致如下import numpy as np # 隶属度矩阵 R每行一个指标每列一个风险等级 R np.array([ [0.7, 0.2, 0.1], [0.1, 0.6, 0.3], [0.2, 0.3, 0.5] ]) # 权重向量 W和为 1 W np.array([0.5, 0.3, 0.2]) # 加权平均合成 B W R # 归一化 B B / B.sum() print(综合评判向量:, B) print(风险等级:, np.argmax(B) 1)这段代码里R的每一列对应「低风险、中风险、高风险」W是指标权重。W R做的是加权平均比最大最小算子更平滑适合指标之间相关性不强的情况。如果某个指标权重特别大合成结果会被它主导这时候要检查权重是不是合理。参数方面隶属函数的阈值决定了R的取值阈值偏一点最终等级就可能跳档。我一般会做一次灵敏度分析把阈值上下浮动 10%看等级是否稳定灵敏度分析.xlsx里应该就是这类结果。3.2 灰色预测 GM(1,1) 的参数与残差检验模型二里的灰色预测用来推未来几年的理赔或保费趋势。模型二 灰色预测.py实现的是 GM(1,1)核心是累加生成、紧邻均值生成、最小二乘求参数。代码里关键步骤是构造B矩阵和Y向量import numpy as np def gm11(x0): x1 np.cumsum(x0) # 累加生成 z1 (x1[:-1] x1[1:]) / 2.0 # 紧邻均值 B np.column_stack((-z1, np.ones(len(z1)))) Y x0[1:].reshape(-1, 1) params np.linalg.lstsq(B, Y, rcondNone)[0] a, b params.flatten() return a, b x0 np.array([120, 135, 150, 168, 190], dtypefloat) a, b gm11(x0) print(发展系数 a:, a, 灰作用量 b:, b)a是发展系数反映趋势快慢b是灰作用量反映背景值。a的绝对值越小预测越平缓。通常要求|a| 0.3才适合做中长期预测否则残差会偏大。跑完预测后一定要看后验差比值C和小误差概率PC 0.35且P 0.95才算精度合格。如果C偏大说明原始数据波动太剧烈这时候要么换模型要么对数据做平滑。模型二预测数据.xlsx里应该存了预测值和残差可以对照检查。3.3 层次分析与灰色关联的配合模型二 层次分析.py用来求指标权重模型二 灰色关联分析.py用来排序各因素对理赔的影响程度。层次分析的关键是一致性检验构造判断矩阵后算CR CI / RICR 0.1才通过。如果没通过得回去调判断矩阵。灰色关联则是先定参考序列再算关联系数和关联度关联度越大说明该因素越重要。这两步的输出会喂给后面的 SVM 做特征选择。我一般会把关联度排前几位的因素保留其余降维掉这样 SVM 训练更快也不容易过拟合。注意灰色关联的分辨系数ρ通常取 0.5改这个值会改变关联度排序但一般不超过 0.5 上下浮动 0.2。4. 模型三支持向量机从 PCA 降维到 AUC 对比4.1 SVM 训练与 pickle 模型加载模型三 支持向量机.py是整条链的收口把前两个模型产出的风险等级、预测趋势作为特征训练一个分类器判断某地区某年是否可持续。代码里大概率用了sklearn.svm.SVC核函数可能是 RBF。训练完用pickle存成svm_model.pkl。加载推理的写法import pickle import numpy as np with open(svm_model.pkl, rb) as f: model pickle.load(f) X_new np.array([[0.3, 0.6, 0.2, 0.8]]) pred model.predict(X_new) print(可持续性判定:, pred)这里X_new的列顺序必须和训练时一致否则预测结果会乱。我一般会在训练脚本里把特征列名存下来推理时按列名对齐而不是靠记忆。pickle加载报错多半是sklearn版本不一致解决方法是重新用当前环境训练一遍或者用joblib替代pickle兼容性更好。4.2 PCA 主成分数与 AUC 的取舍figure目录里那几张PCA4,AUC0.99.svg、PCA5,AUC0.98.svg、PCA6,AUC0.91.svg、PCA7,AUC0.71.svg、PCA8,AUC0.63.svg很说明问题主成分越少AUC 反而越高。这看起来反直觉但小样本下降维太狠会丢信息降维不够又会引入噪声。PCA4 时 AUC 0.99 很漂亮但要警惕过拟合因为主成分少意味着模型容量小如果交叉验证也稳定那才是真稳。我一般会跑 5 折交叉验证看 AUC 的均值和方差而不是只看单次划分。如果 PCA4 的方差很大那宁可选 PCA5 或 6牺牲一点 AUC 换稳定性。ROC.png和ROC.psd是 ROC 曲线源文件Confusion Matrix.png是混淆矩阵这两个图能直观看出假阳性和假阴性比例对保险场景来说假阴性把不可持续判成可持续代价更高所以阈值可以适当调低。4.3 灵敏度分析与结果验证灵敏度分析.xlsx和SA1.png到SA4.png是模型稳健性的证据。常见做法是扰动输入特征 ±10%、±20%看输出分类是否翻转。如果翻转比例超过 20%说明模型太敏感实际业务里不敢用。验证时还要看Score.png那可能是模型得分分布。我一般会把灵敏度分析结果和交叉验证结果放一起看交叉验证看泛化灵敏度看稳健两者都过关才敢写进论文。另外GM11.png是灰色预测的拟合图PANDRA.png可能是某种降维或聚类图Need.png可能是需求或缺口示意这些图在论文里承担解释作用代码里对应draw_Figure_1.py的绘图逻辑。5. 避坑与常见问题跑这套代码时最容易翻车的几个点5.1 路径与编码问题现象运行脚本报FileNotFoundError或UnicodeDecodeError。原因脚本里用了相对路径或者 CSV 文件含中文列名但没指定编码。解决统一用pathlib.Path拼绝对路径读 CSV 时加encodingutf-8-sig读 Excel 用openpyxl引擎。我习惯在脚本开头定义BASE_DIR Path(__file__).resolve().parent.parent后面所有路径都基于它拼这样换机器也不用改。5.2 sklearn 版本与 pickle 不兼容现象pickle.load报InconsistentVersionWarning或直接抛异常。原因svm_model.pkl是在旧版sklearn下训练的当前环境版本不同。解决要么用pip install scikit-learn旧版本对齐要么重新跑一遍模型三 支持向量机.py生成新模型。更稳妥的做法是改用joblib.dump和joblib.load它对版本差异容忍度更高。5.3 灰色预测数据长度不足现象GM(1,1) 预测结果离谱残差检验不通过。原因输入序列少于 4 个点或者数据波动太大。解决先做级比检验看数据是否适合灰色预测如果不适合改用移动平均或指数平滑做预处理。另外a的绝对值超过 0.3 时不要硬用 GM(1,1) 做长期预测只做短期参考。5.4 PCA 主成分数选择只看 AUC现象选了 AUC 最高的 PCA4但换一组测试数据后准确率暴跌。原因小样本下高 AUC 可能是过拟合。解决用交叉验证看 AUC 均值和标准差优先选标准差小的主成分数。同时结合业务解释性主成分太少会导致物理含义模糊论文里不好解释。5.5 模糊综合评价权重不合理现象综合评判结果总是偏向某一等级区分度差。原因权重向量过于集中或者隶属函数阈值设置不当。解决先用层次分析求权重并做一致性检验再对隶属函数阈值做灵敏度分析。如果结果仍然集中考虑换合成算子比如改用加权平均代替最大最小算子。6. 进阶技巧把这份源码包改造成自己的建模模板这套代码最大的价值不是直接交作业而是当成模板改。我的习惯是先把dataset.csv换成自己的数据保持列名不变这样所有脚本都能跑通。然后逐个模型替换模型一的隶属函数可以改成三角形或高斯型模型二的灰色预测可以换成 ARIMA 做对比模型三的 SVM 可以换成随机森林或 XGBoost看哪个交叉验证更稳。svm_model.pkl不要直接复用一定要用自己的数据重新训练否则特征分布对不上预测就是黑匣子。验证方法上我一般会做三件事第一跑一遍 5 折交叉验证记录 AUC 和 F1第二做灵敏度分析扰动关键特征看分类翻转率第三把ROC.png和Confusion Matrix.png重新画一遍确认阈值调整后假阴性降下来了。如果时间够还会把模型二预测数据.xlsx和灵敏度分析.xlsx的结果导出来和论文里的数字对一遍看有没有对不上的地方。对不上的地方往往就是坑要么是路径读错了文件要么是中间步骤漏了归一化。参数方面SVM 的C和gamma值得调一调。C越大越容易过拟合gamma越大决策边界越复杂。我一般用GridSearchCV在小范围里搜比如C取[0.1, 1, 10]gamma取[0.01, 0.1, 1]配合交叉验证选最优。灰色预测的ρ和 PCA 的主成分数也类似不要拍脑袋定跑一遍对比再定。从那以后我每次拿到这种竞赛源码包都强制先跑通主链再逐个替换模块最后用交叉验证和灵敏度分析卡一遍确认没有过拟合才敢往下写。希望帮到你。本文还有配套的精品资源点击获取
返回列表