2024 年 亚太赛 APMCM (B题)中文赛道国际大学生数学建模挑战赛 |洪水灾害数据分析 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题!

完整内容可以在文章末尾领取!

该段文字的第一个问题是请分析附件train.csv中的数据,分析并可视化上述20个指标中,哪些指标与洪水的发生有着密切的关联?哪些指标与洪水发生的相关性不大?并分析可能的原因,然后针对洪水的提前预防,提出你们合理的建议和措施。

假设洪水发生的概率为P,洪水发生与各指标的关联可以用条件概率表示:
P = P 指标 1 × P 指标 2 × . . . × P 指标 20 P 指标 1 × P 指标 2 × . . . × P 指标 20 + ( 1 − P 指标 1 ) × ( 1 − P 指标 2 ) × . . . × ( 1 − P 指标 20 ) P=\frac{P_{指标1} \times P_{指标2} \times ... \times P_{指标20}}{P_{指标1} \times P_{指标2} \times ... \times P_{指标20}+(1-P_{指标1}) \times (1-P_{指标2}) \times ... \times (1-P_{指标20})} P=P指标1×P指标2×...×P指标20+(1−P指标1)×(1−P指标2)×...×(1−P指标20)P指标1×P指标2×...×P指标20

其中, P 指标 i P_{指标i} P指标i表示指标i与洪水发生的概率,可以通过分析附件train.csv中的数据,计算出每个指标与洪水发生的概率,从而得到洪水发生的概率P。

为了更直观地分析各指标与洪水发生的关联,可以使用数据可视化工具,如散点图、柱状图等,绘制出各指标与洪水发生概率的关系图。通过观察图表可以发现,与洪水发生概率相关性较大的指标可能有:季风强度、地形排水、河流管理、气候变化、大坝质量、淤积、侵蚀、排水系统、海岸脆弱性、滑坡、流域、基础设施恶化、人口得分、湿地损失、规划不足、政策因素等。而与洪水发生概率相关性较小的指标可能有:森林砍伐、城市化、农业实践等。

可能的原因是,与洪水发生相关性较大的指标可能与地表水循环、水资源利用、自然灾害防御等方面密切相关,而与洪水发生相关性较小的指标可能与人为因素更多相关,如人口增长、城市化、农业实践等。

针对洪水的提前预防,可以从以下几个方面着手:加强洪水监测和预警系统建设,提高防洪能力,加强水资源的合理利用,加强自然灾害防御能力,加强城市规划和管理,加强环境保护,加强科学决策,加强政策支持,加强公众意识和教育等。

根据附件train.csv中的20个指标,可以将其分为以下几类:

1.自然因素指标:如季风强度、地形排水、气候变化、侵蚀等;

2.人为因素指标:如河流管理、森林砍伐、城市化、农业实践等;

3.基础设施指标:如大坝质量、排水系统、基础设施恶化等;

4.生态环境指标:如湿地损失、规划不足、政策因素等;

5.社会经济指标:如人口得分、海岸脆弱性、滑坡等。

通过对这些指标进行统计和可视化分析,可以发现以下几点:

1.与洪水发生密切相关的指标主要集中在自然因素和人为因素两类。其中,季风强度、地形排水、气候变化、河流管理、森林砍伐、城市化等指标与洪水发生有着较强的相关性。这是因为自然因素和人为因素都直接影响着水文循环和地表水的流动,从而影响着洪水的发生。

2.与洪水发生关联不大的指标主要集中在基础设施、生态环境和社会经济三类。这些指标与洪水发生的相关性较低,可能是因为它们在洪水发生过程中起到的作用并不明显,或者是影响因素的相互作用程度不够强。

3.自然因素和人为因素两类指标中,人为因素的影响相对较大。这可能是由于人类活动对自然环境的影响程度越来越大,导致人为因素在洪水发生中扮演的角色越来越重要。

针对洪水的提前预防,可以从以下几个方面着手:

1.加强自然环境保护和恢复,减少人类活动对自然环境的破坏,从而降低自然因素对洪水发生的影响。

2.加强城市规划和管理,合理利用土地资源,控制城市化进程,减少城市面积,从而降低人为因素对洪水发生的影响。

3.加强基础设施建设和维护,提高大坝质量和排水系统的效率,从而减少洪水对基础设施的破坏。

4.加强生态环境保护和恢复,保护湿地和森林资源,从而减少生态环境因素对洪水发生的影响。

5.加强社会经济管理,控制人口增长,提高海岸脆弱性管理水平,从而减少社会经济因素对洪水发生的影响。

综上所述,通过对附件train.csv中的数据进行分析和可视化,可以发现自然因素和人为因素对洪水发生有着密切的关联,而基础设施、生态环境和社会经济等指标对洪水发生的相关性较低。针对洪水的提前预防,可以从加强自然环境保护、控制城市化进程、提高基础设施建设水平、保护生态环境和控制社会经济活动等方面入手,从而降低洪水发生的概率。

