Scikit-learn MLPRegressor - 如何使结果独立于随机种子?

时间:2018-05-05 18:54:57

标签: scikit-learn neural-network

我尝试使用MLP学习一些正弦函数。不幸的是,结果很大程度上取决于随机种子。 我怎样才能调整MLPRegressor,以便结果减少对随机种子的依赖?

代码:

import numpy as np
from sklearn.metrics import mean_squared_error
from sklearn.neural_network import MLPRegressor

LOOK_BACK = 10

x = np.linspace(-10,10,1000)
y = np.sin(x)

dataX,dataY = [],[]
for i in range(len(y)-LOOK_BACK-1):
        dataX.append(y[i:(i+LOOK_BACK)])
        dataY.append(y[i+LOOK_BACK])
x_train = np.array(dataX)
y_train = np.array(dataY)


for i in range(10):
        print "np.random.seed(%d)"%(i)
        np.random.seed(i)
        model = MLPRegressor(activation='tanh',solver='adam')
        model.fit(x_train,y_train)
        train_predict = model.predict(x_train)
        print 'MSE train:', mean_squared_error(train_predict,y_train)

输出:

np.random.seed(0)
MSE train: 0.00167560534562
np.random.seed(1)
MSE train: 0.0050531872206
np.random.seed(2)
MSE train: 0.00279393534973
np.random.seed(3)
MSE train: 0.00224293537385
np.random.seed(4)
MSE train: 0.00154350859516
np.random.seed(5)
MSE train: 0.00383997358155
np.random.seed(6)
MSE train: 0.0265389606087
np.random.seed(7)
MSE train: 0.00195637404624
np.random.seed(8)
MSE train: 0.000590823529864
np.random.seed(9)
MSE train: 0.00393172460516

种子6,9和8产生不同的MSE顺序。我怎么能阻止这个?

1 个答案:

答案 0 :(得分:2)

多层感知器以及其他神经网络架构受到以下事实的影响:它们相应的损失函数具有许多局部最优。因此,所有梯度算法都严重依赖于选择的初始化。而不是将其视为不合需要的,您可以将初始化(通过random_state确定)视为额外的超参数,为您提供灵活性。

只是为了记录,你的MSE的差异并不大,如果你的目标是完全过度拟合,那么将正则化参数alpha改为零(默认值为alpha = 0.0001)