每年毕业季都能看到一类非常典型的机器学习选题——各种“预测模型的设计与实现”。说实话,这类题目框架固定、套路成熟,但也最容易踩坑:要么死磕算法原理导致进度失控,要么代码全抄导致答辩一问三不知,要么忽略工程细节导致模型精度看似很高、实际换个时间段一测就崩。今天以“家庭用电预测模型的设计”为例,完整复盘一个基于sklearn+DNN、用Flask做Web展示的毕设项目应该怎么搭、怎么避坑、怎么在答辩时讲清楚。这个项目涵盖了时序数据处理、机器学习建模、深度学习网络设计和Web部署全链路,适合正在做大数据或深度学习方向毕设的同学参考。
我会尽量把每个环节做决策的理由讲透,而不是只贴代码。毕竟毕设答辩时老师最常问的就是“为什么选这个模型”“为什么做这个参数”“这个特征是怎么来的”。
1. 为什么选家庭用电预测这个方向
家庭用电预测在毕设选题里属于典型的“稳妥且有发挥空间”的方向。它的数据来源清晰、业务场景易懂、模型可复杂度可调节。往浅了做,可以用线性回归;往深了做,可以用LSTM或者Transformer。无论自身基础如何,都能做出一个完整且合理的项目。
1.1 电力负荷预测的本质是时间序列问题
家庭用电记录本质上是一串按时间排序的数值序列,预测的核心任务是“利用过去一段时间的历史负荷值,推算未来某个时刻或某个时间段的负荷值”。
你可能觉得这不就是一个回归问题吗?用sklearn里的随机森林、XGBoost一跑不就行了?确实可以。但严格来说它比普通回归多了一层约束——时间上的依赖关系。今天上午10点的用电量通常接近昨天上午10点的用电量,而不是接近今天凌晨3点的用电量。这意味着如果只是把所有样本随机打乱再训练,等于主动丢掉了最重要的时间顺序信息。这也是很多同学在做毕设时容易犯的错误。
1.2 题目技术栈组合的合理性
这个题目的关键词是sklearn、DNN和Flask,这个组合在毕设里很讨巧:
- sklearn负责做传统的机器学习基线模型,比如决策树、随机森林、梯度提升树、线性回归,保证项目“有对比”;
- DNN(深度神经网络)负责做深度学习模型,体现“大数据深度学习算法”这个方向;
- Flask负责把训练好的模型封装成Web服务,做一个小型的前端展示页面,体现“完整系统交付”能力。
从这个角度说,技术栈不是随便选的。sklearn刻画的是传统机器学习能力,DNN刻画的是深度学习能力,Flask刻画的是工程化能力。答辩时老师问“你觉得这个项目最大的亮点是什么”,你可以直接说:模型不是孤立存在的,它从数据处理到训练评估再到界面展示,形成了一条完整链路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据准备:家庭用电数据从哪里来
做预测模型项目,数据是第一关。很多同学卡在这一步是因为根本找不到合适的公开数据集。这里推荐两类比较常用的数据来源。
2.1 常用数据集与字段结构
第一个是个人家庭用电数据集。比如UCI机器学习库中的“Individual Household Electric Power Consumption”数据集,包含2006年到2010年间某家庭每分钟的电力消耗记录,字段包括有功功率、无功功率、电压、电流以及厨房、洗衣房、空调等不同区域的子计量值,大约207万个记录。
第二个是建筑能耗数据集。这类数据在一些论文复现项目里很常见,通常按1分钟或1小时粒度记录整栋建筑的总用电量,附带温湿度、节假日等外部变量。
我个人建议新手选择字段相对简洁的数据集,重点关注两列:时间戳和用电量。先跑通全流程,再考虑要不要加入温度、湿度、节假日等外部特征来提升精度。
2.2 数据清洗与漏斗式异常过滤
拿到原始数据后最忌直接扔给模型。这类电器计量数据常见的问题有三类:
- 缺失值:时间戳有空缺,对应用电量为空。处理方式是按前向填充或者用前后均值补齐;
- 异常值:某时刻用电量突然飙到几千瓦,往往是电表抖动或瞬时大功率设备启动。这里需要设定合理的物理上下限;
- 重复值:同一时间戳出现多条记录,需要按时间戳去重。
建议做一个异常值统计表,清洗掉多少条、为何清洗,写清楚,这个在论文里也是加分项。比如下表是某个实际项目里的清洗记录:
| 清洗步骤 | 处理逻辑 | 预期记录变化 |
|---|---|---|
| 缺失时间戳检查 | 时间列升序后查重、查空隙 | 通常缺失率低于0.5% |
| 用电量小于0 | 负值删除或置0 | 极少数异常 |
| 用电量大于阈值 | 超过15kW的记录剔除 | 0.1%以内 |
| 节假日标记 | 新增是否为周末/节假日的布尔特征 | 不删数据 |
2.3 重采样:从分钟到小时的维度选择
原始的分钟级采样数据不一定直接适合建模。如果你的输入维度是“前24小时预测未来24小时”,那用小时级数据就够了,没必要用分钟级——分钟级会让序列长度变成1440,特征维度爆炸且训练极慢。
重采样一般用resample或pandas.DataFrame.groupby配合聚合函数实现:
python复制import pandas as pd
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)
# 从分钟级聚合到小时级,取平均功率
hourly = df['power'].resample('1h').mean().reset_index()
重采样有几个细节值得注意:如果是预测用电量(千瓦时),应该用sum()。如果数据里包含“这一小时内多项记录的平均功率”,用mean()更合理。这个细节别看它小,选择错误会导致最终误差偏大。答辩的时候老师专门问过我这个细节,我是实际对比过才知道的。
2.4 构造监督学习样本:滑动窗口与滞后特征
处理完时序数据之后,不能直接喂给机器学习模型。模型并不知道“上一时刻”是什么意思,需要把序列数据转换成“特征X -> 标签y”的监督学习格式。这个转换通常采用滑动窗口。
假设用过去24小时的负荷值预测未来1小时的负荷值,那么每个样本的X是一个长度为24的向量,y是下个小时的用电量。实现方式可以用循环
