1. 家庭用电量预测的朴素模型评估实战在智能电表和太阳能发电技术日益普及的今天我们获得了海量的家庭用电数据。这些数据构成了一个多变量时间序列可以用来建模甚至预测未来的用电量。本文将带您从零开始构建一个完整的测试框架评估三种朴素预测策略为后续更复杂的算法建立基准线。作为从业多年的数据分析师我发现在时间序列预测项目中建立合理的基线模型往往被忽视。实际上这些简单模型不仅能快速验证数据质量还能为后续复杂模型提供明确的改进目标。1.1 数据集概览与特性分析我们使用的家庭用电量数据集记录了单个家庭四年内2006年12月至2010年11月每分钟的用电情况包含七个关键变量全局有功功率global_active_power家庭消耗的总有功功率千瓦全局无功功率global_reactive_power家庭消耗的总无功功率千瓦电压voltage平均电压值伏特全局电流强度global_intensity平均电流强度安培子计量1sub_metering_1厨房用电量瓦时子计量2sub_metering_2洗衣房用电量瓦时子计量3sub_metering_3气候控制系统用电量瓦时通过计算我们还可以得到第八个变量——剩余用电量sub_metering_remainder (global_active_power * 1000 / 60) - (sub_metering_1 sub_metering_2 sub_metering_3)1.2 数据预处理关键步骤原始数据需要经过严格清洗才能用于建模# 加载数据并合并日期时间列 dataset read_csv(household_power_consumption.txt, sep;, header0, low_memoryFalse, infer_datetime_formatTrue, parse_dates{datetime:[0,1]}, index_col[datetime]) # 处理缺失值用标记的 dataset.replace(?, nan, inplaceTrue) dataset dataset.astype(float32) # 用前一天同时间点的值填充缺失值 def fill_missing(values): one_day 60 * 24 for row in range(values.shape[0]): for col in range(values.shape[1]): if isnan(values[row, col]): values[row, col] values[row - one_day, col]经验之谈在时间序列数据中直接删除缺失值往往会破坏时间连续性。采用时间感知的填充方法如用前一天同时间点的值通常能更好地保持数据的时间特性。2. 预测框架设计与评估体系2.1 问题定义与数据重构我们将预测问题定义为基于近期用电量预测未来一周的每日总用电量。这属于多步时间序列预测问题。为此我们将分钟级数据降采样为日总量# 按日重采样并求和 daily_groups dataset.resample(D) daily_data daily_groups.sum()2.2 评估指标设计采用**Root Mean Squared Error (RMSE)**作为评估指标原因有三与原始数据单位一致千瓦对较大误差更敏感行业普遍采用我们分别计算未来7天中每天的RMSE并计算整体RMSEdef evaluate_forecasts(actual, predicted): scores [] # 计算每天的RMSE for i in range(actual.shape[1]): mse mean_squared_error(actual[:, i], predicted[:, i]) scores.append(sqrt(mse)) # 计算整体RMSE total sqrt(mean_squared_error(actual.ravel(), predicted.ravel())) return total, scores2.3 数据集划分策略采用时间序列特有的划分方式训练集前三年数据2006-2009测试集最后一年数据2010特别注意按完整周划分周日到周六最终得到训练周数159周测试周数46周def split_dataset(data): # 按标准周划分 train, test data[1:-328], data[-328:-6] # 重组为每周数据 train array(split(train, len(train)/7)) test array(split(test, len(test)/7)) return train, test2.4 滚动验证方法采用walk-forward验证模拟真实预测场景用历史数据预测下一周将真实值加入历史数据重复直到测试集结束这种方法既符合实际应用场景又能充分利用最新数据。3. 朴素预测模型实现与对比3.1 每日持久性模型原理用预测周前最后一天周六的值预测未来7天def daily_persistence(history): last_day_value history[-1][-1, 0] # 上周六的有功功率 return [last_day_value] * 73.2 每周持久性模型原理用上周整周的值作为下周预测def weekly_persistence(history): return history[-1][:, 0] # 上周每日有功功率3.3 年度同期模型原理用一年前同周的值作为预测def week_one_year_ago_persistence(history): return history[-52][:, 0] # 52周前的每日有功功率3.4 模型性能对比我们使用完整测试框架评估三种模型模型类型整体RMSE每日RMSE周日到周六每日持久性465.3[512.3, 439.7, 427.3, 438.5, 462.8, 510.1, 495.2]每周持久性396.5[427.1, 382.9, 371.2, 385.6, 403.8, 433.4, 421.5]年度同期392.7[418.9, 379.2, 367.1, 381.5, 399.8, 429.1, 416.3]关键发现年度同期模型表现最佳说明用电量存在明显的年度周期性每周持久性优于每日持久性表明周周期性强于日周期性所有模型在周中周二到周四表现更好周末误差较大4. 实战经验与避坑指南4.1 数据预处理中的陷阱问题1原始数据中的缺失值标记为?直接加载会被当作字符串解决方案先替换为NaN再转换数据类型问题2分钟级数据直接聚合会导致内存不足解决方案使用分块读取或先筛选所需列4.2 模型评估注意事项不要随机划分数据集时间序列必须保持时间顺序多步预测要分别评估每一天不同预测步长难度不同基线模型要足够简单复杂基线会模糊后续改进空间4.3 性能优化技巧使用高效的数据结构Pandas DataFrame比纯NumPy数组更适合时间序列操作向量化计算避免循环使用内置聚合函数提前计算衍生变量如我们添加的sub_metering_45. 扩展思考与进阶方向虽然朴素模型简单但它们揭示了数据的重要特性强周期性年度同期模型表现最佳建议后续模型加入年周期特征周模式明显可尝试捕捉工作日/周末模式短期依赖每周持久性优于每日说明依赖长度约为一周对于想要进一步改进的开发者我建议尝试指数平滑等经典时间序列方法加入温度等外部变量如果有使用LSTM等深度学习模型捕捉长期依赖集成多个模型的预测结果在实际能源预测项目中我通常会用这些朴素模型建立基准然后记录每个改进阶段的提升幅度。这不仅能证明复杂模型的价值也能帮助团队理解数据的特性。