Ale*_*dro 5 time-series lstm keras anomaly-detection
我在 Keras 中构建了一个简单的 LSTM 模型,如下所示:
model = Sequential()
model.add(keras.layers.LSTM(hidden_nodes, input_dim=num_features, input_length=window, consume_less="mem"))
model.add(keras.layers.Dense(num_features, activation='sigmoid'))
optimizer = keras.optimizers.SGD(lr=learning_rate, decay=1e-6, momentum=0.9, nesterov=True)
Run Code Online (Sandbox Code Playgroud)
其中橙色线代表预测值,蓝色线代表大真相。
如您所见,网络重复了以前的值,但这不是我想要的。我有几个功能(不仅是图片中显示的功能),我希望网络考虑与其他时间序列的依赖关系,而不是只查看单个过去的数据并重复以前的数据。
我希望问题足够清楚!
我的数据
有 36 个时间序列(分类和数字数据)。我使用了一个长度为 W 的窗口,并重新整理了数据,以便以 Keras (num_samples, window, num_features) 中所需的形式创建一个 numpy 向量。
编辑 1
个数据样本:
0.5, 0.1, 0.4, 1, 0,74
0.1, 0.1, 0.8, 0.9, 0,8
0.2, 0.3, 0.5, 1, 0,85
Run Code Online (Sandbox Code Playgroud)
我有一个分类属性和两个数字属性。前三行指的是分类行(分类的one-hot编码)。最后两个是指两个数字属性。
所以我执行model.fit(T, X).
我也尝试过使用少量隐藏节点,但结果是一样的。
编辑 2
考虑使用数值和分类特征的自定义损失函数:
def mixed_num_cat_loss_backend(y_true, y_pred, signals_splits):
if isinstance(y_true, np.ndarray):
y_true = keras.backend.variable( y_true )
if isinstance(y_pred, np.ndarray):
y_pred = keras.backend.variable( y_pred )
y_true_mse = y_true[:,:signals_splits[0]]
y_pred_mse = y_pred[:,:signals_splits[0]]
mse_loss_v = keras.backend.square(y_true_mse-y_pred_mse)
categ_loss_v = [ keras.backend.categorical_crossentropy(
y_pred[:,signals_splits[i-1]:signals_splits[i]],
y_true[:,signals_splits[i-1]:signals_splits[i]],
from_logits=False) # force keras to normalize
for i in range(1,len(signals_splits)) ]
losses_v = keras.backend.concatenate( [mse_loss_v, keras.backend.stack(categ_loss_v,1)], 1)
return losses_v
Run Code Online (Sandbox Code Playgroud)
我使用model.fit(T, X)是为了知道数字特征在哪里(在矩阵中)。
这是通过从 2D numpy 数组开始准备数据的函数,如带有 M,T,X 的图片所示:
def prepare_training_data(data_matrix, boundaries, window = 5):
num_rows, num_columns = data_matrix.shape
effective_sizes = [max(0,(nrows - window)) for nrows in boundaries]
total_training_rows = sum(effective_sizes)
print " - Skipped dumps because smaller than window:", sum([z==0 for z in effective_sizes])
# prepare target variables
T = data_matrix[window:boundaries[0],:]
start_row = boundaries[0]
for good_rows, total_rows in zip(effective_sizes[1:],boundaries[1:]):
if good_rows>0:
T = np.vstack( (T,data_matrix[start_row+window:start_row+total_rows,:]) )
start_row += total_rows
# check concatenate
# training input to the LSTM
X = np.zeros((total_training_rows, window, num_columns))
curr_row = 0
curr_boundary = 0
for good_rows, total_rows in zip(effective_sizes,boundaries):
for i in range(good_rows):
X[curr_row] = data_matrix[curr_boundary+i:curr_boundary+i+window,:]
curr_row += 1
curr_boundary += total_rows
return X,T,effective_sizes
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1208 次 |
| 最近记录: |