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

发布时间:2026/7/8 22:22:57

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 数据预处理高质量的数据预处理是分析成功的关键。我们需要进行以下步骤缺失值处理检查并处理缺失数据数据类型转换确保各列数据类型正确特征标准化为聚类分析做准备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_clustersk, random_state42) 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 实施聚类分析根据上述分析我们选择 k3 进行最终聚类# 最终聚类模型 kmeans KMeans(n_clusters3, random_state42) 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_components3) X_pca pca.fit_transform(X_scaled) # 3D散点图 fig plt.figure(figsize(10, 8)) ax fig.add_subplot(111, projection3d) scatter ax.scatter(X_pca[:, 0], X_pca[:, 1], X_pca[:, 2], cclusters, cmapviridis, s50) 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, alpha0.5) plt.plot(X_temp, y_pred, colorred, linewidth2) 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 模型优化与验证为了提高模型性能我们可以对数变换处理偏态分布的目标变量使用交叉验证评估模型稳定性引入多项式特征捕捉非线性关系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(degree2, include_biasFalse), StandardScaler(), LinearRegression() ) # 交叉验证 scores cross_val_score(model, X_multi, y_log, scoringneg_mean_squared_error, cv5) 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, scoringneg_mean_squared_error, cv3) 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), ascendingFalse) print(按月统计结果:) print(monthly_stats) # 可视化 plt.figure(figsize(12, 5)) plt.subplot(1, 2, 1) monthly_stats[(Area, count)].plot(kindbar) plt.title(火灾次数按月分布) plt.subplot(1, 2, 2) monthly_stats[(Area, mean)].plot(kindbar, colororange) plt.title(平均过火面积按月分布) plt.tight_layout() plt.show()4.3 实际应用建议基于分析结果我们可以提出以下实用建议高风险时段预警8-9月是火灾高发期应加强监测高温低湿天气需特别警惕区域差异化防控对不同聚类区域采取针对性措施高火险区域增加巡逻频次监测指标优化重点关注温度、湿度和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(temp35, rh30, ffmc90)) print(fire_alert_system(temp25, rh60, ffmc80))5. 高级分析与模型改进5.1 特征重要性分析使用随机森林评估各特征的重要性from sklearn.ensemble import RandomForestRegressor # 准备数据 X_rf data[features] y_rf np.log1p(data[Area]) # 训练随机森林 rf RandomForestRegressor(n_estimators100, random_state42) rf.fit(X_rf, y_rf) # 特征重要性 importance pd.DataFrame({ Feature: features, Importance: rf.feature_importances_ }).sort_values(Importance, ascendingFalse) 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_clusters3, random_state42) 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构建将最终模型封装为可部署的APIfrom 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(debugTrue)注意实际部署时需要考虑模型版本管理、输入验证、性能监控等更多因素。

相关新闻