赞
踩
目录
洪水是暴雨、急剧融冰化雪、风暴潮等自然因素引起的江河湖泊水量迅速增 加,或者水位迅猛上涨的一种自然现象,是自然灾害。洪水又称大水,是河流、 海洋、湖泊等水体上涨超过一定水位,威胁有关地区的安全,甚至造成灾害的水 流。洪水一词,在中国出自先秦《尚书·尧典》。从那时起,四千多年中有过很 多次水灾记载,欧洲最早的洪水记载也远在公元前 1450 年。在西亚的底格里斯-幼发拉底河以及非洲的尼罗河关于洪水的记载,则可追溯到公元前 40 世纪。2023 年 6 月 24 日 8 时至 25 日 8 时,中国 15 条河流发生超警洪水。2023 年,全球洪水等造成了数十亿美元的经济损失。
洪水的频率和严重程度与人口增长趋势相当一致。迅猛的人口增长,扩大耕地,围湖造田,乱砍滥伐等人为破坏不断地改变着地表状态,改变了汇流条件,加剧了洪灾程度。在降水多的年份,洪水是否造成灾害,以及洪水灾害的大小,也离不开人为因素,长期以来人为的森林破坏是其重要原因。长江上游乱砍滥伐的恶果是惊人的水土流失。现已达 35 万平方千米,每年土壤浸融量达 25 亿吨。河流、湖泊、水库淤积的泥沙量达 20 亿吨。仅四川一省一年流入长江各支流的泥沙,如叠成宽高各 1 米的堤,可以围绕地球赤道 16 圈。我国第一大淡水湖洞庭湖每年沉积的泥沙达 1 亿多吨,有专家惊呼:“这样下去,要不了 50 年,洞庭湖将从地球上消失!”长江之险,险在荆江,由于泥沙俱下,如今荆江段河床比江外地面高出十多米,成了除黄河之外名副其实的地上河。对森林的肆意砍伐不仅危害自己,而且祸及子孙后代,世界上许多地方,如美索不达米亚、小亚细亚、阿尔卑斯山南坡等由于过度砍伐森林,最后都变成了不毛之地。
附件 train.csv 中提供了超过 100 万的洪水数据,其中包含洪水事件的 id、季风强度、地形排水、河流管理、森林砍伐、城市化、气候变化、大坝质量、淤积、农业实践、侵蚀、无效防灾、排水系统、海岸脆弱性、滑坡、流域、基础设施恶化、人口得分、湿地损失、规划不足、政策因素和发生洪水的概率。
附件 test.csv 中包含了超过 70 万的洪水数据,其中包含洪水事件的 id 和上 述 20 个指标得分,缺少发生洪水的概率。附件 submit.csv 中包含 test.csv 中的洪水事件的 id,缺少发生洪水的概率。
请你们的团队通过数学建模和数据分析的方法,预测发生洪水灾害的概率,解决以下问题:
问题 1. 请分析附件 train.csv 中的数据,分析并可视化上述 20 个指标中,哪些指标与洪水的发生有着密切的关联?哪些指标与洪水发生的相关性不大?并分析可能的原因,然后针对洪水的提前预防,提出你们合理的建议和措施。
问题 2.将附件 train.csv 中洪水发生的概率聚类成不同类别,分析具有高、中、低风险的洪水事件的指标特征。然后,选取合适的指标,计算不同指标的权重,建立发生洪水不同风险的预警评价模型,最后进行模型的灵敏度分析。
问题 3. 基于问题 1 中指标分析的结果,请建立洪水发生概率的预测模型,从 20 个指标中选取合适指标,预测洪水发生的概率,并验证你们预测模型的准确性。如果仅用 5 个关键指标,如何调整改进你们的洪水发生概率的预测模型?
问题 4. 基于问题 2 中建立的洪水发生概率的预测模型,预测附件 test.csv 中所有事件发生洪水的概率,并将预测结果填入附件 submit.csv 中。然后绘制这 74多万件发生洪水的概率的直方图和折线图,分析此结果的分布是否服从正态分布。
数据预处理:首先对附件 train.csv 中的数据进行预处理,包括缺失值的填补、异常值的处理和数据标准化等,确保数据的可靠性和准确性。
相关性分析:通过计算每个指标与洪水发生的相关系数,来衡量指标与洪水发生的关联程度。相关系数绝对值越大,表示相关性越强。通过可视化分析,可以直观地展示各个指标与洪水发生的关联程度。
原因分析:分析相关性较强的指标和相关性较弱的指标,找出可能的原因。比如,相关性较强的指标可能是洪水发生的主要原因,相关性较弱的指标可能与洪水发生无关或者相关性较弱的原因。
建议和措施:根据分析结果,提出针对洪水的提前预防的合理建议和措施。比如,针对相关性较强的指标,可以采取措施进行调整或改善,从而减少洪水的发生;针对相关性较弱的指标,可以采取措施进行监控或预警,从而及时应对可能发生的洪水。
请分析附件 train.csv 中的数据,分析并可视化上述 20 个指标中,哪些指标与洪水的发生有着密切的关联?哪些指标与洪水发生的相关性不大?并分析可能的原因,然后针对洪水的提前预防,提出你们合理的建议和措施。
首先对附件数据进行数据分析,分析代码如下:
- import matplotlib
-
- # 设置 matplotlib 支持中文显示
- matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
- matplotlib.rcParams['axes.unicode_minus'] = False # 解决保存图像时负号'-'显示为方块的问题
-
-
- #%%
-
- import pandas as pd
-
- # 读取CSV文件
- def load_data(file_path):
- try:
- data = pd.read_csv(file_path, encoding='gbk', delimiter='\t')
- return data
- except Exception as e:
- print(f"读取文件时出错: {e}")
- return None
-
- # 基本统计分析
- def analyze_data(data):
- if data is not None:
- # 显示数据的基本描述统计
- print("描述性统计:")
- print(data.describe())
-
- # 显示数据中每个列的数据类型
- print("\n数据类型:")
- print(data.dtypes)
-
- # 检查是否有缺失值
- print("\n缺失值检查:")
- print(data.isnull().sum())
-
- # 主函数,执行程序
- def main():#B站UP:white学长努力中
- file_path = 'train.csv'
- data = load_data(file_path)
- analyze_data(data)
-
- if __name__ == "__main__":
- main()
- import pandas as pd
- from sklearn.model_selection import train_test_split
- from sklearn.preprocessing import StandardScaler
- from tensorflow.keras.models import Sequential
- from tensorflow.keras.layers import Dense
- from tensorflow.keras.optimizers import Adam
-
- def load_data(file_path):
- # 尝试使用pandas的read_csv自动检测分隔符
- data = pd.read_csv(file_path, encoding='gbk', sep=None, engine='python')
- # 删除完全为空的行
- data.dropna(how='all', inplace=True)
- # 显示数据概览
- print(data.head())
- return data
- #B站UP:white学长努力中
- def preprocess_data(data):
- # 移除ID列
- data = data.drop(columns=['id'])
- # 填充缺失值#B站UP:white学长努力中
- data.fillna(data.median(), inplace=True)
- # 将所有列转换为数值类型,非数值转为NaN后填充中位数
- data = data.apply(pd.to_numeric, errors='coerce').fillna(data.median())
- # 标准化数据
- scaler = StandardScaler()
- features = data.columns[:-1] # 最后一列是洪水概率
- X = scaler.fit_transform(data[features])
- y = data.iloc[:, -1] # 最后一列是标签
- return train_test_split(X, y, test_size=0.2, random_state=42)
- #B站UP:white学长努力中
- def build_model(input_dim):
- model = Sequential([
- Dense(64, activation='relu', input_dim=input_dim),
- Dense(64, activation='relu'),
- Dense(1, activation='linear')
- ])
- model.compile(optimizer=Adam(learning_rate=0.001), loss='mse')
- return model
- #B站UP:white学长努力中
-
- file_path = 'train.csv'
- data = load_data(file_path)
- X_train, X_test, y_train, y_test = preprocess_data(data)
- model = build_model(X_train.shape[1])
- history=model.fit(X_train, y_train, epochs=100, validation_data=(X_test, y_test), verbose=2)

- import matplotlib.pyplot as plt
- import seaborn as sns
- import numpy as np
- import pandas as pd
-
- # 设置中文字体
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
- plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
-
- # 绘制每个特征的直方图
- def plot_feature_distributions(data):
- features = data.columns[:-1]
- num_features = len(features)
- rows = (num_features + 3) // 4 # 计算需要多少行
- plt.figure(figsize=(20, 4 * rows))
- for i, col in enumerate(features):#B站UP:white学长努力中
- plt.subplot(rows, 4, i + 1)
- sns.histplot(data[col], kde=True)
- plt.title(col)
- plt.xticks(rotation=45) # 旋转x轴标签,防止重叠
- plt.tight_layout()
- plt.show()#B站UP:white学长努力中
-
- # 绘制训练和验证损失
- def plot_training_history(history):
- plt.figure(figsize=(10, 5))
- plt.plot(history.history['loss'], label='训练损失')
- plt.plot(history.history['val_loss'], label='验证损失')
- plt.title('模型训练过程中的损失变化')
- plt.ylabel('损失')
- plt.xlabel('周期')
- plt.legend()#B站UP:white学长努力中
- plt.show()
-
- # 绘制特征与洪水概率的相关性
- def plot_feature_correlations(data):
- plt.figure(figsize=(12, 10))
- sns.heatmap(data.corr(), annot=True, cmap='coolwarm', fmt=".2f")
- plt.title('特征相关性热图')#B站UP:white学长努力中
- plt.show()
-
- # 预测并与实际值比较
- def plot_predictions(X_test, y_test, model):
- predictions = model.predict(X_test)
- plt.figure(figsize=(10, 5))
- plt.scatter(y_test, predictions, alpha=0.2)
- plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=3)
- plt.title('预测值 vs 实际值')
- plt.xlabel('实际值')
- plt.ylabel('预测值')#B站UP:white学长努力中
- plt.show()
-
- plot_feature_distributions(data)
- plot_training_history(history)
- plot_feature_correlations(data)
- plot_predictions(X_test, y_test, model)

