在本文中,将重点探讨深度学习技术在实时应用中的实际应用,而不是深入讨论其背后的理论概念。首先,让了解无监督机器学习的含义。无监督机器学习是机器学习的一个分支,它处理从数据集中识别隐藏模式,并且不依赖于数据中目标变量的标签。因此,这里的算法用于发现数据的底层结构,如数据聚类的存在、异常数据检测等。
当研究的目标变量的期望值未知时,无监督深度学习技术被用来找出目标(期望变量)与其他变量之间的关系,以得出结果(即目标的大致值)。
如上所述,商业案例将来自能源领域,特别是可再生能源(太阳能板)的能源。太阳能板使用光伏和硅太阳能电池将辐射转化为电力,已在全球变得相当流行。随着成为未来能源选择的重要组成部分,考虑一个场景,在特定地点A安装了太阳能板,并从电力局的计量电力中获得了良好的节省效益。
现在,想在另一个地理位置/区域的地点B也安装类似的太阳能板。但在进行另一项投资之前,能否根据在地点A安装的太阳能板获得的电力,知道在地点B可以获得多少电力?这将帮助做出关于该地点投资和电力需求的正确决策。让现在看看问题陈述。
基于过去M个月在地点A、B'安装的太阳能板产生的电力,预测在任何未来日期在另一个未知地点B安装的太阳能板可以产生的电力,其中B和B'位于同一地理位置。
(239538,10)数据来自2019年12月至2020年10月的特定地点,包含10个特征和0.23百万行。转换为NumPy数组后,将具有以下结构:
array([
[2019., 12., 4., …, 6., 0., 0.],
[2019., 12., 4., …, 6., 1., 0.],
[2019., 12., 4., …, 6., 2., 0.],
…,
[2020., 10., 4., …, 17., 57., 0.],
[2020., 10., 4., …, 17., 58., 0.],
[2020., 10., 4., …, 17., 59., 0.]])
太阳能板的主要能源是阳光,因此为了适应季节性和其他因素,数据集包括诸如‘年份’、‘月份’、‘季度’、‘一周中的哪一天’、‘月份中的哪一天’、‘一年中的哪一天’、‘一年中的周数’、‘小时’、‘分钟’等作为关键预测因子,以及作为因变量的发电量。典型的一天的电力生成看起来像一个高斯曲线。
可以看到,电力是在早上6:00到傍晚18:00(日照小时)之间产生的,以分钟为单位表示。电力最初较少,然后逐渐增加,并在中午左右达到峰值,然后到一天结束时逐渐减少,呈现出类似钟形曲线的特性。从这一点,可以直观地推断,所有太阳能板都将具有这种模式,无论它放置在地理的哪个部分,唯一的区别是特定地点产生的电力数量,这反过来可能取决于许多因素,如季节性、天气等,以及可用的阳光。
自编码器是一种无监督学习技术,用于压缩原始数据集,然后从压缩的数据中重建它。这里有一个编码器和解码器组件,它们分别执行这些功能。在这里,神经网络的主要思想是将输入转换为输出,几乎没有失真。也就是说,自编码器在输出与输入非常相似的地方工作得非常好,如图像去噪。
自编码器也用于特征提取,特别是在数据维度高的情况下。传统上,自编码器通常用于图像数据集,但在这里将展示它在数值数据集上的应用。概念保持不变。在示例中,将利用AE的这一特性,因为在情况下,在另一个地点获得的电力输出将与当前地点非常相似,如上所述。将展示AE的两种变体,一种是基于LSTM的AE,另一种是传统的AE在Keras中。
有2019年12月至2020年10月的历史数据,来自地点A和B'。地点B与地点B'位于同一地理边界。希望根据地点A、B'的历史数据找到地点B产生的电力。没有关于目标地点B的任何信息。
X1s和X3s是地点A的归一化数据,X3s和X4s是地点B'的归一化数据。数据集有10个非常相似的特征,X2s[:,9]和X4s[:,9]在这些相应地点有轻微的变化,具有电力值。将尝试使用一个简单的LSTM自编码器将X1s转换为X2s。使用了平均绝对误差作为损失,并且在这里使用了‘线性’激活,因为需要预测的电力值非常接近实际值(在这种情况下是地点B')。
这只是一个示例代码,用于给出如何构建基于LSTM的AE的想法,超参数需要根据不同的优化器/多层/周期进行调整,以获得非常好的近似。请参阅以下代码:
from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout, RepeatVector, TimeDistributed
from keras.callbacks import EarlyStopping, ModelCheckpoint
from keras.regularizers import l1
from keras import regularizers
# 定义模型
model = Sequential()
model.add(LSTM(256, activation='linear', input_shape=(X1801861s.shape[1],1), activity_regularizer=regularizers.l1(10e-5), return_sequences=False))
model.add(RepeatVector(X1s.shape[1]))
model.add(LSTM(256, activation='linear', return_sequences=True))
model.add(TimeDistributed(Dense(1, activation='linear')))
adam = keras.optimizers.Adam(lr=0.001)
model.compile(optimizer=adam, loss='MAE')
model.summary()
earlyStopping = EarlyStopping(monitor='val_loss', patience=30, verbose=0, mode='min')
mcp_save = ModelCheckpoint('sola-001.mdl_wts.hdf5', save_best_only=True, monitor='val_loss', mode='min')
history = model.fit(X1s, X2s, epochs=500, batch_size=1024, callbacks=[earlyStopping, mcp_save], validation_data=(X3s, X4s))
下面的图表显示了关于A和B'的地点B预测。期望它应该非常接近B'。在这里,使用地点A、B'的数据来得出未知地点B的预测。下面的图表是这些地点随机挑选的3天趋势。
这张图表显示了所有3个地点A、B'和目标地点B在300天内的峰值电力。
input_dim = X1s.shape[1]
encoding_dim = 10
input_layer = Input(shape=(input_dim,))
encoder = Dense(encoding_dim, activation="linear", activity_regularizer=regularizers.l1(10e-5))(input_layer)
decoder = Dense(input_dim, activation='linear')(encoder)
encoder = Model(input_layer, encoder)
autoencoder = Model(inputs=input_layer, outputs=decoder)
adam = keras.optimizers.Adam(lr=0.001)
earlyStopping = EarlyStopping(monitor='val_loss', patience=30, verbose=0, mode='min')
mcp_save = ModelCheckpoint('sola-002.mdl_wts.hdf5', save_best_only=True, monitor='loss', mode='min')
autoencoder.compile(optimizer=adam, loss='MAE')
autoencoder.summary()
在训练LSTM/常规AE模型后评估模型:
from sklearn.metrics import mean_absolute_error, mean_squared_error, mean_squared_log_error
import math
mean_absolute_error(a, pd), math.sqrt(mean_squared_error(a, pd)), mean_absolute_error(act, p), math.sqrt(mean_squared_error(act, p))