当前位置: 首页 > news >正文

Scikit-learn 1.3+ 实战:K-means 与线性回归双模型分析森林火灾 517 条数据

Scikit-learn 1.3+ 实战:K-means 与线性回归双模型分析森林火灾 517 条数据

在数据分析领域,森林火灾预测一直是一个重要且具有挑战性的课题。本文将带领读者使用 Python 的 Scikit-learn 库(1.3+版本)对葡萄牙蒙特西尼奥自然公园的 517 条火灾数据进行深入分析。通过 K-means 聚类和线性回归两种模型的联合应用,我们将探索火灾数据中的隐藏规律,并为火灾预防提供数据支持。

1. 数据准备与探索

1.1 数据集概述

我们使用的数据集来自阿里云天池平台,记录了葡萄牙蒙特西尼奥自然公园的 517 起火灾事件。数据集包含以下关键特征:

  • 气象数据:温度(Temp)、湿度(RH)、风速(Wind)、降雨量(Rain)
  • 可燃物指标:FFMC(细小可燃物湿度码)、DMC(深层可燃物湿度码)、DC(干旱码)
  • 火险指数:ISI(初始蔓延指数)
  • 时空信息:月份(Month)、工作日(Day)
  • 结果指标:过火面积(Area)
import pandas as pd import numpy as np # 加载数据 data = pd.read_csv('forest_fires.csv') print(f"数据集形状: {data.shape}") print(data.info())

1.2 数据预处理

高质量的数据预处理是分析成功的关键。我们需要进行以下步骤:

  1. 缺失值处理:检查并处理缺失数据
  2. 数据类型转换:确保各列数据类型正确
  3. 特征标准化:为聚类分析做准备
from sklearn.preprocessing import StandardScaler # 检查缺失值 print("缺失值统计:") print(data.isnull().sum()) # 选择分析用的特征列 features = ['FFMC', 'DMC', 'DC', 'ISI', 'Temp', 'RH', 'Wind', 'Rain'] X = data[features] # 数据标准化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X)

提示:在实际项目中,建议将预处理流程封装成函数或类,方便复用和调整参数。

2. K-means 聚类分析

2.1 确定最佳聚类数

K-means 算法需要预先指定聚类数量 k。我们使用肘部法则和轮廓系数来确定最佳 k 值。

from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score import matplotlib.pyplot as plt # 计算不同k值的SSE和轮廓系数 sse = [] silhouette = [] k_range = range(2, 10) for k in k_range: kmeans = KMeans(n_clusters=k, random_state=42) kmeans.fit(X_scaled) sse.append(kmeans.inertia_) if k > 1: # 轮廓系数需要至少2个聚类 silhouette.append(silhouette_score(X_scaled, kmeans.labels_)) # 绘制肘部法则图 plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) plt.plot(k_range, sse, 'bo-') plt.xlabel('Number of clusters (k)') plt.ylabel('Sum of squared distance') plt.title('Elbow Method') plt.subplot(1, 2, 2) plt.plot(k_range[1:], silhouette, 'ro-') plt.xlabel('Number of clusters (k)') plt.ylabel('Silhouette Score') plt.title('Silhouette Method') plt.show()

2.2 实施聚类分析

根据上述分析,我们选择 k=3 进行最终聚类:

# 最终聚类模型 kmeans = KMeans(n_clusters=3, random_state=42) clusters = kmeans.fit_predict(X_scaled) # 将聚类结果添加到原始数据 data['Cluster'] = clusters # 分析各聚类特征 cluster_stats = data.groupby('Cluster')[features].mean() print(cluster_stats)

2.3 聚类结果可视化

使用 PCA 降维技术将多维数据可视化:

from sklearn.decomposition import PCA # 降维到3D pca = PCA(n_components=3) X_pca = pca.fit_transform(X_scaled) # 3D散点图 fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') scatter = ax.scatter(X_pca[:, 0], X_pca[:, 1], X_pca[:, 2], c=clusters, cmap='viridis', s=50) ax.set_xlabel('PCA 1') ax.set_ylabel('PCA 2') ax.set_zlabel('PCA 3') plt.colorbar(scatter) plt.title('3D Visualization of Clusters') plt.show()

3. 线性回归分析

3.1 单变量线性回归

我们先从简单的单变量回归开始,分析温度与过火面积的关系:

from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 准备数据 X_temp = data[['Temp']] y_area = data['Area'] # 训练模型 lr_temp = LinearRegression() lr_temp.fit(X_temp, y_area) # 预测和评估 y_pred = lr_temp.predict(X_temp) mse = mean_squared_error(y_area, y_pred) r2 = r2_score(y_area, y_pred) print(f"温度模型评估:\nMSE: {mse:.2f}\nR²: {r2:.2f}") # 可视化回归线 plt.figure(figsize=(10, 6)) plt.scatter(X_temp, y_area, alpha=0.5) plt.plot(X_temp, y_pred, color='red', linewidth=2) plt.xlabel('Temperature (°C)') plt.ylabel('Burned Area (ha)') plt.title('Temperature vs Burned Area') plt.show()

