每个 运行 中每个网络结果的差异?
Difference in every result of network in every run?
我编写了一个简单的神经网络(MLP 回归器)来适应简单的数据框列。为了获得最佳架构,我还将其定义为一个函数,以查看它是否正在收敛到一个模式。但是每次我 运行 模型,它给我的结果都与我上次尝试的结果不同,我不知道为什么?由于使问题可重现相当困难,我无法 post 数据,但我可以 post 此处的网络架构:
def MLP(): #After 50
nn=30
nl=25
a=2
s=0
learn=2
learn_in=4.22220046e-05
max_i=1000
return nn,nl,a,s,learn,learn_in,max_i#,
def process(df):
y = df.iloc[:,-1]
X = df.drop(columns=['col3'])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=27)
return X_train, X_test, y_train, y_test
def MLPreg(x_train, y_train):#
nn,nl,a,s,learn,learn_in,max_i=MLP()#nl,
act=['identity', 'logistic', 'relu','tanh'] #'identity'=Linear
activ=act[a]
sol=['lbfgs', 'sgd', 'adam']
solv=sol[s]
l_r=['constant','invscaling','adaptive']
lr=l_r[learn]
model = MLPRegressor(hidden_layer_sizes=(nl,nn), activation=activ, solver=solv, alpha=0.00001, batch_size='auto',
learning_rate=lr, learning_rate_init=learn_in, power_t=0.5, max_iter=max_i, shuffle=True, random_state=None,
tol=0.0001, verbose=False, warm_start=False, momentum=0.9, nesterovs_momentum=True, early_stopping=False,
validation_fraction=0.1, beta_1=0.9, beta_2=0.999, epsilon=1e-08, n_iter_no_change=10, max_fun=15000)
model.fit(x_train, y_train)
return model
即使我试图保留所有使模型产生随机性的变量 Off
,但我在每个 运行 中收到不同的 mse
。
下面的新模型是最简单的版本。
def MLPreg(x_train, y_train):
model = MLPRegressor(hidden_layer_sizes=(100,),
activation='relu',
solver='adam',
alpha=0.0001,
batch_size='auto',
learning_rate='constant',
learning_rate_init=0.001,
power_t=0.4,
max_iter=100,)
model.fit(x_train, y_train)
return model
第一次mse
:
2.6935335013259937e-05
2.7836293087120013e-05
7.218691932722961e-05
4.950603795598673e-05
4.743424330664441e-06
第二次mse
:
3.6520542498579784e-06
1.151821946860996e-05
3.0840569586230768e-06
1.4008729128558944e-05
9.326142225670172e-06
以此类推
查看 MLPRegressor 的文档,这两个参数对于可重现的结果很重要:
shuffle:bool, default=True
Whether to shuffle samples in each
iteration. Only used when solver=’sgd’ or ‘adam’.
设置 shuffle=False
以在运行之间具有相同的行为。
random_state
: int, RandomState instance, default=None
Determines
random number generation for weights and bias initialization,
train-test split if early stopping is used, and batch sampling when
solver=’sgd’ or ‘adam’. Pass an int for reproducible results across
multiple function calls.
按照这些说明并为此参数设置一个 int 值。您的代码示例目前都没有这样做(一个将其设置为 None,这是不可重现的默认值,另一个将其省略)。
我编写了一个简单的神经网络(MLP 回归器)来适应简单的数据框列。为了获得最佳架构,我还将其定义为一个函数,以查看它是否正在收敛到一个模式。但是每次我 运行 模型,它给我的结果都与我上次尝试的结果不同,我不知道为什么?由于使问题可重现相当困难,我无法 post 数据,但我可以 post 此处的网络架构:
def MLP(): #After 50
nn=30
nl=25
a=2
s=0
learn=2
learn_in=4.22220046e-05
max_i=1000
return nn,nl,a,s,learn,learn_in,max_i#,
def process(df):
y = df.iloc[:,-1]
X = df.drop(columns=['col3'])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=27)
return X_train, X_test, y_train, y_test
def MLPreg(x_train, y_train):#
nn,nl,a,s,learn,learn_in,max_i=MLP()#nl,
act=['identity', 'logistic', 'relu','tanh'] #'identity'=Linear
activ=act[a]
sol=['lbfgs', 'sgd', 'adam']
solv=sol[s]
l_r=['constant','invscaling','adaptive']
lr=l_r[learn]
model = MLPRegressor(hidden_layer_sizes=(nl,nn), activation=activ, solver=solv, alpha=0.00001, batch_size='auto',
learning_rate=lr, learning_rate_init=learn_in, power_t=0.5, max_iter=max_i, shuffle=True, random_state=None,
tol=0.0001, verbose=False, warm_start=False, momentum=0.9, nesterovs_momentum=True, early_stopping=False,
validation_fraction=0.1, beta_1=0.9, beta_2=0.999, epsilon=1e-08, n_iter_no_change=10, max_fun=15000)
model.fit(x_train, y_train)
return model
即使我试图保留所有使模型产生随机性的变量 Off
,但我在每个 运行 中收到不同的 mse
。
下面的新模型是最简单的版本。
def MLPreg(x_train, y_train):
model = MLPRegressor(hidden_layer_sizes=(100,),
activation='relu',
solver='adam',
alpha=0.0001,
batch_size='auto',
learning_rate='constant',
learning_rate_init=0.001,
power_t=0.4,
max_iter=100,)
model.fit(x_train, y_train)
return model
第一次mse
:
2.6935335013259937e-05
2.7836293087120013e-05
7.218691932722961e-05
4.950603795598673e-05
4.743424330664441e-06
第二次mse
:
3.6520542498579784e-06
1.151821946860996e-05
3.0840569586230768e-06
1.4008729128558944e-05
9.326142225670172e-06
以此类推
查看 MLPRegressor 的文档,这两个参数对于可重现的结果很重要:
shuffle:bool, default=True
Whether to shuffle samples in each iteration. Only used when solver=’sgd’ or ‘adam’.
设置 shuffle=False
以在运行之间具有相同的行为。
random_state
: int, RandomState instance, default=NoneDetermines random number generation for weights and bias initialization, train-test split if early stopping is used, and batch sampling when solver=’sgd’ or ‘adam’. Pass an int for reproducible results across multiple function calls.
按照这些说明并为此参数设置一个 int 值。您的代码示例目前都没有这样做(一个将其设置为 None,这是不可重现的默认值,另一个将其省略)。