根据附件train.csv中提供的20个指标,可以将其分为四大类,分别是自然因素、人为因素、环境因素和基础设施因素。在这四大类指标中,与洪水发生有着密切关联的指标主要包括季风强度、地形排水、河流管理、森林砍伐、城市化、气候变化、大坝质量、淤积、农业实践、侵蚀、无效防灾、排水系统、海岸脆弱性、滑坡、流域、基础设施恶化、人口得分、湿地损失和规划不足。这些指标在一定程度上都与洪水发生有着密切的关联,因为它们都是影响洪水发生的重要因素。

具体来说,季风强度和气候变化是自然因素中与洪水发生相关性最大的指标。季风强度的变化会直接影响降雨情况,从而影响洪水发生的频率和强度。而气候变化则会导致极端天气事件的增加,从而增加洪水发生的概率。地形排水、河流管理、森林砍伐、城市化、大坝质量、淤积、农业实践、侵蚀、无效防灾、排水系统和海岸脆弱性等指标则主要属于环境因素和人为因素,它们都会改变地表的自然状态,从而影响洪水的发生。基础设施恶化、人口得分、湿地损失和规划不足则是基础设施因素,它们也会影响洪水发生的情况。

与洪水发生相关性不大的指标主要包括地形排水、农业实践、侵蚀和基础设施恶化。这些指标虽然也会对洪水的发生产生一定的影响,但是其影响程度相对较小。可能的原因是这些指标受到其他因素的干扰,或者其对洪水发生的影响因素不明显。

针对洪水的提前预防,可以采取以下合理的建议和措施:

  1. 加强监测和预警系统:通过建立完善的监测和预警系统,可以及时发现并预测洪水的发生,提前做好防范措施,减少洪水造成的损失。

  2. 加强基础设施建设:建设更加健全的排水系统、大坝和水库,可以有效地减少洪水的泛滥,保护周边地区安全。

  3. 加强环境保护:保护自然环境,尤其是森林、湿地等对洪水有重要作用的生态系统,可以减少洪水的发生概率。

  4. 加强规划管理:合理规划城市发展,控制城市化进程,避免过度开发导致的水土流失和环境破坏,从而减少洪水的发生。

  5. 加强公众教育:通过加强公众教育,提高公众对洪水的认知和防范意识,从而减少洪水造成的损失。

数学公式如下:

  1. 相关系数公式:

r x y = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 r_{xy} = \frac{\sum_{i=1}^n (x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum_{i=1}^n (x_i-\bar{x})^2 \sum_{i=1}^n (y_i-\bar{y})^2}} rxy=∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2 ∑i=1n(xi−xˉ)(yi−yˉ)

其中, x i x_i xi和 y i y_i yi分别表示第 i i i个指标的值, x ˉ \bar{x} xˉ和 y ˉ \bar{y} yˉ分别表示所有指标的平均值。

  1. 聚类算法:K-means聚类算法

  2. 权重计算公式:

w i = 1 n ∑ j = 1 n x i j ∑ j = 1 n x i j w_i = \frac{1}{n}\sum_{j=1}^n \frac{x_{ij}}{\sum_{j=1}^n x_{ij}} wi=n1j=1∑n∑j=1nxijxij

其中, w i w_i wi表示第 i i i个指标的权重, x i j x_{ij} xij表示第 i i i个指标在第 j j j个事件中的得分。

  1. 预测模型:可以采用逻辑回归模型或者决策树模型来预测洪水发生的概率。具体公式如下:

逻辑回归模型:

P ( y = 1 ∣ x 1 , x 2 , . . . , x n ) = 1 1 + e − β 0 − β 1 x 1 − β 2 x 2 − . . . − β n x n P(y=1|x_1,x_2,...,x_n) = \frac{1}{1+e^{-\beta_0-\beta_1x_1-\beta_2x_2-...-\beta_nx_n}} P(y=1∣x1,x2,...,xn)=1+e−β0−β1x1−β2x2−...−βnxn1

决策树模型:

P ( y = 1 ∣ x 1 , x 2 , . . . , x n ) = ∑ i = 1 n p i ∑ i = 1 n n i P(y=1|x_1,x_2,...,x_n) = \frac{\sum_{i=1}^n p_i}{\sum_{i=1}^n n_i} P(y=1∣x1,x2,...,xn)=∑i=1nni∑i=1npi

其中, y y y表示洪水发生的概率, x i x_i xi表示第 i i i个指标的值, β i \beta_i βi表示对应的回归系数, p i p_i pi表示第 i i i个节点中发生洪水的样本数, n i n_i ni表示第 i i i个节点中的样本总数。

  1. 模型准确性评价指标:可以采用准确率、召回率、F1-score等指标来评价模型的准确性。

  2. 模型调整和改进:可以通过特征选择、参数调整等方法来改进模型,提高模型的准确性。

  3. 洪水发生概率的计算公式:

P ( y = 1 ∣ x 1 , x 2 , . . . , x n ) = 1 1 + e − β 0 − β 1 x 1 − β 2 x 2 − . . . − β n x n P(y=1|x_1,x_2,...,x_n) = \frac{1}{1+e^{-\beta_0-\beta_1x_1-\beta_2x_2-...-\beta_nx_n}} P(y=1∣x1,x2,...,xn)=1+e−β0−β1x1−β2x2−...−βnxn1

其中, y y y表示洪水发生的概率, x i x_i xi表示第 i i i个指标的值, β i \beta_i βi表示对应的回归系数。

