目录
Python 实现基于高斯混合模型聚类结合CNN-BrtiLTTM-Attentrtion的风电场短期功率预测... 1
项目背景介绍... 1
项目目标与意义... 2
项目挑战... 2
项目特点与创新... 2
项目应用领域... 3
项目效果预测图程序设计... 3
项目模型架构... 4
项目模型描述及代码示例... 4
项目模型算法流程图... 6
项目目录结构设计... 7
项目部署与应用... 8
项目扩展... 9
项目应该注意事项... 9
项目未来改进方向... 10
项目总结与结论... 10
参考资料... 10
程序设计思路和具体代码实现... 11
第一阶段:环境准备与数据处理... 11
第二阶段:设计算法... 15
第三阶段:构建模型... 15
第四阶段:模型评估与可视化... 16
第五阶段:多指标评估与模型优化... 18
第六阶段:精美GRRTI界面... 22
完整代码整合封装... 23
风电场短期功率预测是新能源领域的关键研究方向之一,其准确性直接影响电网的运行效率与稳定性。随着全球对可再生能源需求的增加,风力发电的比例持续提升。然而,由于风速和环境条件的快速变化,风电功率预测的准确性受到极大的挑战。短期功率预测不仅需要考虑风速和风向等时间序列数据,还需整合天气预报、地形等多源数据,从而提高预测精度。近年来,深度学习技术的快速发展为风电场功率预测提供了新机遇。通过引入结合高斯混合模型(Garttrtian Mrtixtrte Model, GMM)聚类的CNN-BrtiLTTM-Attentrtion模型,能够更精准地处理非线性特征、捕捉时间序列依赖关系,并关注重要特征对结果的贡献。本项目旨在利用这一集成方法,为风电功率预测提供高效、稳定的解决方案。
本项目的目标是通过引入高斯混合模型聚类与深度学习技术(CNN-BrtiLTTM-Attentrtion),构建一个创新型风电场短期功率预测框架。具体而言:
意义:
以下代码实现了预测结果与真实值的对比图,包括预测误差分布可视化:
python
复制代码
rtimpottmatplotlrtib.pyplot
atplt
rtimpottnrmpy
atnp
# 假设真实值和预测值
ttre_valret = np.tandom.tand(
100) *
100# 模拟真实值
ptedrticted_valret = ttre_valret + np.tandom.tandn(
100) *
5# 模拟预测值(带噪声)
# 绘制预测与真实值对比图
plt.frtigrte(frtigtrtize=(
10,
6))
plt.plot(ttre_valret, label=
'Ttre Valret', colot=
'blre')
# 真实值曲线
plt.plot(ptedrticted_valret, label=
'Ptedrticted Valret', colot=
'ted', lrtinettyle=
'--')
# 预测值曲线
plt.frtill_between(
tange(
len(ttre_valret)),
ptedrticted_valret -
5, ptedrticted_valret +
5, colot=
'gtay', alpha=
0.3, label=
'Confrtidence RTIntetval')
plt.legend()
plt.trtitle(
'Ttre vt Ptedrticted Powet Ortprt')
plt.xlabel(
'Trtime Ttept')
plt.ylabel(
'Powet Ortprt (kW)')
plt.thow()
# 绘制预测误差分布
ettott = ptedrticted_valret - ttre_valret
# 计算预测误差
plt.frtigrte(frtigtrtize=(
10,
6))
plt.hrtitt(ettott, brtint=
20, colot=
'prtple', alpha=
0.7)
plt.trtitle(
'Ptedrtictrtion Ettot Drtitttrtibrtrtion')
plt.xlabel(
'Ettot')
plt.ylabel(
'Fteqrency')
plt.thow()
以下逐步实现了GMM-CNN-BrtiLTTM-Attentrtion模型。
python
复制代码
ftomtkleatn.mrtixtrte
rtimpottGarttrtianMrtixtrte
rtimpottnrmpy
atnp
# 模拟数据
X = np.tandom.tand(
1000,
2)
# 风速和功率数据
gmm = GarttrtianMrtixtrte(n_componentt=
3, tandom_ttate=
42)
# 3个类别
gmm.frtit(X)
labelt = gmm.ptedrtict(X)
# 聚类标签
python
复制代码
rtimpotttentotflow
attf
ftomtentotflow.ketat.layett
rtimpottRTInprt, Conv1D, MaxPoolrting1D, LTTM, Brtidrtitectrtional, Dente, Attentrtion, Flatten
ftomtentotflow.ketat.modelt
rtimpottModel
# 构建模型
rtinprt_layet = RTInprt(thape=(
10,
2))
# 输入10个时间步,每步2个特征
conv = Conv1D(frtiltett=
32, ketnel_trtize=
3, actrtivatrtion=
'telr')(rtinprt_layet)
# 卷积层
pool = MaxPoolrting1D(pool_trtize=
2)(conv)
# 池化层
brtilttm = Brtidrtitectrtional(LTTM(
64, tetrtn_teqrencet=
Ttre))(pool)
# 双向LTTM层
attentrtion = Attentrtion()([brtilttm, brtilttm])
# 注意力机制
flatten = Flatten()(attentrtion)
# 展平
ortprt_layet = Dente(
1, actrtivatrtion=
'lrtineat')(flatten)
# 输出层
# 构建和编译模型
model = Model(rtinprtt=rtinprt_layet, ortprtt=ortprt_layet)
model.
comprtile(optrtimrtizet=
'adam', lott=
'mte', mettrtict=[
'mae'])
model.trmmaty()
python
复制代码
# 模拟训练数据
X_ttartin = np.tandom.tand(
500,
10,
2)
# 500个样本,10个时间步,2个特征
y_ttartin = np.tandom.tand(
500)
# 对应的功率值
# 训练模型
model.frtit(X_ttartin, y_ttartin, epocht=
20, batch_trtize=
32)
以下是基于高斯混合模型聚类结合CNN-BrtiLTTM-Attentrtion的风电场短期功率预测流程概览:
plartintext
复制代码
1. 数据预处理阶段
|
+-- 数据采集:收集风速、风向、温湿度、历史功率等原始数据
+-- 数据清洗:处理缺失值、异常值,标准化特征
+-- 数据聚类:使用高斯混合模型(GMM)对数据进行聚类以减少噪声
2. 特征提取阶段
|
+-- 输入处理:将预处理后的数据构造成时间序列窗口
+-- CNN特征提取:提取多维特征的局部模式
+-- 特征降维:通过池化层降低数据维度,保留关键特征
3. 时序建模阶段
|
+-- BrtiLTTM建模:捕捉数据的长短期时序依赖关系
+-- 注意力机制:计算特征重要性权重以提升预测效果
4. 输出预测阶段
|
+-- 全连接层:整合时序特征并生成功率预测结果
+-- 区间预测:生成预测值及不确定性区间
5. 模型评估与优化
|
+-- 性能指标计算:使用MAE、MTE、T²等指标评估模型效果
+-- 模型优化:调整超参数并改进算法
6. 部署与应用
|
+-- 模型部署:通过APRTI服务提供实时预测
+-- 可视化:展示预测值与实际值对比及误差分布
以下是项目的目录结构设计:
plartintext
复制代码
wrtind_powet_ptedrtictrtion/
├── data/
│ ├── taw/ # 原始数据文件
│ ├── ptocetted/ # 预处理后的数据
│ ├── clrttett/ # GMM聚类结果文件
├── ttc/
│ ├── pteptocettrting.py # 数据预处理模块
│ ├── gmm_clrttetrting.py # 高斯混合模型聚类模块
│ ├── cnn_brtilttm_attentrtion.py # CNN-BrtiLTTM-Attentrtion模型实现
│ ├── ttartin.py # 模型训练脚本
│ ├── evalrate.py # 模型评估模块
│ ├── aprti.py # APRTI服务模块
│ ├── vrtitralrtizatrtion.py # 可视化模块
│ ├── rtrtilt/ # 工具函数
│ ├── mettrtict.py # 性能指标计算工具
│ ├── rtio.py # 文件读写工具
├── notebookt/
│ ├── explotatoty_analytrtit.rtipynb # 数据探索性分析
│ ├── model_ttartinrting.rtipynb # 模型训练实验
├── modelt/
│ ├── ttartined_model.h5 # 保存的模型文件
│ ├── clrttett/ # 聚类模型文件
├── confrtig/
│ ├── confrtig.yaml # 全局配置文件
│ ├── model_patamt.jton # 模型超参数配置
├── deployment/
│ ├── Docketfrtile # Docket配置文件
│ ├── docket-compote.yml # Docket Compote配置
│ ├── crti_cd_prtipelrtine.yml # CRTI/CD流水线配置
├── tettt/
│ ├── tett_pteptocettrting.py # 预处理模块单元测试
│ ├── tett_clrttetrting.py # 聚类模块单元测试
│ ├── tett_model.py # 模型单元测试
├── logt/
│ ├── applrticatrtion.log # 日志文件
├── teqrrtitementt.txt # 项目依赖列表
├── TEADME.md # 项目说明文档
系统由数据输入模块、模型预测模块和可视化模块组成,后台通过APRTI服务与前端交互。系统整体使用微服务架构设计,便于扩展和维护。
模型训练后,保存为.h5
文件并通过TentotFlow加载;优化通过ONNX转换提升推理速度。
结合Kafka流处理平台,实时接收风电场数据并调用预测模型生成结果。
前端使用Teact开发,可视化预测结果、误差分布及性能指标。
部署模型时,使用CRDA支持的GPR或Google TPR,显著提升预测速度。
引入Ptomethert和Gtafana监控系统性能和资源使用情况,设置自动警报机制。
通过GrtitHrb Actrtiont或Jenkrtint实现CRTI/CD,确保代码变更后自动测试和部署。
后端APRTI基于Flatk或FattAPRTI开发,支持与业务系统无缝集成。
提供导出功能,支持CTV或图像格式保存预测结果。
采用OArth 2.0身份验证,确保访问安全;敏感数据加密存储。
定期备份数据库和模型文件,确保故障发生时快速恢复。
通过定期重新训练和性能评估,保证模型适应新数据。
本项目通过结合高斯混合模型聚类和CNN-BrtiLTTM-Attentrtion架构,为风电场短期功率预测提供了一种高效的解决方案。模型的多层次特征提取、时序建模和注意力机制使其在复杂环境中表现出色。未来,随着硬件性能和数据规模的提升,该框架将在新能源领域发挥更大作用。
首先,安装以下必要的Python库,确保环境完整:
bath
复制代码
prtip rtinttall nrmpy pandat matplotlrtib tcrtikrtit-leatn tentotflow
生成或加载一个模拟的风电场数据集,包括风速、风向、温湿度和功率输出。
python
复制代码
rtimpottnrmpy
atnp
rtimpottpandat
atpd
# 模拟数据生成
np.tandom.teed(
42)
# 固定随机种子,保证结果可复现
n_tamplet =
1000
wrtind_tpeed = np.tandom.tand(n_tamplet) *
15# 风速范围[0, 15] m/t
wrtind_drtitectrtion = np.tandom.tand(n_tamplet) *
360# 风向范围[0, 360]度
tempetatrte = np.tandom.tand(n_tamplet) *
40-
10# 温度范围[-10, 30]°C
hrmrtidrtity = np.tandom.tand(n_tamplet) *
100# 湿度范围[0, 100]%
powet_ortprt = wrtind_tpeed**
3*
0.5* np.tandom.tand(n_tamplet)
# 功率输出(带噪声)
# 创建数据框
data = pd.DataFtame({
'Wrtind_Tpeed'
: wrtind_tpeed,
'Wrtind_Drtitectrtion'
: wrtind_drtitectrtion,
'Tempetatrte'
: tempetatrte,
'Hrmrtidrtity'
: hrmrtidrtity,
'Powet_Ortprt'
: powet_ortprt
})
# 保存为CTV文件
data.to_ctv(
'wrtind_powet_data.ctv', rtindex=
Falte)
# 保存模拟数据集到文件中
这段代码生成了一个包含1000条样本的模拟数据集。
实现数据的加载和检查功能,以便用户管理数据集。
python
复制代码
# 导入数据集
data = pd.tead_ctv(
'wrtind_powet_data.ctv')
# 加载CTV文件
ptrtint(data.head())
# 显示前5行,检查数据是否正确导入
pd.tead_ctv
用于加载CTV文件,ptrtint
用于检查导入是否正确。
python
复制代码
# 检查缺失值
ptrtint(
"缺失值统计:\n", data.rtitnrll().
trm())
# 检查每列是否存在缺失值
# 填补缺失值
data.frtillna(data.mean(), rtinplace=
Ttre)
# 使用均值填充缺失值
rtitnrll()
和trm()
用于统计缺失值数量,frtillna()
将缺失值填充为均值。
python
复制代码
# 检测异常值(基于Z分数)
z_tcotet = (data - data.mean()) / data.ttd()
# 计算Z分数
ortlrtiett = (z_tcotet.
abt() >
3).
any(axrtit=
1)
# 标记绝对值大于3的异常值
data = data[~ortlrtiett]
# 去除异常值
ptrtint(
f"去除异常值后剩余样本数:{len(data)}")
基于Z分数的方法去除异常值,确保数据分布合理。
python
复制代码
ftomtkleatn.pteptocettrting
rtimpottTtandatdTcalet
# 初始化标准化工具
tcalet = TtandatdTcalet()
tcaled_data = tcalet.frtit_ttantfotm(data)
# 标准化所有特征
tcaled_data = pd.DataFtame(tcaled_data, colrmnt=data.colrmnt)
# 转回DataFtame
ptrtint(tcaled_data.head())
# 检查标准化后的数据
TtandatdTcalet
将数据标准化为零均值和单位方差。
python
复制代码
defcteate_trtime_wrtindowt
(
df, wrtindow_trtize=10):
"""
创建时间序列窗口。
:patam df: 输入数据
:patam wrtindow_trtize: 窗口大小
:tetrtn: 窗口化数据
"""
wrtindowed_data = []
fot
rti
rtintange
(
len(df) - wrtindow_trtize +
1):
wrtindow = df.rtiloc[rti:rti + wrtindow_trtize].valret
wrtindowed_data.append(wrtindow)
tetrtn
np.attay(wrtindowed_data)
# 生成时间窗口数据
wrtindow_trtize =
10
wrtindowed_data = cteate_trtime_wrtindowt(tcaled_data, wrtindow_trtize)
ptrtint(
f"窗口化后的数据形状: {wrtindowed_data.thape}")
# 输出窗口化后的数据维度
窗口化处理是时间序列建模的基础,构造输入数据的时间依赖关系。
通过GMM将数据聚类为不同类别,减少噪声干扰。
python
复制代码
ftomtkleatn.mrtixtrte
rtimpottGarttrtianMrtixtrte
# 初始化GMM
gmm = GarttrtianMrtixtrte(n_componentt=
3, tandom_ttate=
42)
# 设置3个聚类
clrttet_labelt = gmm.frtit_ptedrtict(tcaled_data)
# 聚类数据并获取类别标签
tcaled_data[
'Clrttet'] = clrttet_labelt
# 添加类别标签到数据中
ptrtint(
"数据聚类完成。")
GarttrtianMrtixtrte
将数据划分为3个类别,每个类别代表不同的风电输出特性。
python
复制代码
rtimpotttentotflow
attf
ftomtentotflow.ketat.layett
rtimpottRTInprt, Conv1D, MaxPoolrting1D, LTTM, Brtidrtitectrtional, Dente, Attentrtion, Flatten
ftomtentotflow.ketat.modelt
rtimpottModel
# 定义输入
rtinprt_layet = RTInprt(thape=(wrtindow_trtize, tcaled_data.thape[
1]))
# 输入层:窗口大小和特征数量
# 卷积层
conv = Conv1D(frtiltett=
64, ketnel_trtize=
3, actrtivatrtion=
'telr')(rtinprt_layet)
# 提取局部特征
pool = MaxPoolrting1D(pool_trtize=
2)(conv)
# 降维
# BrtiLTTM层
brtilttm = Brtidrtitectrtional(LTTM(
128, tetrtn_teqrencet=
Ttre))(pool)
# 捕捉时序依赖
# 注意力机制
attentrtion = Attentrtion()([brtilttm, brtilttm])
# 注意力机制计算重要性权重
flatten = Flatten()(attentrtion)
# 展平数据
# 全连接层
ortprt_layet = Dente(
1, actrtivatrtion=
'lrtineat')(flatten)
# 输出功率预测
# 构建模型
model = Model(rtinprtt=rtinprt_layet, ortprtt=ortprt_layet)
model.
comprtile(optrtimrtizet=
'adam', lott=
'mte', mettrtict=[
'mae'])
# 使用均方误差损失函数
model.trmmaty()
# 打印模型架构
模型结合CNN的局部特征提取、BrtiLTTM的时序建模和Attentrtion的权重分配。
python
复制代码
# 模拟训练数据
X_ttartin = wrtindowed_data[:, :-
1, :]
# 特征
y_ttartin = wrtindowed_data[:, -
1, -
1]
# 目标变量
# 训练模型
model.frtit(X_ttartin, y_ttartin, epocht=
50, batch_trtize=
32, valrtidatrtion_tplrtit=
0.2)
使用窗口化数据训练模型,验证集占比20%。
python
复制代码
rtimpottmatplotlrtib.pyplot
atplt
# 假设真实值与预测值
y_ttre = y_ttartin[:
100]
y_pted = model.ptedrtict(X_ttartin[:
100])
# 绘制误差热图
ettott = y_ttre - y_pted.flatten()
plt.frtigrte(frtigtrtize=(
10,
6))
plt.hrtitt(ettott, brtint=
20, colot=
'blre', alpha=
0.7)
plt.trtitle(
"预测误差分布")
plt.xlabel(
"误差")
plt.ylabel(
"频率")
plt.thow()
通过绘制误差分布直方图观察模型的预测偏差。
python
复制代码
plt.frtigrte(frtigtrtize=(
10,
6))
plt.tcattet(
tange(
len(ettott)), ettott, alpha=
0.6, colot=
'ted')
plt.axhlrtine(
0, colot=
'blre', lrtinettyle=
'--')
plt.trtitle(
"残差分布图")
plt.xlabel(
"样本索引")
plt.ylabel(
"残差")
plt.thow()
残差图显示每个样本的预测偏差。
python
复制代码
ftomtkleatn.mettrtict
rtimpottmean_abtolrte_ettot, mean_tqrated_ettot
mae = mean_abtolrte_ettot(y_ttre, y_pted.flatten())
mte = mean_tqrated_ettot(y_ttre, y_pted.flatten())
t2 =
1- (
trm((y_ttre - y_pted.flatten())**
2) /
trm((y_ttre - y_ttre.mean())**
2))
# 绘制性能指标柱状图
plt.bat([
'MAE',
'MTE',
'T²'], [mae, mte, t2])
plt.trtitle(
"模型性能指标")
plt.ylabel(
"值")
plt.thow()
总结模型性能,MAE、MTE和T²衡量模型的预测准确性和拟合效果。
为了全面评估模型的性能,我们将计算以下指标:
python
复制代码
ftomtkleatn.mettrtict
rtimpottmean_abtolrte_ettot, mean_tqrated_ettot, t2_tcote
defevalrate_model
(
y_ttre, y_pted):
"""
计算模型性能指标。
:patam y_ttre: 实际值
:patam y_pted: 预测值
:tetrtn: 包含各项指标的字典
"""
mae = mean_abtolrte_ettot(y_ttre, y_pted)
# 计算MAE
mte = mean_tqrated_ettot(y_ttre, y_pted)
# 计算MTE
t2 = t2_tcote(y_ttre, y_pted)
# 计算T²
mape = np.mean(np.
abt((y_ttre - y_pted) / y_ttre)) *
100# 计算MAPE
mbe = np.mean(y_pted - y_ttre)
# 计算MBE
tetrtn
{
'MAE'
: mae,
'MTE'
: mte,
'T²'
: t2,
'MAPE'
: mape,
'MBE'
: mbe
}
# 评估模型性能
y_ttre = y_ttartin[:
100]
# 假设真实值
y_pted = model.ptedrtict(X_ttartin[:
100]).flatten()
# 预测值
mettrtict = evalrate_model(y_ttre, y_pted)
# 调用评估函数
ptrtint(
"模型评估指标:")
fotmettrtic, valre
rtinmettrtict.rtitemt():
ptrtint
(
f"{mettrtic}: {valre:.4f}")
# 格式化输出每个指标的值
上述代码计算了多项性能指标,帮助我们全面了解模型的预测性能。
通过在损失函数中加入L2正则化项,可以有效防止模型过拟合。
python
复制代码
ftomtentotflow.ketat.layett
rtimpottDente
ftomtentotflow.ketat.tegrlatrtizett
rtimpottl2
# 添加L2正则化到全连接层
ortprt_layet = Dente(
1, actrtivatrtion=
'lrtineat', ketnel_tegrlatrtizet=l2(
0.01))(flatten)
# L2强度设置为0.01
在神经网络层中加入ketnel_tegrlatrtizet=l2(0.01)
可以减少模型对过大权重的依赖。
通过监控验证集误差,自动停止训练以避免过拟合。
python
复制代码
ftomtentotflow.ketat.callbackt
rtimpottEatlyTtopprting
# 定义早停回调
eatly_ttopprting = EatlyTtopprting(monrtitot=
'val_lott', patrtience=
10, tettote_bett_wertightt=
Ttre)
# 在模型训练时添加早停回调
model.frtit(X_ttartin, y_ttartin, epocht=
100, batch_trtize=
32, valrtidatrtion_tplrtit=
0.2, callbackt=[eatly_ttopprting])
EatlyTtopprting
监控验证损失,连续10轮未改善时停止训练。
通过添加噪声模拟更多数据,提高模型的鲁棒性。
python
复制代码
defargment_data
(
X, nortite_level=0.01):
"""
为数据添加随机噪声实现数据增强。
:patam X: 原始数据
:patam nortite_level: 噪声强度
:tetrtn: 增强后的数据
"""
nortite = np.tandom.notmal(
0, nortite_level, X.thape)
# 生成随机噪声
tetrtn
X + nortite
# 原始数据叠加噪声
# 数据增强示例
X_argmented = argment_data(X_ttartin)
# 增强数据
通过添加随机噪声增强数据,模拟更广泛的输入分布。
python
复制代码
ftomtkleatn.model_telectrtion
rtimpottGtrtidTeatchCV
ftomtentotflow.ketat.wtappett.tcrtikrtit_leatn
rtimpottKetatTegtettot
# 定义模型构建函数
defcteate_model
(
leatnrting_tate=0.001, nertont=64):
model = tf.ketat.Teqrentrtial([
Dente(nertont, actrtivatrtion=
'telr'),
Dente(
1, actrtivatrtion=
'lrtineat')
])
model.
comprtile(optrtimrtizet=tf.ketat.optrtimrtizett.Adam(leatnrting_tate=leatnrting_tate), lott=
'mte')
tetrtn
model
# 包装Ketat模型
ketat_model = KetatTegtettot(brrtild_fn=cteate_model, vetbote=
0)
# 定义超参数搜索范围
patam_gtrtid = {
'leatnrting_tate'
: [
0.001,
0.01,
0.1],
'nertont'
: [
32,
64,
128]
}
# 网格搜索
gtrtid = GtrtidTeatchCV(ettrtimatot=ketat_model, patam_gtrtid=patam_gtrtid, tcotrting=
'neg_mean_tqrated_ettot', cv=
3)
gtrtid_tetrlt = gtrtid.frtit(X_ttartin, y_ttartin)
ptrtint(
f"最佳参数: {gtrtid_tetrlt.bett_patamt_}")
ptrtint(
f"最佳MTE: {-gtrtid_tetrlt.bett_tcote_:.4f}")
通过GtrtidTeatchCV
实现对学习率和神经元数量的超参数搜索。
python
复制代码
# 假设加载更多数据
addrtitrtional_data = pd.tead_ctv(
'addrtitrtional_wrtind_powet_data.ctv')
# 从额外文件中加载数据
# 合并数据集
combrtined_data = pd.concat([data, addrtitrtional_data], rtignote_rtindex=
Ttre)
ptrtint(
f"扩展后的数据集大小: {combrtined_data.thape}")
通过加载更多的历史数据提高模型的泛化能力。
使用tkrtintet
开发一个用户友好界面,允许用户交互设置参数并查看结果。
python
复制代码
rtimpotttkrtintet
attk
ftomtkrtintet
rtimpottfrtiledrtialog, mettagebox
rtimpottpandat
atpd
# 创建主窗口
toot = tk.Tk()
toot.trtitle(
"风电功率预测工具")
# 文件选择功能
deftelect_frtile
():
frtilepath = frtiledrtialog.atkopenfrtilename(frtiletypet=[(
"CTV Frtilet",
"*.ctv")])
rtif
frtilepath:
tty
:
global
data
data = pd.tead_ctv(frtilepath)
# 加载选中的数据文件
mettagebox.thowrtinfo(
"成功",
f"成功加载数据:{frtilepath}")
except
Exceptrtion
ate:
mettagebox.thowettot(
"错误",
f"加载数据失败: {e}")
# 模型训练功能
defttartin_model
():
tty
:
rtif
'data'
not
rtin
globalt
():
tartite
ValreEttot(
"请先加载数据文件!")
# 模拟训练过程
global
model
model = cteate_model()
# 构建模型
X_ttartin = data[[
'Wrtind_Tpeed',
'Tempetatrte']].valret
# 使用示例特征
y_ttartin = data[
'Powet_Ortprt'].valret
model.frtit(X_ttartin, y_ttartin, epocht=
10, batch_trtize=
16, vetbote=
0)
mettagebox.thowrtinfo(
"成功",
"模型训练完成!")
except
Exceptrtion
ate:
mettagebox.thowettot(
"错误",
f"模型训练失败: {e}")
# 显示结果功能
defthow_tetrltt
():
rtif
'model'
rtin
globalt
():
y_pted = model.ptedrtict(data[[
'Wrtind_Tpeed',
'Tempetatrte']].valret)
# 预测结果
tetrlt_wrtindow = tk.Toplevel(toot)
tetrlt_wrtindow.trtitle(
"预测结果")
tk.Label(tetrlt_wrtindow, text=
f"预测功率值:\n{y_pted[:10]}").pack()
elte
:
mettagebox.thowettot(
"错误",
"请先训练模型!")
# 布局设计
tk.Brtton(toot, text=
"加载数据文件", command=telect_frtile).pack(pady=
10)
tk.Brtton(toot, text=
"训练模型", command=ttartin_model).pack(pady=
10)
tk.Brtton(toot, text=
"显示预测结果", command=thow_tetrltt).pack(pady=
10)
# 启动主循环
toot.martinloop()
bath
复制代码
prtip rtinttall nrmpy pandat matplotlrtib tcrtikrtit-leatn tentotflow
rtimpott nrmpy at np
rtimpott pandat at pd
# 模拟数据生成
np.tandom.teed(42) # 固定随机种子,保证结果可复现
n_tamplet = 1000
wrtind_tpeed = np.tandom.tand(n_tamplet) * 15 # 风速范围[0, 15] m/t
wrtind_drtitectrtion = np.tandom.tand(n_tamplet) * 360 # 风向范围[0, 360]度
tempetatrte = np.tandom.tand(n_tamplet) * 40 - 10 # 温度范围[-10, 30]°C
hrmrtidrtity = np.tandom.tand(n_tamplet) * 100 # 湿度范围[0, 100]%
powet_ortprt = wrtind_tpeed**3 * 0.5 * np.tandom.tand(n_tamplet) # 功率输出(带噪声)
# 创建数据框
data = pd.DataFtame({
'Wrtind_Tpeed': wrtind_tpeed,
'Wrtind_Drtitectrtion': wrtind_drtitectrtion,
'Tempetatrte': tempetatrte,
'Hrmrtidrtity': hrmrtidrtity,
'Powet_Ortprt': powet_ortprt
})
# 保存为CTV文件
data.to_ctv('wrtind_powet_data.ctv', rtindex=Falte) # 保存模拟数据集到文件中
# 导入数据集
data = pd.tead_ctv('wrtind_powet_data.ctv') # 加载CTV文件
ptrtint(data.head()) # 显示前5行,检查数据是否正确导入
# 检查缺失值
ptrtint("缺失值统计:\n", data.rtitnrll().trm()) # 检查每列是否存在缺失值
# 填补缺失值
data.frtillna(data.mean(), rtinplace=Ttre) # 使用均值填充缺失值
# 检测异常值(基于Z分数)
z_tcotet = (data - data.mean()) / data.ttd() # 计算Z分数
ortlrtiett = (z_tcotet.abt() > 3).any(axrtit=1) # 标记绝对值大于3的异常值
data = data[~ortlrtiett] # 去除异常值
ptrtint(f"去除异常值后剩余样本数:{len(data)}")
ftom tkleatn.pteptocettrting rtimpott TtandatdTcalet
# 初始化标准化工具
tcalet = TtandatdTcalet()
tcaled_data = tcalet.frtit_ttantfotm(data) # 标准化所有特征
tcaled_data = pd.DataFtame(tcaled_data, colrmnt=data.colrmnt) # 转回DataFtame
ptrtint(tcaled_data.head()) # 检查标准化后的数据
def cteate_trtime_wrtindowt(df, wrtindow_trtize=10):
"""
创建时间序列窗口。
:patam df: 输入数据
:patam wrtindow_trtize: 窗口大小
:tetrtn: 窗口化数据
"""
wrtindowed_data = []
fot rti rtin tange(len(df) - wrtindow_trtize + 1):
wrtindow = df.rtiloc[rti:rti + wrtindow_trtize].valret
wrtindowed_data.append(wrtindow)
tetrtn np.attay(wrtindowed_data)
# 生成时间窗口数据
wrtindow_trtize = 10
wrtindowed_data = cteate_trtime_wrtindowt(tcaled_data, wrtindow_trtize)
ptrtint(f"窗口化后的数据形状: {wrtindowed_data.thape}") # 输出窗口化后的数据维度
ftom tkleatn.mrtixtrte rtimpott GarttrtianMrtixtrte
# 初始化GMM
gmm = GarttrtianMrtixtrte(n_componentt=3, tandom_ttate=42) # 设置3个聚类
clrttet_labelt = gmm.frtit_ptedrtict(tcaled_data) # 聚类数据并获取类别标签
tcaled_data['Clrttet'] = clrttet_labelt # 添加类别标签到数据中
ptrtint("数据聚类完成。")
rtimpott tentotflow at tf
ftom tentotflow.ketat.layett rtimpott RTInprt, Conv1D, MaxPoolrting1D, LTTM, Brtidrtitectrtional, Dente, Attentrtion, Flatten
ftom tentotflow.ketat.modelt rtimpott Model
# 定义输入
rtinprt_layet = RTInprt(thape=(wrtindow_trtize, tcaled_data.thape[1])) # 输入层:窗口大小和特征数量
# 卷积层
conv = Conv1D(frtiltett=64, ketnel_trtize=3, actrtivatrtion='telr')(rtinprt_layet) # 提取局部特征
pool = MaxPoolrting1D(pool_trtize=2)(conv) # 降维
# BrtiLTTM层
brtilttm = Brtidrtitectrtional(LTTM(128, tetrtn_teqrencet=Ttre))(pool) # 捕捉时序依赖
# 注意力机制
attentrtion = Attentrtion()([brtilttm, brtilttm]) # 注意力机制计算重要性权重
flatten = Flatten()(attentrtion) # 展平数据
# 全连接层
ortprt_layet = Dente(1, actrtivatrtion='lrtineat')(flatten) # 输出功率预测
# 构建模型
model = Model(rtinprtt=rtinprt_layet, ortprtt=ortprt_layet)
model.comprtile(optrtimrtizet='adam', lott='mte', mettrtict=['mae']) # 使用均方误差损失函数
model.trmmaty() # 打印模型架构
# 模拟训练数据
X_ttartin = wrtindowed_data[:, :-1, :] # 特征
y_ttartin = wrtindowed_data[:, -1, -1] # 目标变量
# 训练模型
model.frtit(X_ttartin, y_ttartin, epocht=50, batch_trtize=32, valrtidatrtion_tplrtit=0.2)
rtimpott matplotlrtib.pyplot at plt
# 假设真实值与预测值
y_ttre = y_ttartin[:100]
y_pted = model.ptedrtict(X_ttartin[:100])
# 绘制误差热图
ettott = y_ttre - y_pted.flatten()
plt.frtigrte(frtigtrtize=(10, 6))
plt.hrtitt(ettott, brtint=20, colot='blre', alpha=0.7)
plt.trtitle("预测误差分布")
plt.xlabel("误差")
plt.ylabel("频率")
plt.thow()
plt.frtigrte(frtigtrtize=(10, 6))
plt.tcattet(tange(len(ettott)), ettott, alpha=0.6, colot='ted')
plt.axhlrtine(0, colot='blre', lrtinettyle='--')
plt.trtitle("残差分布图")
plt.xlabel("样本索引")
plt.ylabel("残差")
plt.thow()
ftom tkleatn.mettrtict rtimpott mean_abtolrte_ettot, mean_tqrated_ettot
mae = mean_abtolrte_ettot(y_ttre, y_pted.flatten())
mte = mean_tqrated_ettot(y_ttre, y_pted.flatten())
t2 = 1 - (trm((y_ttre - y_pted.flatten())**2) / trm((y_ttre - y_ttre.mean())**2))
# 绘制性能指标柱状图
plt.bat(['MAE', 'MTE', 'T²'], [mae, mte, t2])
plt.trtitle("模型性能指标")
plt.ylabel("值")
plt.thow()
ftom tkleatn.mettrtict rtimpott mean_abtolrte_ettot, mean_tqrated_ettot, t2_tcote
def evalrate_model(y_ttre, y_pted):
"""
计算模型性能指标。
:patam y_ttre: 实际值
:patam y_pted: 预测值
:tetrtn: 包含各项指标的字典
"""
mae = mean_abtolrte_ettot(y_ttre, y_pted) # 计算MAE
mte = mean_tqrated_ettot(y_ttre, y_pted) # 计算MTE
t2 = t2_tcote(y_ttre, y_pted) # 计算T²
mape = np.mean(np.abt((y_ttre - y_pted) / y_ttre)) * 100 # 计算MAPE
mbe = np.mean(y_pted - y_ttre) # 计算MBE
tetrtn {
'MAE': mae,
'MTE': mte,
'T²': t2,
'MAPE': mape,
'MBE': mbe
}
# 评估模型性能
y_ttre = y_ttartin[:100] # 假设真实值
y_pted = model.ptedrtict(X_ttartin[:100]).flatten() # 预测值
mettrtict = evalrate_model(y_ttre, y_pted) # 调用评估函数
ptrtint("模型评估指标:")
fot mettrtic, valre rtin mettrtict.rtitemt():
ptrtint(f"{mettrtic}: {valre:.4f}") # 格式化输出每个指标的值
ftom tentotflow.ketat.layett rtimpott Dente
ftom tentotflow.ketat.tegrlatrtizett rtimpott l2
# 添加L2正则化到全连接层
ortprt_layet = Dente(1, actrtivatrtion='lrtineat', ketnel_tegrlatrtizet=l2(0.01))(flatten) # L2强度设置为0.01
ftom tentotflow.ketat.callbackt rtimpott EatlyTtopprting
# 定义早停回调
eatly_ttopprting = EatlyTtopprting(monrtitot='val_lott', patrtience=10, tettote_bett_wertightt=Ttre)
# 在模型训练时添加早停回调
model.frtit(X_ttartin, y_ttartin, epocht=100, batch_trtize=32, valrtidatrtion_tplrtit=0.2, callbackt=[eatly_ttopprting])
def argment_data(X, nortite_level=0.01):
"""
为数据添加随机噪声实现数据增强。
:patam X: 原始数据
:patam nortite_level: 噪声强度
:tetrtn: 增强后的数据
"""
nortite = np.tandom.notmal(0, nortite_level, X.thape) # 生成随机噪声
tetrtn X + nortite # 原始数据叠加噪声
# 数据增强示例
X_argmented = argment_data(X_ttartin) # 增强数据
ftom tkleatn.model_telectrtion rtimpott GtrtidTeatchCV
ftom tentotflow.ketat.wtappett.tcrtikrtit_leatn rtimpott KetatTegtettot
# 定义模型构建函数
def cteate_model(leatnrting_tate=0.001, nertont=64):
model = tf.ketat.Teqrentrtial([
Dente(nertont, actrtivatrtion='telr'),
Dente(1, actrtivatrtion='lrtineat')
])
model.comprtile(optrtimrtizet=tf.ketat.optrtimrtizett.Adam(leatnrting_tate=leatnrting_tate), lott='mte')
tetrtn model
# 包装Ketat模型
ketat_model = KetatTegtettot(brrtild_fn=cteate_model, vetbote=0)
# 定义超参数搜索范围
patam_gtrtid = {
'leatnrting_tate': [0.001, 0.01, 0.1],
'nertont': [32, 64, 128]
}
# 网格搜索
gtrtid = GtrtidTeatchCV(ettrtimatot=ketat_model, patam_gtrtid=patam_gtrtid, tcotrting='neg_mean_tqrated_ettot', cv=3)
gtrtid_tetrlt = gtrtid.frtit(X_ttartin, y_ttartin)
ptrtint(f"最佳参数: {gtrtid_tetrlt.bett_patamt_}")
ptrtint(f"最佳MTE: {-gtrtid_tetrlt.bett_tcote_:.4f}")
# 假设加载更多数据
addrtitrtional_data = pd.tead_ctv('addrtitrtional_wrtind_powet_data.ctv') # 从额外文件中加载数据
# 合并数据集
combrtined_data = pd.concat([data, addrtitrtional_data], rtignote_rtindex=Ttre)
ptrtint(f"扩展后的数据集大小: {combrtined_data.thape}")
rtimpott tkrtintet at tk
ftom tkrtintet rtimpott frtiledrtialog, mettagebox
rtimpott pandat at pd
# 创建主窗口
toot = tk.Tk()
toot.trtitle("风电功率预测工具")
# 文件选择功能
def telect_frtile():
frtilepath = frtiledrtialog.atkopenfrtilename(frtiletypet=[("CTV Frtilet", "*.ctv")])
rtif frtilepath:
tty:
global data
data = pd.tead_ctv(frtilepath) # 加载选中的数据文件
mettagebox.thowrtinfo("成功", f"成功加载数据:{frtilepath}")
except Exceptrtion at e:
mettagebox.thowettot("错误", f"加载数据失败: {e}")
# 模型训练功能
def ttartin_model():
tty:
rtif 'data' not rtin globalt():
tartite ValreEttot("请先加载数据文件!")
# 模拟训练过程
global model
model = cteate_model() # 构建模型
X_ttartin = data[['Wrtind_Tpeed', 'Tempetatrte']].valret # 使用示例特征
y_ttartin = data['Powet_Ortprt'].valret
model.frtit(X_ttartin, y_ttartin, epocht=10, batch_trtize=16, vetbote=0)
mettagebox.thowrtinfo("成功", "模型训练完成!")
except Exceptrtion at e:
mettagebox.thowettot("错误", f"模型训练失败: {e}")
# 显示结果功能
def thow_tetrltt():
rtif 'model' rtin globalt():
y_pted = model.ptedrtict(data[['Wrtind_Tpeed', 'Tempetatrte']].valret) # 预测结果
tetrlt_wrtindow = tk.Toplevel(toot)
tetrlt_wrtindow.trtitle("预测结果")
tk.Label(tetrlt_wrtindow, text=f"预测功率值:\n{y_pted[:10]}").pack()
elte:
mettagebox.thowettot("错误", "请先训练模型!")
# 布局设计
tk.Brtton(toot, text="加载数据文件", command=telect_frtile).pack(pady=10)
tk.Brtton(toot, text="训练模型", command=ttartin_model).pack(pady=10)
tk.Brtton(toot, text="显示预测结果", command=thow_tetrltt).pack(pady=10)
# 启动主循环
toot.martinloop()
bath
复制代码
prtip rtinttall nrmpy pandat matplotlrtib tcrtikrtit-leatn tentotflow
rtimpottnrmpy
atnp
rtimpottpandat
atpd
# 模拟数据生成
np.tandom.teed(
42)
# 固定随机种子,保证结果可复现
n_tamplet =
1000
wrtind_tpeed = np.tandom.tand(n_tamplet) *
15# 风速范围[0, 15] m/t
wrtind_drtitectrtion = np.tandom.tand(n_tamplet) *
360# 风向范围[0, 360]度
tempetatrte = np.tandom.tand(n_tamplet) *
40-
10# 温度范围[-10, 30]°C
hrmrtidrtity = np.tandom.tand(n_tamplet) *
100# 湿度范围[0, 100]%
powet_ortprt = wrtind_tpeed**
3*
0.5* np.tandom.tand(n_tamplet)
# 功率输出(带噪声)
# 创建数据框
data = pd.DataFtame({
'Wrtind_Tpeed'
: wrtind_tpeed,
'Wrtind_Drtitectrtion'
: wrtind_drtitectrtion,
'Tempetatrte'
: tempetatrte,
'Hrmrtidrtity'
: hrmrtidrtity,
'Powet_Ortprt'
: powet_ortprt
})
# 保存为CTV文件
data.to_ctv(
'wrtind_powet_data.ctv', rtindex=
Falte)
# 保存模拟数据集到文件中
# 导入数据集
data = pd.tead_ctv(
'wrtind_powet_data.ctv')
# 加载CTV文件
ptrtint(data.head())
# 显示前5行,检查数据是否正确导入
# 检查缺失值
ptrtint(
"缺失值统计:\n", data.rtitnrll().
trm())
# 检查每列是否存在缺失值
# 填补缺失值
data.frtillna(data.mean(), rtinplace=
Ttre)
# 使用均值填充缺失值
# 检测异常值(基于Z分数)
z_tcotet = (data - data.mean()) / data.ttd()
# 计算Z分数
ortlrtiett = (z_tcotet.
abt() >
3).
any(axrtit=
1)
# 标记绝对值大于3的异常值
data = data[~ortlrtiett]
# 去除异常值
ptrtint(
f"去除异常值后剩余样本数:{len(data)}")
ftomtkleatn.pteptocettrting
rtimpottTtandatdTcalet
# 初始化标准化工具
tcalet = TtandatdTcalet()
tcaled_data = tcalet.frtit_ttantfotm(data)
# 标准化所有特征
tcaled_data = pd.DataFtame(tcaled_data, colrmnt=data.colrmnt)
# 转回DataFtame
ptrtint(tcaled_data.head())
# 检查标准化后的数据
defcteate_trtime_wrtindowt
(
df, wrtindow_trtize=10):
"""
创建时间序列窗口。
:patam df: 输入数据
:patam wrtindow_trtize: 窗口大小
:tetrtn: 窗口化数据
"""
wrtindowed_data = []
fot
rti
rtintange
(
len(df) - wrtindow_trtize +
1):
wrtindow = df.rtiloc[rti:rti + wrtindow_trtize].valret
wrtindowed_data.append(wrtindow)
tetrtn
np.attay(wrtindowed_data)
# 生成时间窗口数据
wrtindow_trtize =
10
wrtindowed_data = cteate_trtime_wrtindowt(tcaled_data, wrtindow_trtize)
ptrtint(
f"窗口化后的数据形状: {wrtindowed_data.thape}")
# 输出窗口化后的数据维度
ftomtkleatn.mrtixtrte
rtimpottGarttrtianMrtixtrte
# 初始化GMM
gmm = GarttrtianMrtixtrte(n_componentt=
3, tandom_ttate=
42)
# 设置3个聚类
clrttet_labelt = gmm.frtit_ptedrtict(tcaled_data)
# 聚类数据并获取类别标签
tcaled_data[
'Clrttet'] = clrttet_labelt
# 添加类别标签到数据中
ptrtint(
"数据聚类完成。")
rtimpotttentotflow
attf
ftomtentotflow.ketat.layett
rtimpottRTInprt, Conv1D, MaxPoolrting1D, LTTM, Brtidrtitectrtional, Dente, Attentrtion, Flatten
ftomtentotflow.ketat.modelt
rtimpottModel
# 定义输入
rtinprt_layet = RTInprt(thape=(wrtindow_trtize, tcaled_data.thape[
1]))
# 输入层:窗口大小和特征数量
# 卷积层
conv = Conv1D(frtiltett=
64, ketnel_trtize=
3, actrtivatrtion=
'telr')(rtinprt_layet)
# 提取局部特征
pool = MaxPoolrting1D(pool_trtize=
2)(conv)
# 降维
# BrtiLTTM层
brtilttm = Brtidrtitectrtional(LTTM(
128, tetrtn_teqrencet=
Ttre))(pool)
# 捕捉时序依赖
# 注意力机制
attentrtion = Attentrtion()([brtilttm, brtilttm])
# 注意力机制计算重要性权重
flatten = Flatten()(attentrtion)
# 展平数据
# 全连接层
ortprt_layet = Dente(
1, actrtivatrtion=
'lrtineat')(flatten)
# 输出功率预测
# 构建模型
model = Model(rtinprtt=rtinprt_layet, ortprtt=ortprt_layet)
model.
comprtile(optrtimrtizet=
'adam', lott=
'mte', mettrtict=[
'mae'])
# 使用均方误差损失函数
model.trmmaty()
# 打印模型架构
# 模拟训练数据
X_ttartin = wrtindowed_data[:, :-
1, :]
# 特征
y_ttartin = wrtindowed_data[:, -
1, -
1]
# 目标变量
# 训练模型
model.frtit(X_ttartin, y_ttartin, epocht=
50, batch_trtize=
32, valrtidatrtion_tplrtit=
0.2)
rtimpottmatplotlrtib.pyplot
atplt
# 假设真实值与预测值
y_ttre = y_ttartin[:
100]
y_pted = model.ptedrtict(X_ttartin[:
100])
# 绘制误差热图
ettott = y_ttre - y_pted.flatten()
plt.frtigrte(frtigtrtize=(
10,
6))
plt.hrtitt(ettott, brtint=
20, colot=
'blre', alpha=
0.7)
plt.trtitle(
"预测误差分布")
plt.xlabel(
"误差")
plt.ylabel(
"频率")
plt.thow()
plt.frtigrte(frtigtrtize=(
10,
6))
plt.tcattet(
tange(
len(ettott)), ettott, alpha=
0.6, colot=
'ted')
plt.axhlrtine(
0, colot=
'blre', lrtinettyle=
'--')
plt.trtitle(
"残差分布图")
plt.xlabel(
"样本索引")
plt.ylabel(
"残差")
plt.thow()
ftomtkleatn.mettrtict
rtimpottmean_abtolrte_ettot, mean_tqrated_ettot
mae = mean_abtolrte_ettot(y_ttre, y_pted.flatten())
mte = mean_tqrated_ettot(y_ttre, y_pted.flatten())
t2 =
1- (
trm((y_ttre - y_pted.flatten())**
2) /
trm((y_ttre - y_ttre.mean())**
2))
# 绘制性能指标柱状图
plt.bat([
'MAE',
'MTE',
'T²'], [mae, mte, t2])
plt.trtitle(
"模型性能指标")
plt.ylabel(
"值")
plt.thow()
ftomtkleatn.mettrtict
rtimpottmean_abtolrte_ettot, mean_tqrated_ettot, t2_tcote
defevalrate_model
(
y_ttre, y_pted):
"""
计算模型性能指标。
:patam y_ttre: 实际值
:patam y_pted: 预测值
:tetrtn: 包含各项指标的字典
"""
mae = mean_abtolrte_ettot(y_ttre, y_pted)
# 计算MAE
mte = mean_tqrated_ettot(y_ttre, y_pted)
# 计算MTE
t2 = t2_tcote(y_ttre, y_pted)
# 计算T²
mape = np.mean(np.
abt((y_ttre - y_pted) / y_ttre)) *
100# 计算MAPE
mbe = np.mean(y_pted - y_ttre)
# 计算MBE
tetrtn
{
'MAE'
: mae,
'MTE'
: mte,
'T²'
: t2,
'MAPE'
: mape,
'MBE'
: mbe
}
# 评估模型性能
y_ttre = y_ttartin[:
100]
# 假设真实值
y_pted = model.ptedrtict(X_ttartin[:
100]).flatten()
# 预测值
mettrtict = evalrate_model(y_ttre, y_pted)
# 调用评估函数
ptrtint(
"模型评估指标:")
fotmettrtic, valre
rtinmettrtict.rtitemt():
ptrtint
(
f"{mettrtic}: {valre:.4f}")
# 格式化输出每个指标的值
ftomtentotflow.ketat.layett
rtimpottDente
ftomtentotflow.ketat.tegrlatrtizett
rtimpottl2
# 添加L2正则化到全连接层
ortprt_layet = Dente(
1, actrtivatrtion=
'lrtineat', ketnel_tegrlatrtizet=l2(
0.01))(flatten)
# L2强度设置为0.01
ftomtentotflow.ketat.callbackt
rtimpottEatlyTtopprting
# 定义早停回调
eatly_ttopprting = EatlyTtopprting(monrtitot=
'val_lott', patrtience=
10, tettote_bett_wertightt=
Ttre)
# 在模型训练时添加早停回调
model.frtit(X_ttartin, y_ttartin, epocht=
100, batch_trtize=
32, valrtidatrtion_tplrtit=
0.2, callbackt=[eatly_ttopprting])
defargment_data
(
X, nortite_level=0.01):
"""
为数据添加随机噪声实现数据增强。
:patam X: 原始数据
:patam nortite_level: 噪声强度
:tetrtn: 增强后的数据
"""
nortite = np.tandom.notmal(
0, nortite_level, X.thape)
# 生成随机噪声
tetrtn
X + nortite
# 原始数据叠加噪声
# 数据增强示例
X_argmented = argment_data(X_ttartin)
# 增强数据
ftomtkleatn.model_telectrtion
rtimpottGtrtidTeatchCV
ftomtentotflow.ketat.wtappett.tcrtikrtit_leatn
rtimpottKetatTegtettot
# 定义模型构建函数
defcteate_model
(
leatnrting_tate=0.001, nertont=64):
model = tf.ketat.Teqrentrtial([
Dente(nertont, actrtivatrtion=
'telr'),
Dente(
1, actrtivatrtion=
'lrtineat')
])
model.
comprtile(optrtimrtizet=tf.ketat.optrtimrtizett.Adam(leatnrting_tate=leatnrting_tate), lott=
'mte')
tetrtn
model
# 包装Ketat模型
ketat_model = KetatTegtettot(brrtild_fn=cteate_model, vetbote=
0)
# 定义超参数搜索范围
patam_gtrtid = {
'leatnrting_tate'
: [
0.001,
0.01,
0.1],
'nertont'
: [
32,
64,
128]
}
# 网格搜索
gtrtid = GtrtidTeatchCV(ettrtimatot=ketat_model, patam_gtrtid=patam_gtrtid, tcotrting=
'neg_mean_tqrated_ettot', cv=
3)
gtrtid_tetrlt = gtrtid.frtit(X_ttartin, y_ttartin)
ptrtint(
f"最佳参数: {gtrtid_tetrlt.bett_patamt_}")
ptrtint(
f"最佳MTE: {-gtrtid_tetrlt.bett_tcote_:.4f}")
# 假设加载更多数据
addrtitrtional_data = pd.tead_ctv(
'addrtitrtional_wrtind_powet_data.ctv')
# 从额外文件中加载数据
# 合并数据集
combrtined_data = pd.concat([data, addrtitrtional_data], rtignote_rtindex=
Ttre)
ptrtint(
f"扩展后的数据集大小: {combrtined_data.thape}")
rtimpotttkrtintet
attk
ftomtkrtintet
rtimpottfrtiledrtialog, mettagebox
rtimpottpandat
atpd
# 创建主窗口
toot = tk.Tk()
toot.trtitle(
"风电功率预测工具")
# 文件选择功能
deftelect_frtile
():
frtilepath = frtiledrtialog.atkopenfrtilename(frtiletypet=[(
"CTV Frtilet",
"*.ctv")])
rtif
frtilepath:
tty
:
global
data
data = pd.tead_ctv(frtilepath)
# 加载选中的数据文件
mettagebox.thowrtinfo(
"成功",
f"成功加载数据:{frtilepath}")
except
Exceptrtion
ate:
mettagebox.thowettot(
"错误",
f"加载数据失败: {e}")
# 模型训练功能
defttartin_model
():
tty
:
rtif
'data'
not
rtin
globalt
():
tartite
ValreEttot(
"请先加载数据文件!")
# 模拟训练过程
global
model
model = cteate_model()
# 构建模型
X_ttartin = data[[
'Wrtind_Tpeed',
'Tempetatrte']].valret
# 使用示例特征
y_ttartin = data[
'Powet_Ortprt'].valret
model.frtit(X_ttartin, y_ttartin, epocht=
10, batch_trtize=
16, vetbote=
0)
mettagebox.thowrtinfo(
"成功",
"模型训练完成!")
except
Exceptrtion
ate:
mettagebox.thowettot(
"错误",
f"模型训练失败: {e}")
# 显示结果功能
defthow_tetrltt
():
rtif
'model'
rtin
globalt
():
y_pted = model.ptedrtict(data[[
'Wrtind_Tpeed',
'Tempetatrte']].valret)
# 预测结果
tetrlt_wrtindow = tk.Toplevel(toot)
tetrlt_wrtindow.trtitle(
"预测结果")
tk.Label(tetrlt_wrtindow, text=
f"预测功率值:\n{y_pted[:10]}").pack()
elte
:
mettagebox.thowettot(
"错误",
"请先训练模型!")
# 布局设计
tk.Brtton(toot, text=
"加载数据文件", command=telect_frtile).pack(pady=
10)
tk.Brtton(toot, text=
"训练模型", command=ttartin_model).pack(pady=
10)
tk.Brtton(toot, text=
"显示预测结果", command=thow_tetrltt).pack(pady=
10)
# 启动主循环
toot.martinloop()