用Python搞定电力负荷预测:从数据清洗到LightGBM建模的保姆级实战
电力负荷预测实战从数据清洗到LightGBM建模的完整指南电力负荷预测是能源管理领域的核心课题之一。想象一下你刚拿到一份包含温度、天气和用电记录的复杂数据集如何从中提取有价值的信息并构建可靠的预测模型本文将带你完整走一遍这个流程从最原始的数据清洗开始到最终构建高性能的LightGBM模型。1. 数据清洗从混乱到规整真实世界的数据往往杂乱无章。电力负荷数据集通常包含温度记录中的℃符号、天气描述中的斜杠分隔符以及各种需要标准化的文本字段。让我们看看如何处理这些常见问题。温度字段的清洗是第一个挑战。原始数据中的温度可能显示为22℃这样的格式我们需要提取数字部分# 温度清洗示例 df[最高温度] df[最高温度].str.replace(℃, ).astype(float) df[最低温度] df[最低温度].str.replace(℃, ).astype(float)天气状况的处理更为复杂。一个字段可能包含多云/小雨这样的组合我们需要将其拆分为白天和夜晚的天气# 天气拆分示例 weather_split df[天气状况].str.split(/, expandTrue) df[白天天气] weather_split[0] df[夜晚天气] weather_split[1]风向和风力数据也需要标准化。我们可以创建一个映射字典将文本描述转换为数值wind_mapping { 无持续风向3级: 0, 北风34级: 1, 北风45级: 2 } df[白天风力] df[白天风力风向].map(wind_mapping) df[夜晚风力] df[夜晚风力风向].map(wind_mapping)2. 特征工程从原始数据到预测因子好的特征工程能显著提升模型性能。对于时间序列预测我们可以从多个角度构造特征。2.1 时间特征提取时间本身包含丰富的信息。我们可以从时间戳中提取多种特征df[时间戳] pd.to_datetime(df[时间戳]) df[月份] df[时间戳].dt.month df[星期] df[时间戳].dt.dayofweek df[是否周末] df[星期].isin([5, 6]).astype(int) df[小时] df[时间戳].dt.hour2.2 天气特征编码天气状况是分类变量需要转换为模型可理解的格式。有序编码比独热编码更适合这种情况weather_rank { 晴: 1, 多云: 2, 阴: 3, 小雨: 4, 中雨: 5, 大雨: 6 } df[白天天气编码] df[白天天气].map(weather_rank) df[夜晚天气编码] df[夜晚天气].map(weather_rank)2.3 滞后特征和滑动统计时间序列预测常用滞后特征和滑动窗口统计df[负荷_lag_24h] df[负荷].shift(96) # 15分钟间隔24小时96个点 df[负荷_rolling_7d_mean] df[负荷].rolling(window672).mean() # 7天滑动平均3. LightGBM建模从数据到预测准备好特征后我们可以开始构建预测模型。LightGBM因其高效和准确成为时间序列预测的热门选择。3.1 数据准备首先需要划分训练集和验证集。对于时间序列不能随机划分必须按时间顺序split_point int(len(df) * 0.8) train df.iloc[:split_point] valid df.iloc[split_point:] features [月份, 星期, 小时, 最高温度, 最低温度, 白天天气编码, 夜晚天气编码, 负荷_lag_24h] target 负荷 X_train, y_train train[features], train[target] X_valid, y_valid valid[features], valid[target]3.2 模型训练配置LightGBM参数并训练模型import lightgbm as lgb params { objective: regression, metric: mae, learning_rate: 0.05, num_leaves: 31, max_depth: -1, min_child_samples: 20, feature_fraction: 0.8, bagging_freq: 1, verbosity: -1 } train_set lgb.Dataset(X_train, labely_train) valid_set lgb.Dataset(X_valid, labely_valid) model lgb.train( params, train_set, num_boost_round1000, valid_sets[valid_set], early_stopping_rounds50, verbose_eval100 )3.3 特征重要性分析训练完成后查看哪些特征对预测最重要lgb.plot_importance(model, height0.5, figsize(8, 6))通常会发现时间相关特征小时、星期和温度特征非常重要而天气状况的影响可能较小。4. 模型评估与优化建立基线模型后我们需要评估其性能并寻找改进空间。4.1 评估指标时间序列预测常用多种评估指标from sklearn.metrics import mean_absolute_error, mean_squared_error predictions model.predict(X_valid) mae mean_absolute_error(y_valid, predictions) rmse mean_squared_error(y_valid, predictions, squaredFalse) print(fMAE: {mae:.2f}, RMSE: {rmse:.2f})4.2 误差分析绘制预测值与实际值的对比图能直观显示模型表现import matplotlib.pyplot as plt plt.figure(figsize(12, 6)) plt.plot(y_valid.values[:200], label实际值) plt.plot(predictions[:200], label预测值) plt.legend() plt.show()观察误差集中在哪些时间段可能揭示模型特定弱点如对极端值的预测能力不足。4.3 模型优化方向根据评估结果可能的优化方向包括尝试不同的时间窗口大小计算滑动统计量添加节假日特征引入外部数据如经济指标调整模型超参数尝试模型集成方法5. 生产环境部署考虑当模型表现满意后我们需要考虑如何将其部署到生产环境。5.1 预测流水线设计完整的预测流程应包括数据获取和清洗特征工程模型预测结果存储可以将这个过程封装为Python类class LoadForecaster: def __init__(self, model_path): self.model lgb.Booster(model_filemodel_path) self.features [...] # 定义所需特征 def preprocess(self, raw_data): # 实现数据清洗和特征工程 ... return processed_features def predict(self, raw_data): features self.preprocess(raw_data) return self.model.predict(features)5.2 持续监控部署后需要持续监控模型性能记录每次预测的输入和输出定期计算预测误差设置性能下降警报计划模型重新训练频率6. 常见问题与解决方案在实际项目中你可能会遇到以下典型问题数据缺失问题温度记录缺失使用前后时间点的平均值或插值天气数据缺失考虑使用气象站API补充预测滞后问题添加更多滞后特征尝试seq2seq等序列模型极端值预测不准在损失函数中增加极端值的权重单独建模预测极端事件计算效率问题减少不重要的特征使用LightGBM的GPU加速优化特征计算流程电力负荷预测是一个不断迭代的过程。从基线模型开始通过分析误差模式、尝试新特征和调整模型架构你可以逐步提升预测精度。记住没有完美的模型只有适合特定业务需求的解决方案。