3.2 多变量线性回归

考虑更多影响因素,建立多元线性回归模型:

# 选择多个特征 X_multi = data[['Temp', 'RH', 'Wind', 'FFMC']] y_area = data['Area'] # 训练模型 lr_multi = LinearRegression() lr_multi.fit(X_multi, y_area) # 评估模型 y_pred_multi = lr_multi.predict(X_multi) mse_multi = mean_squared_error(y_area, y_pred_multi) r2_multi = r2_score(y_area, y_pred_multi) print(f"多元模型评估:\nMSE: {mse_multi:.2f}\nR²: {r2_multi:.2f}") print("系数:", lr_multi.coef_)

3.3 模型优化与验证

为了提高模型性能,我们可以:

  1. 对数变换处理偏态分布的目标变量
  2. 使用交叉验证评估模型稳定性
  3. 引入多项式特征捕捉非线性关系
from sklearn.model_selection import cross_val_score from sklearn.preprocessing import PolynomialFeatures from sklearn.pipeline import make_pipeline # 对数变换 y_log = np.log1p(data['Area']) # 创建包含多项式特征的管道 model = make_pipeline( PolynomialFeatures(degree=2, include_bias=False), StandardScaler(), LinearRegression() ) # 交叉验证 scores = cross_val_score(model, X_multi, y_log, scoring='neg_mean_squared_error', cv=5) print(f"交叉验证MSE: {-scores.mean():.2f} (±{scores.std():.2f})")

4. 模型联合分析与应用

4.1 聚类与回归结果交叉分析

将聚类结果与回归分析结合,探索不同群组的火灾特性:

# 按聚类分组分析回归性能 for cluster in sorted(data['Cluster'].unique()): cluster_data = data[data['Cluster'] == cluster] X_cluster = cluster_data[['Temp', 'RH', 'Wind']] y_cluster = np.log1p(cluster_data['Area']) lr_cluster = LinearRegression() scores = cross_val_score(lr_cluster, X_cluster, y_cluster, scoring='neg_mean_squared_error', cv=3) print(f"聚类 {cluster} 的MSE: {-scores.mean():.2f}")

4.2 季节性模式分析

分析火灾发生的月份分布,识别高风险季节:

# 按月统计火灾次数和平均过火面积 monthly_stats = data.groupby('Month').agg({ 'Area': ['count', 'mean'], 'Temp': 'mean', 'RH': 'mean' }).sort_values(('Area', 'count'), ascending=False) print("按月统计结果:") print(monthly_stats) # 可视化 plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) monthly_stats[('Area', 'count')].plot(kind='bar') plt.title('火灾次数按月分布') plt.subplot(1, 2, 2) monthly_stats[('Area', 'mean')].plot(kind='bar', color='orange') plt.title('平均过火面积按月分布') plt.tight_layout() plt.show()

4.3 实际应用建议

基于分析结果,我们可以提出以下实用建议:

  1. 高风险时段预警

    • 8-9月是火灾高发期,应加强监测
    • 高温低湿天气需特别警惕
  2. 区域差异化防控

    • 对不同聚类区域采取针对性措施
    • 高火险区域增加巡逻频次
  3. 监测指标优化

    • 重点关注温度、湿度和FFMC指标
    • 建立多指标综合预警系统
# 示例:构建简单预警系统 def fire_alert_system(temp, rh, ffmc): """基于线性回归模型的简单预警系统""" # 标准化输入 X_new = scaler.transform([[ffmc, 0, 0, 0, temp, rh, 0, 0]])[0][:4] # 预测过火面积 area_pred = np.expm1(lr_multi.predict([[temp, rh, 0, ffmc]])[0]) # 判断风险等级 if area_pred > 50: return "红色预警: 极高火灾风险" elif area_pred > 20: return "橙色预警: 高火灾风险" elif area_pred > 5: return "黄色预警: 中等火灾风险" else: return "蓝色预警: 低火灾风险" # 测试预警系统 print(fire_alert_system(temp=35, rh=30, ffmc=90)) print(fire_alert_system(temp=25, rh=60, ffmc=80))

5. 高级分析与模型改进

5.1 特征重要性分析

使用随机森林评估各特征的重要性:

from sklearn.ensemble import RandomForestRegressor # 准备数据 X_rf = data[features] y_rf = np.log1p(data['Area']) # 训练随机森林 rf = RandomForestRegressor(n_estimators=100, random_state=42) rf.fit(X_rf, y_rf) # 特征重要性 importance = pd.DataFrame({ 'Feature': features, 'Importance': rf.feature_importances_ }).sort_values('Importance', ascending=False) print("特征重要性排序:") print(importance) # 可视化 plt.figure(figsize=(10, 6)) plt.barh(importance['Feature'], importance['Importance']) plt.xlabel('Importance Score') plt.title('Feature Importance') plt.show()

5.2 聚类特征优化

根据特征重要性结果,优化聚类分析的特征选择:

# 选择重要性高的特征重新聚类 important_features = ['FFMC', 'Temp', 'RH', 'DMC'] X_important = data[important_features] X_important_scaled = scaler.fit_transform(X_important) # 重新聚类 kmeans_important = KMeans(n_clusters=3, random_state=42) clusters_important = kmeans_important.fit_predict(X_important_scaled) # 分析新聚类结果 data['Cluster_Optimized'] = clusters_important print(data.groupby('Cluster_Optimized')[important_features].mean())

5.3 模型部署与API构建

将最终模型封装为可部署的API:

from flask import Flask, request, jsonify import joblib # 保存模型 joblib.dump(lr_multi, 'forest_fire_model.pkl') joblib.dump(scaler, 'scaler.pkl') # 模拟API app = Flask(__name__) @app.route('/predict', methods=['POST']) def predict(): data = request.get_json() temp = data['temp'] rh = data['rh'] ffmc = data['ffmc'] # 标准化输入 X_new = [[temp, rh, 0, ffmc]] # 0是占位符 # 预测 area_pred = np.expm1(lr_multi.predict(X_new)[0]) return jsonify({'predicted_area': area_pred}) if __name__ == '__main__': app.run(debug=True)

注意:实际部署时需要考虑模型版本管理、输入验证、性能监控等更多因素。

http://www.jsqmd.com/news/1150478/

相关文章:

  • Windows网络性能测试终极指南:iperf3完整下载与使用教程
  • 清华大学学位论文LaTeX模板终极指南:从零开始轻松完成学术排版
  • Lasso vs Ridge vs Elastic Net:3 种正则化回归在 sklearn 中的实战对比与选型指南
  • Trae IDE内嵌Fast Requests Pro:HTTP请求效率革命
  • 如何构建你的第二大脑:25个Obsidian模板打造Zettelkasten知识管理系统
  • 微信小程序反编译终极指南:5种高效方法掌握unveilr核心技术
  • CIFAR-10 图像分类:4种主流CNN架构(VGG16/ResNet18)在PyTorch 2.0下的性能基准测试
  • ComfyUI低显存工作流:单图生成3D模型的AI自动化实践
  • PyTorch 2.x GPU设备管理:3种指定方法与`.to(device)`性能对比
  • 数屿医械数据库实操:3步精准查询2023版二类医疗器械目录与变更
  • PyTorch 2.x 优化器实战:SGD/Adam/AdamW 在 ResNet-18 上的 3 种收敛曲线对比
  • 基于SpringBoot+Vue的大学生选修选课系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 蓝速科技 RISC-V+ 鸿蒙终端:一机多场景信创改造实效评测
  • 路的形状。
  • AI音乐伴舞技术解析:从节奏识别到动作匹配的完整实现
  • AI视频风格转换:赛博朋克边缘行者风格本地部署实战指南
  • PyTorch多GPU环境排错:5个常见设备不匹配错误与解决方案
  • TensorFlow GPU 3 种安装方案对比:conda自动 vs pip手动 vs Docker,耗时与成功率实测
  • PyTorch 2.x 与 NumPy 互操作:3种转换方法的内存与性能实测对比
  • 数据预处理避坑指南:5个常见错误与Scikit-learn 1.5.0 正确实践
  • 百度Unlimited-OCR:长时域连续解析技术原理与实战指南
  • R(2+1)D 网络 PyTorch 复现:从 3D 卷积拆分到 Kinetics 数据集 82.3% 准确率
  • TensorFlow 2.21 CPU版 vs GPU版:3个关键场景下的性能与安装复杂度对比
  • WorkshopDL:三步搞定Steam创意工坊模组下载的终极解决方案
  • 计算机毕业设计之酒店多功能管理系统
  • 一文了解图像传感器的动态范围
  • Sklearn 与 Pandas 缺失值填充对比:KNNImputer vs 统计方法 3 维度评测
  • Proxmox VE 8.4 显卡直通实战:NVIDIA RTX 3090 单卡配置 8 步避坑指南
  • Halcon与OpenCV对比:工业视觉项目从算法到部署的5个关键决策点
  • 基于AI视觉的行车记录仪道路病害检测技术方案