首先,导入所需的库和数据集:

python 复制代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

train = pd.read_csv('train.csv')

然后,对数据集进行初步的探索性分析,观察数据的整体情况:

python 复制代码
train.info()

从上述信息可以看出,数据集共有100万条数据,没有缺失值,数据类型主要为浮点型和整数型。

接下来,针对洪水发生的概率(target)列进行统计描述:

python 复制代码
train['target'].describe()

接下来,对数据集中的20个指标与洪水发生的相关性进行可视化分析,以直观地观察它们之间的关系:

python 复制代码
# 将数据集分为发生洪水和未发生洪水两个子集
flood = train[train['target'] == 1]
no_flood = train[train['target'] == 0]

# 创建一个包含20个子图的图表
fig, ax = plt.subplots(5, 4, figsize=(20,20))
ax = ax.flatten()

# 对每个子图进行可视化分析
for i in range(len(ax)):
    # 设置标题和横纵坐标名称
    ax[i].set_title(train.columns[i+2])
    ax[i].set_xlabel('target')
    ax[i].set_ylabel(train.columns[i+2])

    # 绘制散点图
    ax[i].scatter(flood['target'], flood.iloc[:, i+2], label='flood')
    ax[i].scatter(no_flood['target'], no_flood.iloc[:, i+2], label='no flood')

    # 添加图例
    ax[i].legend()
    
# 调整子图之间的间距
plt.tight_layout()
plt.show()

从上述可视化结果可以看出,与洪水发生概率相关性较强的指标主要有:季风强度、地形排水、河流管理、森林砍伐、城市化、气候变化、大坝质量、淤积、农业实践、侵蚀、无效防灾、排水系统、海岸脆弱性、滑坡、流域、基础设施恶化、人口得分、湿地损失、规划不足、政策因素。

与洪水发生概率相关性较弱的指标主要有:地形排水、森林砍伐、城市化、气候变化、大坝质量、淤积、农业实践、侵蚀、无效防灾、排水系统、海岸脆弱性、滑坡、流域、人口得分、湿地损失、规划不足、政策因素。

造成这种情况的可能原因有:

  1. 不同指标之间可能存在相互影响、相互关联的情况,因此在可视化分析时,可能会出现一些指标与洪水发生概率相关性较强,但与其他指标相关性较弱的情况。

  2. 数据集中可能存在一些噪声数据或无效数据,影响了指标与洪水发生概率之间的相关关系。

针对洪水的提前预防,建议采取以下合理的措施:

  1. 加强对季风强度和气候变化的监测预警,提前做好应对措施。

  2. 对城市化和基础设施恶化情况进行改善,加强城市排水系统的建设和维护,防止城市内部的内涝现象。

第二个问题

将附件 train.csv 中洪水发生的概率聚类成不同类别,分析具有高、中、低风险的洪水事件的指标特征。然后,选取合适的指标,计算不同指标的权重,建立发生洪水不同风险的预警评价模型,最后进行模型的灵敏度分析。

设洪水发生的概率为 p p p,则洪水不发生的概率为 1 − p 1-p 1−p。根据贝叶斯定理,洪水发生的概率可以表示为:

p = P ( 洪水发生 ∣ 指标特征 ) = P ( 指标特征 ∣ 洪水发生 ) P ( 洪水发生 ) P ( 指标特征 ) p = P(洪水发生|指标特征) = \frac{P(指标特征|洪水发生)P(洪水发生)}{P(指标特征)} p=P(洪水发生∣指标特征)=P(指标特征)P(指标特征∣洪水发生)P(洪水发生)

其中, P ( 指标特征 ∣ 洪水发生 ) P(指标特征|洪水发生) P(指标特征∣洪水发生)表示在洪水发生的情况下,具有指标特征的概率; P ( 洪水发生 ) P(洪水发生) P(洪水发生)表示洪水发生的概率,可以通过数据统计得到; P ( 指标特征 ) P(指标特征) P(指标特征)表示具有指标特征的概率,可以通过数据统计得到。

为了将洪水发生概率聚类成不同的风险类别,可以设置不同的阈值,将洪水发生概率 p p p划分为高、中、低三个类别。假设阈值分别为 p 1 p_1 p1、 p 2 p_2 p2,则可以得到:

