如何在机器学习中训练未标记的数据?

问题描述

我有近 9000 个实体的数据,我想训练我的模型并从数据中检测异常。

我尝试了几件事来完成我的工作,而我所做的一件事是

def create_sequences(values,time_steps=TIME_STEPS):
 output = []
 for i in range(len(values) - time_steps):
     output.append(values[i : (i + time_steps)])
 return np.stack(output)

这里我开始拆分我的训练数据

x_train = create_sequences(data['HR'].values)
x_train = np.expand_dims(x_train,axis=2)

x_train = create_sequences(data['pulse'].values)
x_train = np.expand_dims(x_train,axis=2)

x_train = create_sequences(data['SpO2'].values)
x_train = np.expand_dims(x_train,axis=2)

x_train = create_sequences(data['ABPDias'].values)
x_train = np.expand_dims(x_train,axis=2)

x_train = create_sequences(data['ABPMean'].values)
x_train = np.expand_dims(x_train,axis=2)

x_train = create_sequences(data['RESP'].values)
x_train = np.expand_dims(x_train,axis=2)

这是我的训练模型

model = Sequential()
model.add(Conv1D(filters=32,kernel_size=7,padding="same",strides=2,input_shape=(x_train.shape[1],x_train.shape[2])))
model.add(MaxPooling1D(pool_size=1,padding="valid"))
model.add(Dropout(0.2))
model.add(Conv1D(filters=16,strides=2))
model.add(LSTM(units=20,return_sequences=True))
model.add(Dropout(0.2))
model.add(Conv1DTranspose(filters=16,strides=2))
model.add(Conv1D(filters=32,padding="same"))
model.add(MaxPooling1D(pool_size=2,padding="valid"))
model.add(Conv1DTranspose(filters=32,strides=4,activation="relu"))
model.add(Conv1DTranspose(filters=1,padding="same"))

model.compile(optimizer="adam",loss="mse")

model.summary()



history = model.fit(
 x_train,x_train,epochs=150,batch_size=128,validation_split=0.1
)

但这花了很多时间。我错过了什么?,有人可以指导我吗?

还有一件事是,对于未标记的数据,我应该使用 train_test_split 吗?

解决方法

如果没有标记数据,您就无法进行监督学习。不建议同时使用特征作为输入和标签。您正在寻找的是基于聚类的异常检测,它属于无监督学习的范畴。 DBSCAN 可能是这个任务的不错选择,它在 scikit-learn 中可用。

,

您使用某个层来编码然后解码数据。您应用的技术是监督机器学习 (ML)。由于您的数据集未标记,因此您需要采用无监督 ML 方法。 聚类是一种在多维未标记数据中寻找模式的技术。 基于聚类的异常检测有两种不同的方法。 1- 无监督聚类,其中使用由正常流量和攻击流量组成的未标记数据训练异常检测模型。 2- 半监督聚类,其中模型仅使用正常数据进行训练以构建正常活动的配置文件。