将附件 train.csv 中洪水发生的概率聚类成不同类别,分析具有高、中、低风险的洪水事件的指标特征。然后,选取合适的指标,计算不同指标的权重,建立发生洪水不同风险的预警评价模型,最后进行模型的灵敏度分析。
具体讲解请看B站视频
- import pandas as pd
- from sklearn.preprocessing import StandardScaler
- from sklearn.cluster import KMeans
- from sklearn.ensemble import RandomForestRegressor
- from sklearn.model_selection import train_test_split
- from sklearn.metrics import mean_squared_error
-
- def load_data(filepath):
- # 加载数据,并尝试自动检测分隔符
- data = pd.read_csv(filepath, encoding='gbk', sep=None, engine='python')
- # 删除完全为空的行
- data.dropna(how='all', inplace=True)
- print("#B站UP:white学长努力中\n", data.head())
- return data
-
- def preprocess_data(data):
- # 移除ID列,假设它是第一列
- data = data.iloc[:, 1:]
- # 填充缺失值
- data.fillna(data.median(), inplace=True)
- # 转换所有列为数值型,如果转换失败则填充NaN并使用中位数替换
- data = data.apply(pd.to_numeric, errors='coerce').fillna(data.median())
- # 标准化数据,假设最后一列是洪水概率
- scaler = StandardScaler()
- features = data.columns[:-1]
- X = scaler.fit_transform(data[features])#B站UP:white学长努力中
- y = data.iloc[:, -1]
- return train_test_split(X, y, test_size=0.2, random_state=42)
-
- def perform_clustering(X_train):
- # 进行K-means聚类,假设3个簇
- kmeans = KMeans(n_clusters=3, random_state=0)
- clusters = kmeans.fit_predict(X_train)
- return clusters
-
- def feature_importance(X_train, y_train):#B站UP:white学长努力中
- # 特征重要性评估
- model = RandomForestRegressor(n_estimators=50, random_state=42)
- model.fit(X_train, y_train)#B站UP:white学长努力中
- importances = model.feature_importances_
- print("Feature Importances:", importances)
- return model
-
- def sensitivity_analysis(model, X_test):
- # 灵敏度分析
- baseline = model.predict(X_test)
- sensitivities = {}#B站UP:white学长努力中
- for i in range(X_test.shape[1]):
- X_test_copy = X_test.copy()
- X_test_copy[:, i] += 0.1 * X_test_copy[:, i].std()
- perturbed = model.predict(X_test_copy)
- sensitivity = mean_squared_error(baseline, perturbed)
- sensitivities[i] = sensitivity
- print("Sensitivities:", sensitivities)
- #B站UP:white学长努力中
-
- filepath = 'train.csv'
- data = load_data(filepath)
- X_train, X_test, y_train, y_test = preprocess_data(data)
- clusters = perform_clustering(X_train)#B站UP:white学长努力中
- model = feature_importance(X_train, y_train)
- sensitivity_analysis(model, X_test)