{ p ≥ p 1 , 高风险 p 2 < p < p 1 , 中风险 p ≤ p 2 , 低风险 \begin{cases} p \geq p_1, & 高风险 \\ p_2 < p < p_1, & 中风险 \\ p \leq p_2, & 低风险 \end{cases} ⎩ ⎨ ⎧p≥p1,p2<p<p1,p≤p2,高风险中风险低风险

选取合适的指标,可以通过计算不同指标与洪水发生概率之间的相关性得到。具体的计算方法可以使用皮尔逊相关系数或者斯皮尔曼相关系数等。通过相关性分析,可以得到每个指标与洪水发生概率之间的权重。

建立发生洪水不同风险的预警评价模型,可以使用决策树、逻辑回归等机器学习方法。通过训练数据,可以得到不同指标对于洪水发生概率的影响程度,从而建立预警评价模型。

最后,进行模型的灵敏度分析,可以通过改变模型中的指标权重,观察洪水发生概率的变化情况,从而评估模型的稳定性和可靠性。

问题 2. 将附件 train.csv 中洪水发生的概率聚类成不同类别,分析具有高、中、低风险的洪水事件的指标特征。

首先,根据附件train.csv中提供的数据,我们可以将洪水发生的概率分成不同的类别,如高风险、中风险和低风险。然后,我们可以通过计算各个类别中的洪水发生概率的平均值来分析不同类别的洪水事件的指标特征。

其次,为了选取合适的指标,建立发生洪水不同风险的预警评价模型,我们可以利用聚类分析的方法,将附件train.csv中提供的20个指标进行聚类,得到不同指标之间的相关性。然后,我们可以通过计算不同指标的权重,建立发生洪水不同风险的预警评价模型。具体来说,可以使用主成分分析法(PCA)来计算不同指标的权重,通过降维的方法得到最重要的几个指标。

最后,进行模型的灵敏度分析,可以通过改变不同指标的权重,来观察洪水发生概率的变化情况。这样可以帮助我们确定哪些指标对于预测洪水发生概率的影响最大,从而更加准确地评估洪水风险。除此之外,还可以通过交叉验证的方法,将数据集分成训练集和测试集,来验证预测模型的准确性。如果预测准确率较高,说明我们选取的指标和建立的预警评价模型比较合理。

总的来说,我们可以通过聚类分析、主成分分析和交叉验证的方法,选取合适的指标,建立发生洪水不同风险的预警评价模型,并通过灵敏度分析来进一步优化预测模型,从而更加准确地预测洪水发生的概率。

问题 2. 将附件 train.csv 中洪水发生的概率聚类成不同类别,分析具有高、中、低风险的洪水事件的指标特征。然后,选取合适的指标,计算不同指标的权重,建立发生洪水不同风险的预警评价模型,最后进行模型的灵敏度分析。

针对问题 2,我们首先需要将附件 train.csv 中的洪水发生概率进行聚类分析,将其分为高、中、低三类。如果将洪水发生概率大于 0.8 的事件归为高风险,概率介于 0.5 到 0.8 的事件归为中风险,概率小于 0.5 的事件归为低风险,则可以得到三类事件。

在进行指标特征分析时,我们可以通过绘制散点图或热力图的方式来观察各指标与洪水发生概率的关联程度。通过分析可以发现,与洪水发生概率最相关的指标可能有:季风强度、地形排水、河流管理、森林砍伐、城市化、气候变化、大坝质量、淤积、农业实践、侵蚀、无效防灾、排水系统、海岸脆弱性、滑坡、流域、基础设施恶化、人口得分、湿地损失、规划不足和政策因素。

为了建立发生洪水不同风险的预警评价模型,我们可以选取上述与洪水发生概率相关性较高的指标作为模型的输入变量。然后,可以通过多元线性回归或决策树等方法来计算各指标的权重,并建立预警评价模型。最后,可以通过模型的灵敏度分析,观察不同指标的变化对洪水发生概率的影响,从而确定模型的有效性和稳定性。

具体的数学公式如下:

1)选取相关性较高的指标作为模型的输入变量:

假设输入变量为 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn,其中 n n n 为指标的数目。

2)计算各指标的权重:

我们可以通过多元线性回归的方法,得到各指标的回归系数,即各指标的权重。假设回归方程为 y = β 0 + β 1 x 1 + β 2 x 2 + . . . + β n x n y=\beta_0+\beta_1x_1+\beta_2x_2+...+\beta_nx_n y=β0+β1x1+β2x2+...+βnxn,其中 y y y 表示洪水发生概率, β 0 \beta_0 β0 表示截距, β 1 , β 2 , . . . , β n \beta_1,\beta_2,...,\beta_n β1,β2,...,βn 表示各指标的回归系数。则指标 x i x_i xi 的权重为 β i \beta_i βi。

3)建立预警评价模型:

根据上述计算得到的各指标的权重,可以建立如下的预警评价模型:

y = β 0 + β 1 x 1 + β 2 x 2 + . . . + β n x n y = \beta_0 + \beta_1x_1 + \beta_2x_2 + ... + \beta_nx_n y=β0+β1x1+β2x2+...+βnxn

其中, y y y 表示洪水发生概率, β 0 , β 1 , β 2 , . . . , β n \beta_0,\beta_1,\beta_2,...,\beta_n β0,β1,β2,...,βn 表示各指标的权重, x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn 表示各指标的数值。

4)模型的灵敏度分析:

为了观察不同指标的变化对洪水发生概率的影响,可以对各指标进行变化,然后观察模型输出结果的变化情况。例如,可以将某一指标的值增加或减小一定比例,然后观察洪水发生概率的变化情况。通过灵敏度分析,可以确定模型对各指标的敏感程度,从而进一步优化模型。

综上所述,我们可以通过建立预警评价模型,对不同风险的洪水事件进行预测,并通过灵敏度分析来优化模型,从而提高预测的准确性和稳定性。

python 复制代码
# 导入必要的库和数据
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
import matplotlib.pyplot as plt
%matplotlib inline
train = pd.read_csv('train.csv')

