Python scikit-learn 1.4 实战:蒙特西尼奥森林火灾数据 K-Means 聚类与 3D 可视化
Python scikit-learn 1.4 实战蒙特西尼奥森林火灾数据 K-Means 聚类与 3D 可视化当数据分析遇上环境科学Python 的 scikit-learn 库为我们打开了一扇探索自然现象的新窗口。蒙特西尼奥自然公园的火灾数据集就像一本等待破译的自然密码本而 K-Means 算法和 3D 可视化技术则是我们解读这些密码的利器。本文将带你深入这个数据科学项目从数据准备到最终可视化一步步揭开隐藏在气象数据背后的森林火灾模式。1. 环境准备与数据加载在开始我们的分析之前确保你的 Python 环境已经安装了以下必要库import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.cluster import KMeans from mpl_toolkits.mplot3d import Axes3D from sklearn.preprocessing import StandardScaler数据集可以从阿里云天池平台获取包含了葡萄牙蒙特西尼奥自然公园 517 起火灾事件的详细记录。让我们先加载并初步探索数据# 加载数据集 data pd.read_csv(montesinho_fire_dataset.csv) # 查看数据概览 print(data.info()) print(data.describe())数据集包含以下关键特征FFMC细小可燃物湿度码DMC深层可燃物湿度码DC干旱码ISI初始蔓延指数Temp温度(℃)RH相对湿度(%)Wind风速(km/h)Rain降雨量(mm)Area过火面积(公顷)提示在实际项目中建议将数据分为训练集和测试集但聚类分析通常使用全部数据进行模式发现。2. 数据预处理与特征工程原始数据需要经过适当处理才能发挥最大价值。我们重点关注与火灾风险直接相关的五个关键指标# 选择关键特征 features [FFMC, DMC, DC, ISI, Temp] X data[features] # 数据标准化 scaler StandardScaler() X_scaled scaler.fit_transform(X) # 检查缺失值 print(缺失值统计\n, X.isnull().sum())标准化处理对 K-Means 算法尤为重要因为该算法对特征的尺度敏感。我们使用 StandardScaler 将各特征缩放到均值为0方差为1的标准正态分布。特征相关性分析表特征组合相关系数物理意义FFMC-DMC0.62地表与深层可燃物湿度关系DMC-DC0.78深层可燃物与干旱程度关联ISI-Temp0.55火势蔓延与温度相关性3. K-Means 聚类实战确定最佳聚类数是 K-Means 算法的关键挑战。我们使用肘部法则和轮廓系数相结合的方法from sklearn.metrics import silhouette_score inertia [] silhouette_scores [] K_range range(2, 10) for k in K_range: kmeans KMeans(n_clustersk, random_state42, n_init10) kmeans.fit(X_scaled) inertia.append(kmeans.inertia_) silhouette_scores.append(silhouette_score(X_scaled, kmeans.labels_)) # 绘制肘部法则图 plt.figure(figsize(12, 5)) plt.subplot(1, 2, 1) plt.plot(K_range, inertia, bo-) plt.xlabel(聚类数 k) plt.ylabel(惯性值) plt.title(肘部法则) plt.subplot(1, 2, 2) plt.plot(K_range, silhouette_scores, ro-) plt.xlabel(聚类数 k) plt.ylabel(轮廓系数) plt.title(轮廓系数分析) plt.show()基于分析结果我们选择 k3 进行最终聚类# 最终聚类模型 optimal_k 3 kmeans KMeans(n_clustersoptimal_k, random_state42, n_init10) clusters kmeans.fit_predict(X_scaled) # 将聚类结果添加到原始数据 data[Cluster] clusters聚类中心特征对比特征集群0集群1集群2FFMC86.391.282.1DMC35.6108.415.2DC220.7540.3110.5ISI7.214.54.3Temp18.625.312.74. 3D 可视化实现现在是时候让数据立体起来了。我们将使用 Matplotlib 的 3D 功能展示聚类结果# 创建3D图形 fig plt.figure(figsize(12, 10)) ax fig.add_subplot(111, projection3d) # 为每个集群设置不同颜色 colors [r, g, b] for i in range(optimal_k): cluster_data data[data[Cluster] i] ax.scatter(cluster_data[FFMC], cluster_data[DMC], cluster_data[Temp], ccolors[i], labelf集群 {i}, s50, alpha0.6) # 标记聚类中心 centers scaler.inverse_transform(kmeans.cluster_centers_) ax.scatter(centers[:, 0], centers[:, 1], centers[:, 4], cblack, markerX, s200, alpha1, label聚类中心) # 设置坐标轴标签 ax.set_xlabel(FFMC (细小可燃物湿度)) ax.set_ylabel(DMC (深层可燃物湿度)) ax.set_zlabel(Temperature (℃)) ax.set_title(森林火灾数据三维聚类可视化) plt.legend() plt.tight_layout() # 添加交互式旋转功能在Jupyter中启用 %matplotlib notebook plt.show()可视化优化技巧调整alpha参数控制点透明度避免重叠点遮挡使用s参数调整点的大小突出重要数据添加%matplotlib notebook魔法命令实现交互式旋转5. 聚类结果分析与物理解释三个集群展现出明显的环境特征差异高风险集群集群1特征高温度(25.3℃)、高DMC(108.4)、高DC(540.3)物理解释代表极端干燥和高温条件火灾发生风险最高实际意义需要最高级别的防火警戒中风险集群集群0特征中等温度(18.6℃)、中等DMC(35.6)、中等DC(220.7)物理解释典型的季节性干燥条件实际意义常规防火措施适用低风险集群集群2特征低温(12.7℃)、低DMC(15.2)、低DC(110.5)物理解释湿润凉爽条件实际意义火灾风险最低可减少防火资源投入集群特征雷达图对比from math import pi # 准备数据 categories features N len(categories) angles [n / float(N) * 2 * pi for n in range(N)] angles angles[:1] fig plt.figure(figsize(8, 8)) ax fig.add_subplot(111, polarTrue) ax.set_theta_offset(pi / 2) ax.set_theta_direction(-1) plt.xticks(angles[:-1], categories) ax.set_rlabel_position(0) plt.yticks([0.5, 1, 1.5], [0.5, 1.0, 1.5], colorgrey, size7) plt.ylim(0, 1.5) for i in range(optimal_k): values centers[i] values (values - values.min()) / (values.max() - values.min()) # 归一化 values np.append(values, values[0]) ax.plot(angles, values, linewidth2, linestylesolid, labelf集群 {i}) ax.fill(angles, values, alpha0.1) plt.title(聚类中心特征对比雷达图, y1.1) plt.legend(locupper right, bbox_to_anchor(1.3, 1.1)) plt.show()6. 项目扩展与实用建议完成基础分析后可以考虑以下扩展方向动态聚类过程可视化from sklearn.datasets import make_blobs from IPython.display import clear_output import time # 生成模拟数据 X, _ make_blobs(n_samples300, centers3, random_state42) # 初始化 kmeans KMeans(n_clusters3, initrandom, max_iter1, random_state42, n_init1) plt.figure(figsize(10, 8)) for i in range(1, 10): kmeans.fit(X) clear_output(waitTrue) plt.scatter(X[:, 0], X[:, 1], ckmeans.labels_, cmapviridis, s50) plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], cred, markerX, s200) plt.title(f迭代次数: {i}) plt.show() time.sleep(1)结合时间序列分析按月/季分析集群分布变化预测高风险时段部署为Web应用from flask import Flask, render_template import plotly.express as px app Flask(__name__) app.route(/) def visualize(): fig px.scatter_3d(data, xFFMC, yDMC, zTemp, colorCluster, opacity0.7) return render_template(viz.html, plotfig.to_html()) if __name__ __main__: app.run(debugTrue)注意在实际项目中建议使用更高效的聚类算法如MiniBatchKMeans处理大规模数据并考虑使用Plotly或Bokeh等交互性更强的可视化库。