基于问题 1 中指标分析的结果,请建立洪水发生概率的预测模型,从 20 个指标中选取合适指标,预测洪水发生的概率,并验证你们预测模型的准确性。如果仅用 5 个关键指标,如何调整改进你们的洪水发生概率的预测模型?
- import pandas as pd
- import numpy as np
- from sklearn.preprocessing import StandardScaler
- from sklearn.ensemble import RandomForestRegressor
- from sklearn.model_selection import train_test_split
- from sklearn.metrics import mean_squared_error, r2_score
- import matplotlib.pyplot as plt
- import seaborn as sns
-
- def load_data(filepath):
- data = pd.read_csv(filepath, encoding='gbk', sep=None, engine='python')
- data.dropna(how='all', inplace=True)
- return data
-
- def preprocess_data(data):
- data = data.iloc[:, 1:]
- data.fillna(data.median(), inplace=True)
- data = data.apply(pd.to_numeric, errors='coerce').fillna(data.median())
- scaler = StandardScaler()
- features = data.columns[:-1]
- X = scaler.fit_transform(data[features])
- y = data.iloc[:, -1]
- return train_test_split(X, y, test_size=0.2, random_state=42), features
-
- def feature_importance(X_train, y_train, feature_names):
- model = RandomForestRegressor(n_estimators=50, random_state=42)
- model.fit(X_train, y_train)
- importances = model.feature_importances_
- feature_importance_dict = dict(zip(feature_names, importances))
- print("Feature Importances:", feature_importance_dict)
- return model, importances
-
- def plot_feature_importance(importances, features):
- plt.figure(figsize=(12, 8))
- indices = np.argsort(importances)[::-1]
- plt.bar(range(len(importances)), importances[indices], align="center")
- plt.xticks(range(len(importances)), [features[i] for i in indices], rotation=45)
- plt.title('特征重要性')
- plt.show()
-
- def build_and_evaluate_model(X_train, X_test, y_train, y_test):
- model = RandomForestRegressor(n_estimators=50, random_state=42)
- model.fit(X_train, y_train)
- predictions = model.predict(X_test)
- mse = mean_squared_error(y_test, predictions)
- r2 = r2_score(y_test, predictions)
- print(f"模型评估结果:MSE = {mse}, R^2 = {r2}")
- return model, predictions
-
- def main():
- filepath = 'train.csv'
- data = load_data(filepath)
- (X_train, X_test, y_train, y_test), feature_names = preprocess_data(data)
-
- # 使用所有特征进行训练和评估
- model_all_features, importances = feature_importance(X_train, y_train, feature_names)
- plot_feature_importance(importances, feature_names)
- model_all, predictions_all = build_and_evaluate_model(X_train, X_test, y_train, y_test)
-
- # 选择前5个重要特征
- top_5_indices = np.argsort(importances)[::-1][:5]
- top_5_features = feature_names[top_5_indices]
- print(f"Top 5 Features: {top_5_features}")
-
- # 基于前5个特征重新进行训练和评估
- X_train_top5 = X_train[:, top_5_indices]
- X_test_top5 = X_test[:, top_5_indices]
- model_top5, predictions_top5 = build_and_evaluate_model(X_train_top5, X_test_top5, y_train, y_test)
-
- if __name__ == "__main__":
- main()

请查看源代码包
成品论文:
思路与完整源代码:
内含思路讲解视频和完整代码(python,都可以单独运行),如有问题可以加Up的QQ(购买后即可看到)资料内容预计7月4日晚全部更新完成
更新1-4问基础代码使用tensorflow,今晚更新使用常规库的代码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。