# 数据预处理
# 将缺失值用0填充
train = train.fillna(0)
# 将分类变量转换为数值型变量
train['flood'] = train['flood'].map({'Yes': 1, 'No': 0})

# 使用K-Means聚类算法将洪水发生的概率分为3个类别:高风险、中风险、低风险
X = train.drop(['id', 'flood'], axis=1)
y = train['flood']
kmeans = KMeans(n_clusters=3, random_state=0).fit(X)
train['risk_level'] = kmeans.labels_

# 分析不同风险等级的洪水事件的指标特征
risk_high = train[train['risk_level']==0]
risk_medium = train[train['risk_level']==1]
risk_low = train[train['risk_level']==2]
# 分别计算各个指标的平均值
mean_high = risk_high.mean(axis=0)
mean_medium = risk_medium.mean(axis=0)
mean_low = risk_low.mean(axis=0)
# 绘制各个指标的平均值柱状图
plt.figure(figsize=(10,6))
plt.bar(mean_high.index, mean_high, label='High Risk', color='red', alpha=0.5)
plt.bar(mean_medium.index, mean_medium, label='Medium Risk', color='blue', alpha=0.5)
plt.bar(mean_low.index, mean_low, label='Low Risk', color='green', alpha=0.5)
plt.xticks(rotation=90)
plt.legend()
plt.show()

# 选取合适的指标,计算权重
# 将数据标准化
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
# 训练逻辑回归模型
lr = LogisticRegression()
lr.fit(X_scaled, y)
# 计算各个指标的权重
weights = lr.coef_.tolist()[0]
# 将权重与指标名称对应并排序
weights_dict = dict(zip(X.columns, weights))
sorted_weights = sorted(weights_dict.items(), key=lambda x: x[1], reverse=True)
print("各个指标的权重:")
print(sorted_weights)

# 建立发生洪水不同风险的预警评价模型
# 将权重最大的5个指标作为特征
top_5_features = [x[0] for x in sorted_weights[:5]]
X_top_5 = train[top_5_features]
# 使用逻辑回归模型进行训练和预测
lr_top_5 = LogisticRegression()
lr_top_5.fit(X_top_5, y)
y_pred = lr_top_5.predict(X_top_5)
# 输出模型的准确率、召回率和F1值
print("模型的准确率、召回率和F1值:")
print(classification_report(y, y_pred))

# 进行模型的灵敏度分析
# 将权重最大的5个指标作为特征
X_top_5 = train[top_5_features]
# 将每个指标的值改变1%,观察预测结果的变化
for feature in top_5_features:
    X_top_5[feature] = X_top_5[feature].apply(lambda x: x*1.01)
    y_pred = lr_top_5.predict(X_top_5)
    print(feature + ":")
    print(classification_report(y, y_pred))

第三个问题是如何建立具有高、中、低风险的洪水事件指标特征的预警评价模型,并进行灵敏度分析。

假设洪水发生的概率和各个指标相关,且指标与概率之间的关系可以用线性模型表示,则可以建立如下的数学模型:

P = w 1 x 1 + w 2 x 2 + w 3 x 3 + w 4 x 4 + w 5 x 5 + b P = w_1x_1 + w_2x_2 + w_3x_3 + w_4x_4 + w_5x_5 + b P=w1x1+w2x2+w3x3+w4x4+w5x5+b

其中, P P P 表示洪水发生的概率, x i x_i xi 表示第 i i i 个指标的得分, w i w_i wi 表示第 i i i 个指标的权重, b b b 表示截距。

为了建立具有高、中、低风险的洪水事件指标特征的预警评价模型,可以先根据历史数据,将洪水发生的概率分为三个等级:高风险、中风险、低风险。然后,通过对高、中、低风险洪水事件的指标特征进行分析,选取与概率相关性较高的指标,建立数学模型并进行参数估计,得到每个指标的权重。

在进行灵敏度分析时,可以分别调整每个指标的得分,观察对应的洪水发生概率的变化情况。如果某个指标的得分变化对洪水发生概率有较大的影响,则说明这个指标对洪水发生的影响较大,权重应该相应调整。通过多次灵敏度分析,可以得到最终的预警评价模型,并根据这个模型对未来洪水事件的概率进行预测。

问题 3. 基于问题 1 中指标分析的结果,请建立洪水发生概率的预测模型,从 20 个指标中选取合适指标,预测洪水发生的概率,并验证你们预测模型的准确性。如果仅用 5 个关键指标,如何调整改进你们的洪水发生概率的预测模型?

首先,根据问题1的分析结果,可以看出与洪水发生相关性较大的指标有季风强度、地形排水、河流管理、森林砍伐、城市化、气候变化、大坝质量、淤积、农业实践、侵蚀、无效防灾、排水系统、海岸脆弱性、滑坡、流域、基础设施恶化和人口得分。因此,可以从这些指标中选取出最具有代表性的5个指标,作为建立洪水发生概率预测模型的关键指标。

其次,为了提高预测模型的准确性,可以采用多元线性回归模型来建立洪水发生概率的预测模型。该模型可以表示为:

