假设我们有一个具有一个输入神经元和一个输出神经元的神经网络。训练数据由进程生成
和,例如类似的东西
feature | target
-----------------
0 0.0
0 1.0
0 1.5
0 -1.2
0 -0.9
...
我知道神经网络可以很好地处理分类问题中的标签错误。这意味着如果您有一个大型数据集并且几个示例的标签错误,它们基本上会被忽略。
但是对于这种问题我不太确定。第一个实验表明它们可以平滑值。
架构/训练中是否有有助于平滑/平均/去除噪声的选择?
我试过的
我创建了一个可以在没有噪音的情况下解决这种回归问题的网络。它的 MSE 约为0.0005
. 当我只向训练集添加一点噪音时,我得到的 MSE 为0.001
:
#!/usr/bin/env python
# core modules
import random
# 3rd party modules
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
import numpy as np
def main(add_noise=True):
# Get data
xs, ys = create_data_points(10000)
x_train, x_test, y_train, y_test = train_test_split(xs, ys, test_size=0.20)
# Add noise to training data
if add_noise:
noise = np.random.normal(0, 0.1, len(x_train))
x_train = x_train + noise
# Create model
model = create_model()
model.compile(optimizer='rmsprop',
loss='mse',
metrics=['mse'])
# Fit model to data.
model.fit(x_train, y_train, epochs=10, batch_size=32, verbose=1)
# Evaluate
y_pred = model.predict(x_test, batch_size=100).flatten()
print("MSE on test set:")
print(((y_pred - y_test)**2).sum() / len(y_test))
def create_data_points(nb_points):
xs = []
ys = []
for i in range(nb_points):
x = random.random()
xs.append(x)
ys.append(2 * x)
return np.array(xs), np.array(ys)
def create_model(input_dim=1, output_dim=1):
model = Sequential()
model.add(Dense(200, input_dim=input_dim, activation='relu'))
model.add(Dense(200, input_dim=input_dim, activation='relu'))
model.add(Dense(output_dim, activation='linear'))
return model
if __name__ == '__main__':
main()
异常值
在这个问题的早期版本中,当我的意思是“标签噪音”时,我写了“异常值”。对于异常值,有: