首页 / 资讯中心 / 文章详情

五一杯C题火灾报警系统建模:从418起真实火灾到熵权-TOPSIS与Logistic回归全流程复现

五一杯C题火灾报警系统建模:从418起真实火灾到熵权-TOPSIS与Logistic回归全流程复现 ★ FEATURED ARTICLE
简介这份资源是2022年五一杯数学建模竞赛C题的完整解题资料面向备战数学建模赛事的高校学生及指导教师聚焦火灾报警系统的建模与优化问题。压缩包内仅含1个docx文档约291KB集中呈现赛题分析、模型构建与求解全过程。内容围绕熵权-TOPSIS综合评价、logistic回归研判、WOE值优化等核心方法展开完整覆盖探测器可靠性筛选、报警真实性概率预测、辖区管理水平量化评价及部件维护建议四大问题并附有真实火灾数确定、指标权重计算等关键推导细节。目前已有912人学习下载适合希望掌握多指标决策与分类回归建模思路、对照优秀赛题论文查漏补缺的参赛者参考借鉴。1. 从 418 起真实火灾说起这套五一杯 C 题代码到底能跑出什么如果你手头正好有一份 2022 年五一杯 C 题的优秀论文和配套代码却卡在“附件一到底怎么筛出 418 起真实火灾”这一步那这篇笔记就是写给你的。这套资源围绕火灾报警系统建模展开核心是四个问题的完整求解链路用熵权-TOPSIS 从 16 类部件里挑出最可靠的 5 种探测器、用 Logistic 回归加 WOE 优化做报警真实性研判、用熵权-TOPSIS 评价 18 个消防大队的管理水平、最后落到报警系统的维护建议。它适合正在备战数学建模竞赛的学生也适合想拿一套完整“评价分类”建模模板复用到其他场景的从业者。我拆完这套代码最大的感受是真正决定成败的不是模型多花哨而是数据清洗那一步有没有把“同一场火灾”的判定逻辑写对——这一步错了后面全是空中楼阁。2. 数据清洗与真实火灾判定418 这个数字是怎么来的2.1 为什么必须先做去重和误报剔除附件一给的是 6 月 1 日到 6 月 18 日的报警流水里面混着误报记录和同一场火灾被多个探测器重复上报的情况。题目给了一条关键假设多个探测器的地址、机号、回路编号相同时且都发出报警信号则认为是同一场火灾。这条假设直接决定了去重的主键是“地址机号回路”三元组而不是单看时间戳。很多人第一版直接用时间去重结果真实火灾数算出来对不上后面所有指标全偏。我一般会先把附件一读进来按“是否误报”字段把误报行剔掉再对剩下的记录按三元组分组每组只保留一条。这里有个容易翻车的点误报字段的取值在不同附件里编码可能不一致有的是 0/1有的是文字得先统一。2.2 用 pandas 复现真实火灾统计import pandas as pd # 读取附件一列名按实际文件调整 df pd.read_excel(附件1.xlsx) # 统一误报标识假设原始字段为是否误报1 表示误报 df[是否误报] df[是否误报].astype(int) # 剔除误报记录 real df[df[是否误报] 0].copy() # 按地址、机号、回路三元组去重同一场火灾只算一次 real_dedup real.drop_duplicates(subset[地址, 机号, 回路]) # 统计真实火灾起数 true_fire_count real_dedup.shape[0] print(真实火灾起数, true_fire_count) # 预期输出 418这段代码的逻辑很直白先过滤误报再按三元组去重。参数上唯一需要留意的是subset里的列名必须和附件实际表头完全一致中文列名带空格是常见坑。如果算出来不是 418优先检查两件事误报字段的编码方向是不是反了以及三元组里有没有缺失值导致drop_duplicates行为异常。2.3 可靠性、故障率、完善率的指标构造真实火灾数确定后接下来要算每个部件的两个核心指标。可靠性用误报警率取负指数得到故障率转完善率也是同样的思路——把成本型指标翻成效益型才能塞进 TOPSIS。这一步的数学处理不复杂但方向搞反了整张评价表就全废。# 按部件类型聚合报警次数和误报次数 part_stat df.groupby(部件名称).agg( 报警次数(是否误报, count), 误报次数(是否误报, sum) ).reset_index() # 误报警率 part_stat[误报警率] part_stat[误报次数] / part_stat[报警次数] # 可靠性 exp(-误报警率) import numpy as np part_stat[可靠性] np.exp(-part_stat[误报警率]) # 故障率故障次数 / 所有部件故障总次数 fault_total df[故障次数].sum() part_stat[故障率] part_stat[故障次数] / fault_total # 完善率 exp(-故障率) part_stat[完善率] np.exp(-part_stat[故障率])参数说明groupby的键是部件名称聚合时报警次数用 count、误报次数用 sum前提是误报字段已经转成 0/1。故障率的分母是全量故障次数不是单个部件的这点在论文里写得很清楚代码里别写错。算完之后你会得到一张 16 行的指标表这就是后面熵权-TOPSIS 的输入。3. 熵权-TOPSIS 双场景落地选探测器与评消防队3.1 熵权法确定权重的完整实现熵权法的核心思想是某个指标下各样本值差异越大这个指标携带的信息越多权重就越高。这套资源在两个地方用了它——问题一评价 16 类探测器问题三评价 18 个消防大队。两处的实现逻辑完全一样只是输入矩阵不同所以我把它抽成一个函数复用。def entropy_weight(matrix): matrix: 正向化、标准化后的二维数组行样本列指标 返回各指标权重 m, n matrix.shape # 归一化避免 log(0) p matrix / matrix.sum(axis0, keepdimsTrue) p np.where(p 0, 1e-12, p) # 计算熵值 e -np.sum(p * np.log(p), axis0) / np.log(m) # 差异系数 d 1 - e # 权重 w d / d.sum() return w这里有个细节标准化之后如果某列出现 0直接取 log 会炸所以用1e-12兜底。np.log(m)里的 m 是样本数不是指标数写反了权重会整体失真。我见过有人把 m 和 n 搞混结果权重全在 0.5 附近晃评价结果毫无区分度。3.2 TOPSIS 打分与最可靠探测器筛选拿到权重后TOPSIS 的流程是加权标准化矩阵 → 找正负理想解 → 算各样本到正负理想解的距离 → 算相对贴近度。贴近度越高越可靠。def topsis_score(matrix, weights): # 加权标准化 weighted matrix * weights # 正理想解和负理想解 ideal_best weighted.max(axis0) ideal_worst weighted.min(axis0) # 距离 d_best np.sqrt(((weighted - ideal_best) ** 2).sum(axis1)) d_worst np.sqrt(((weighted - ideal_worst) ** 2).sum(axis1)) # 相对贴近度 score d_worst / (d_best d_worst) return score把 16 类探测器的可靠性和完善率矩阵丢进去算出来的得分排序里前五名就是光束感烟、手动报警按钮、智能光电探头、点型感温探测器、线型光束感烟探测器。这个结果和论文一致说明指标构造和权重计算没跑偏。问题三里把输入换成 18 个大队的四个指标误报警率、部件故障率、单位面积火灾发生概率、单位面积火灾报警数注意这四个都是成本型指标正向化时要取倒数或负值处理否则得分越低反而代表管理水平越高结论就反了。3.3 消防大队评价的指标方向陷阱问题三最容易踩的坑就是指标方向。论文里明确说“各指标均为成本型指标故得分越低代表管理水平越高”但如果你在正向化那一步没统一方向TOPSIS 算出来的高分反而对应管理差的队。我的做法是在构造矩阵时就把所有成本型指标取负号让“越大越好”成为统一方向这样贴近度排序就直观了。算完对照论文里 J、G、I 三个大队排名垫底的结论能对上就说明方向没错。4. Logistic 回归与 WOE 优化报警真实性研判的两次迭代4.1 虚拟变量与基准组选择问题二要预测某条报警是不是误报因变量是二分类自变量里有消防大队和探测器类型两个无序分类变量。直接赋 1、2、3 会引入虚假的大小关系必须转成哑变量。转哑变量时要选基准组论文选的是报警次数最多的点型感烟探测器和辖区面积最大的 Q 大队。基准组的选择会影响系数解释但不影响预测概率所以实操中选哪个作为基准问题不大关键是别把所有类别都展开导致完全共线性。import statsmodels.api as sm # 对消防大队和探测器类型做哑变量处理drop_first 自动丢弃基准组 X pd.get_dummies(data[[故障次数, 火警次数, 消防大队, 探测器类型]], columns[消防大队, 探测器类型], drop_firstTrue) X sm.add_constant(X) y data[是否误报] model sm.Logit(y, X).fit(disp0) print(model.summary())drop_firstTrue是防止虚拟变量陷阱的关键参数少了它模型直接报奇异矩阵。拟合完看model.summary()里的 Pseudo R-squ 和显著性论文报告的真实性 94.7% 对应的是分类准确率不是 R 方别混淆。4.2 WOE 值替换与模型优化第一版 Logistic 跑完论文发现某些大队和探测器类型的显著性不高附件三的预测结果偏差也大。优化方案是用 WOE 值替代原始分类变量。WOE 的本质是衡量某个类别下“误报占比”与“非误报占比”的差异把无序分类变量转成一个有经济含义的连续值既避免了哑变量过多又保留了类别信息。def calc_woe(df, group_col, target_col): 计算某分类变量的 WOE 值 grouped df.groupby(group_col)[target_col].agg([sum, count]) grouped.columns [bad, total] grouped[good] grouped[total] - grouped[bad] grouped[bad_pct] grouped[bad] / grouped[bad].sum() grouped[good_pct] grouped[good] / grouped[good].sum() grouped[woe] np.log(grouped[bad_pct] / grouped[good_pct]) return grouped[woe].to_dict() # 对消防大队和探测器类型分别计算 WOE 并映射回原数据 woe_map_team calc_woe(data, 消防大队, 是否误报) data[大队_woe] data[消防大队].map(woe_map_team)WOE 计算里bad是误报数、good是非误报数分子分母的占比基准分别是误报总数和非误报总数。映射回原数据后用大队_woe和探测器类型_woe替代原来的分类列重新跑 Logistic模型稳定性和预测一致性都会明显改善。这一步是整套资源里最能体现“迭代优化”思路的地方也是论文拿高分的关键。4.3 附件三预测概率的复现优化后的模型对附件三逐条预测输出的概率序列就是论文里那串 19.3%、0.8%、1.01%…… 复现时注意两点一是预测时用的 WOE 映射表必须和训练时完全一致不能重新算二是model.predict输出的是误报概率要取1 - p才是真实火警概率。这两步顺序搞反结果会整体镜像翻转。5. 避坑与排查这套代码最容易翻车的五个地方5.1 真实火灾数算不出 418现象去重后统计结果不是 418偏差几十到上百。原因误报字段编码方向搞反或者去重主键漏了“回路”这一列。解决先打印误报字段的 unique 值确认编码再用df.duplicated(subset[...]).sum()检查重复行数是否符合预期。5.2 熵权法权重全为 0 或全相等现象算出来的权重没有区分度TOPSIS 得分几乎一样。原因标准化时用了 min-max 但某列最大值等于最小值或者熵值计算里 log 的底数写错。解决标准化后加一个极小值兜底确认np.log(m)里的 m 是样本数。5.3 TOPSIS 排名与论文相反现象得分最高的探测器不是光束感烟或者管理水平最差的不是 J、G、I。原因成本型指标没有正向化或者正向化方向搞反。解决统一把所有指标转成“越大越好”再跑 TOPSIS对照论文结论验证。5.4 Logistic 回归报奇异矩阵现象sm.Logit拟合时报LinAlgError: Singular matrix。原因哑变量没有丢弃基准组导致完全共线性。解决pd.get_dummies加drop_firstTrue或者手动删掉一列。5.5 WOE 映射后预测结果全为同一值现象附件三所有预测概率几乎一样。原因WOE 映射表在预测时重新计算了导致训练集和预测集的映射不一致。解决把训练时算好的 WOE 字典存下来预测时直接map不要重算。6. 从复现到复用把评价分类模板迁移到新赛题这套资源真正的价值不在于火灾报警这个具体场景而在于它给了一套“评价类分类类”问题的标准打法。熵权-TOPSIS 负责多指标综合评价LogisticWOE 负责二分类预测两者组合能覆盖数学建模里一大半的题型。我后来遇到类似的“选最优方案预测某事件概率”的题目基本都按这个骨架搭。迁移时最需要调整的是指标构造那一步。火灾场景里可靠性和完善率是取负指数换成别的场景可能是极差标准化或者向量归一化核心原则只有一个把所有指标统一成效益型让“越大越好”成为共识。另外 WOE 那一步不是必须的如果分类变量不多、显著性也够第一版 Logistic 就能交差只有当哑变量膨胀或者预测偏差大时才值得上 WOE。验证方法上我习惯做两件事一是把 TOPSIS 得分排序和论文结论逐条对照对不上就回头查指标方向二是把 Logistic 的预测概率和附件三的已知标签做混淆矩阵准确率低于 90% 就说明特征工程还有问题。这两步走完整套代码才算真正跑通。从那以后我每次拿到评价类赛题都强制先把指标方向统一检查一遍再往下写这个习惯帮我省了至少三次返工。希望这套拆解能帮到你少走点我当年走过的弯路。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站