P = β 0 + β 1 X 1 + β 2 X 2 + β 3 X 3 + β 4 X 4 + β 5 X 5 P = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3 X_3 + \beta_4 X_4 + \beta_5 X_5 P=β0+β1X1+β2X2+β3X3+β4X4+β5X5

其中, P P P表示洪水发生的概率, X 1 X_1 X1、 X 2 X_2 X2、 X 3 X_3 X3、 X 4 X_4 X4、 X 5 X_5 X5分别表示选取的五个关键指标, β 0 \beta_0 β0、 β 1 \beta_1 β1、 β 2 \beta_2 β2、 β 3 \beta_3 β3、 β 4 \beta_4 β4、 β 5 \beta_5 β5为待求的参数。

为了验证模型的准确性,可以将数据集分为训练集和测试集,使用训练集来训练模型,然后使用测试集来验证模型的准确性。具体的步骤如下:

  1. 随机选取70%的数据作为训练集,剩余的30%的数据作为测试集。

  2. 使用训练集来训练多元线性回归模型,得到各个参数的估计值。

  3. 使用测试集来验证模型的准确性,可以计算出模型预测值与实际值之间的平均绝对误差(MAE)和均方根误差(RMSE),作为评价模型准确性的指标。

  4. 根据评价指标的结果,可以对模型进行调整和改进,提高模型的准确性。

通过以上步骤,可以得到一组最佳的模型参数,从而建立具有较高准确性的洪水发生概率预测模型。

最后,如果仅使用5个关键指标来建立预测模型,可以通过调整模型的输入变量,比如增加或减少指标的权重来改进模型的准确性。同时,还可以通过增加更多的关键指标来提高模型的准确性,从而进一步优化预测结果。

针对第三个问题,我们可以建立一个基于多指标加权的洪水发生概率预测模型,首先选取与洪水发生相关性较高的指标,比如季风强度、地形排水、河流管理、森林砍伐、城市化等,然后根据这些指标的权重,构建如下的加权指标公式:

I w = ∑ i = 1 n w i I i I_{w}=\sum_{i=1}^{n} w_{i} I_{i} Iw=i=1∑nwiIi

其中, I w I_w Iw为加权指标, w i w_i wi为第 i i i个指标的权重, I i I_i Ii为第 i i i个指标的得分。通过计算各指标的权重,我们可以得到一个综合的加权指标,用来衡量洪水发生的概率。

根据加权指标,我们可以将洪水发生的概率分为高、中、低三个风险等级,比如:

  1. 高风险:加权指标大于等于0.8
  2. 中风险:加权指标介于0.5到0.8之间
  3. 低风险:加权指标小于0.5

接着,我们可以根据上述风险等级,建立洪水预警评价模型,比如:

  1. 高风险模型:采用比较严格的阈值,只有当多个指标均指示高风险时,才会发出高风险警报。
  2. 中风险模型:采用较宽松的阈值,只要有一个指标指示中风险,就会发出中风险警报。
  3. 低风险模型:采用较宽松的阈值,只要有一个指标指示低风险,就会发出低风险警报。

最后,我们可以通过灵敏度分析,来确定各指标的权重,比如我们可以通过调整各指标的权重,来观察加权指标的变化情况,从而选取最合适的权重组合。

python 复制代码
# 导入相关库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score

# 读取train.csv数据
train_df = pd.read_csv('train.csv')

# 数据预处理
# 将缺失值替换为平均值
train_df = train_df.fillna(train_df.mean())

# 将非数值型数据进行独热编码
train_df = pd.get_dummies(train_df, columns=['季风强度', '地形排水', '河流管理', '城市化', '气候变化',
                                             '淤积', '农业实践', '侵蚀', '无效防灾', '排水系统',
                                             '海岸脆弱性', '滑坡', '流域', '基础设施恶化', '政策因素'])

# 将发生洪水概率分为高、中、低三个类别
bins = [0, 0.3, 0.6, 1]
labels = ['低风险', '中风险', '高风险']
train_df['洪水风险等级'] = pd.cut(train_df['发生洪水的概率'], bins=bins, labels=labels)

# 划分训练集和测试集
X = train_df.drop(['id', '发生洪水的概率', '洪水风险等级'], axis=1)
y = train_df['洪水风险等级']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 标准化数据
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

# 建立逻辑回归模型
lr = LogisticRegression()
lr.fit(X_train, y_train)
y_pred = lr.predict(X_test)

# 模型评价
print('模型准确率:', accuracy_score(y_test, y_pred))

# 建立预测模型
def predict_model(data):
    # 预处理数据
    # 将缺失值替换为平均值
    data = data.fillna(data.mean())
    # 将非数值型数据进行独热编码
    data = pd.get_dummies(data, columns=['季风强度', '地形排水', '河流管理', '城市化', '气候变化',
                                         '淤积', '农业实践', '侵蚀', '无效防灾', '排水系统',
                                         '海岸脆弱性', '滑坡', '流域', '基础设施恶化', '政策因素'])
    # 标准化数据
    data = sc.transform(data)
    # 预测结果
    y_pred = lr.predict(data)
    return y_pred

# 读取test.csv数据
test_df = pd.read_csv('test.csv')

# 预测洪水风险等级
y_pred = predict_model(test_df)

# 将预测结果填入submit.csv中
submit_df = pd.read_csv('submit.csv')
submit_df['洪水风险等级'] = y_pred
submit_df.to_csv('submit.csv', index=False)

# 绘制直方图和折线图
plt.figure(figsize=(8, 6))
sns.countplot(x='洪水风险等级', data=submit_df)
plt.xlabel('洪水风险等级')
plt.ylabel('数量')
plt.title('洪水风险等级分布')
plt.show()

plt.figure(figsize=(8, 6))
sns.lineplot(x='id', y='洪水风险等级', data=submit_df)
plt.xlabel('id')
plt.ylabel('洪水风险等级')
plt.title('洪水风险等级变化')
plt.show()

# 计算不同指标的权重
coef = pd.DataFrame(lr.coef_[0], index=X.columns, columns=['权重'])
coef.sort_values(by='权重', ascending=False, inplace=True)
print('不同指标的权重为:\n', coef)

# 模型灵敏度分析
# 改变不同指标的值,观察预测结果的变化
test_df = pd.read_csv('test.csv')
test_df['基础设施恶化'] = test_df['基础设施恶化'] * 2
y_pred = predict_model(test_df)

# 将预测结果填入submit.csv中
submit_df = pd.read_csv('submit.csv')
submit_df['洪水风险等级'] = y_pred
submit_df.to_csv('submit.csv', index=False)

# 绘制直方图和折线图
plt.figure(figsize=(8, 6))
sns.countplot(x='洪水风险等级', data=submit_df)
plt.xlabel('洪水风险等级')
plt.ylabel('数量')
plt.title('洪水风险等级分布')
plt.show()

plt.figure(figsize=(8, 6))
sns.lineplot(x='id', y='洪水风险等级', data=submit_df)
plt.xlabel('id')
plt.ylabel('洪水风险等级')
plt.title('洪水风险等级变化')
plt.show()

第四个问题是基于问题2中建立的洪水发生概率的预测模型,预测附件test.csv中所有事件发生洪水的概率,并将预测结果填入附件submit.csv中。然后绘制这74多万件发生洪水的概率的直方图和折线图,分析此结果的分布是否服从正态分布。

假设洪水发生的概率服从正态分布,即
P ( x ) ∼ N ( μ , σ 2 ) P(x)\sim N(\mu,\sigma^2) P(x)∼N(μ,σ2)

其中, P ( x ) P(x) P(x)表示洪水发生的概率, μ \mu μ表示概率的均值, σ 2 \sigma^2 σ2表示概率的方差。

我们可以根据已有的数据,通过最小二乘法来估计概率的均值和方差,得到如下的估计公式:
μ ^ = 1 n ∑ i = 1 n x i \hat{\mu}=\frac{1}{n}\sum_{i=1}^{n}x_i μ^=n1i=1∑nxi
σ ^ 2 = 1 n − 1 ∑ i = 1 n ( x i − μ ^ ) 2 \hat{\sigma}^2=\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\hat{\mu})^2 σ^2=n−11i=1∑n(xi−μ^)2

其中, n n n表示样本数量, x i x_i xi表示第 i i i个样本点的洪水发生概率。

根据以上估计公式,我们可以对附件test.csv中的所有事件的洪水发生概率进行预测,然后将预测结果填入附件submit.csv中。最后,绘制出这74多万件发生洪水的概率的直方图和折线图,观察其分布情况,判断是否符合正态分布。如果符合,则说明我们的预测结果比较准确;如果不符合,则说明我们的预测模型可能存在一定的偏差,需要进一步改进。

根据问题2建立的洪水发生概率的预测模型,可以得到每个洪水事件的发生概率,将这些概率值进行聚类分析,可以将洪水事件分为高、中、低风险的三类。对于每一类洪水事件,可以计算出其对应的概率分布函数,即洪水发生概率的理论分布。假设洪水发生概率服从正态分布,那么可以计算出每一类洪水事件的均值和标准差,进而得到其对应的正态分布函数。通过比较实际概率分布与理论概率分布,可以验证洪水发生概率的预测模型的准确性。

首先,通过填充附件test.csv中的洪水事件的概率,可以得到一个74多万件洪水事件的发生概率的样本。将这些概率值绘制成直方图,可以观察到其分布情况。然后,将每一类洪水事件的正态分布函数叠加在直方图上,可以比较实际分布与理论分布的相似程度。如果实际分布与理论分布基本重合,即说明洪水发生概率的预测模型是准确可靠的。

另外,通过绘制每一类洪水事件的概率折线图,可以更直观地展示概率的变化趋势。通过比较不同类别洪水事件的概率折线图,可以发现高风险的洪水事件概率变化更为剧烈,而低风险的洪水事件概率变化则较为平缓。这也说明了建立洪水发生概率的预测模型时,需要更加重视高风险的洪水事件。

总的来说,通过绘制直方图和折线图,可以更直观地展示洪水发生概率的分布情况,并验证预测模型的准确性。如果分布与理论分布基本一致,说明预测模型是可靠的。同时,通过比较不同类别洪水事件的概率折线图,还可以发现不同类别洪水事件的概率变化趋势,从而更有针对性地采取措施来预防洪水灾害。

根据问题2中建立的洪水发生概率的预测模型,我们可以得到每个事件发生洪水的概率,假设为 p 1 , p 2 , ⋯   , p n p_1,p_2,\cdots,p_n p1,p2,⋯,pn。由于我们需要预测的是该事件是否发生洪水,因此我们可以将概率转换为二分类问题,即将概率大于等于0.5的事件视为发生洪水,小于0.5的视为不发生洪水。因此,我们可以得到预测的标签,即

y p r e d = { 1 , p i ≥ 0.5 0 , p i < 0.5 y_{pred} = \begin{cases} 1, & p_i \ge 0.5 \\ 0, &p_i < 0.5 \end{cases} ypred={1,0,pi≥0.5pi<0.5

然后,我们可以计算预测结果与真实结果的差异,即预测错误的概率。假设真实结果为 y t r u e y_{true} ytrue,则预测错误概率可以表示为:

e r r o r = 1 n ∑ i = 1 n ∣ y p r e d − y t r u e ∣ error = \frac{1}{n}\sum_{i=1}^{n}|y_{pred}-y_{true}| error=n1i=1∑n∣ypred−ytrue∣

通过调整模型中的指标权重,我们可以不断优化模型,使得预测错误概率最小。最终,我们可以得到最优的指标权重,即可以用于预测洪水发生概率的模型。

根据预测的结果,我们可以绘制出直方图和折线图来分析概率的分布情况。如果概率的分布服从正态分布,我们可以用正态分布的概率密度函数来拟合数据,并计算出概率的均值和标准差。然后,我们可以根据正态分布的性质,计算出概率在不同区间内的累积概率,并将其绘制成累积分布函数图。通过比较累积分布函数图和真实数据的分布情况,我们可以判断预测结果是否符合正态分布。如果符合,则说明我们的模型预测的结果比较准确,可以用于预测洪水发生概率。

python 复制代码
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
import seaborn as sns

# 读取train.csv和test.csv文件
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')

# 将数据分为训练集和测试集
X = train_data.drop(['id', 'target'], axis=1)
y = train_data['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 使用KMeans算法将洪水发生概率聚类成不同类别
kmeans = KMeans(n_clusters=3, random_state=42).fit(X_train)
clusters = kmeans.predict(X_test)

# 将聚类结果添加到测试集中
X_test['cluster'] = clusters

# 建立线性回归模型
lr = LinearRegression()
lr.fit(X_train, y_train)

# 预测洪水发生的概率
y_pred = lr.predict(X_test)

# 将预测结果添加到测试集中
X_test['predicted_target'] = y_pred

# 将测试集中所有事件发生洪水的概率填入submit.csv中
submit_data = pd.DataFrame()
submit_data['id'] = test_data['id']
submit_data['predicted_target'] = lr.predict(test_data.drop('id', axis=1))

# 绘制直方图和折线图
plt.figure(figsize=(10, 8))
plt.hist(submit_data['predicted_target'], bins=20)
plt.xlabel('Predicted probability of flooding')
plt.ylabel('Number of events')
plt.title('Distribution of predicted probability of flooding')
plt.show()

plt.figure(figsize=(10, 8))
sns.lineplot(x='id', y='predicted_target', data=submit_data)
plt.xlabel('Event id')
plt.ylabel('Predicted probability of flooding')
plt.title('Change in predicted probability of flooding')
plt.show()

# 计算数据的平均值和标准差
mean = np.mean(submit_data['predicted_target'])
std = np.std(submit_data['predicted_target'])

# 判断数据是否服从正态分布
if mean >= 0.05 and std <= 0.1:
    print("The distribution of predicted probability of flooding follows a normal distribution.")
else:
    print("The distribution of predicted probability of flooding does not follow a normal distribution.")

更多内容 具体可以看看我的下方名片!里面包含有亚太赛一手资料与分析!

另外在赛中,我们也会陪大家一起解析亚太赛APMCM的一些方向

关注 CS数模 团队,数模不迷路~

相关推荐
Alkali!6 小时前
2-5 softmax 回归的简洁实现
人工智能·数据挖掘·回归
算法金「全网同名」10 小时前
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
python·机器学习·数据分析
茶桁12 小时前
使用 PCA 可视化数据的分类能力
人工智能·分类·数据挖掘
spark-aixin12 小时前
昇思学习打卡-9-ResNet50图像分类
学习·分类·数据挖掘
懒大王爱吃狼13 小时前
Python数据分析之pandas学习
开发语言·爬虫·python·学习·信息可视化·数据分析·pandas
紫色沙13 小时前
每天一个数据分析题(四百零三)- 因子分析
数据挖掘·数据分析
UI设计开发服务商15 小时前
HMI 的 UI 风格成就经典
大数据·人工智能·数据分析·云计算·区块链
我非夏日18 小时前
基于Hadoop平台的电信客服数据的处理与分析④项目实现:任务17:数据分析
大数据·hadoop·数据挖掘·数据分析·大数据技术开发
数说故事18 小时前
tiktok数据分析应用介绍和tiktok数据分析平台分享
大数据·数据挖掘·数据分析
LinkTime_Cloud19 小时前
KDP数据分析实战:从0到1完成数据实时采集处理到可视化
数据挖掘·数据分析