【问题标题】:I get different results every time, how can I make my code reproducible?每次我得到不同的结果,我怎样才能让我的代码可重现?
【发布时间】:2021-03-30 11:27:24
【问题描述】:

我使用了极限学习机 (ELM) 算法。我有两个文件,一个用于训练数据集,一个用于测试数据集,我对数据进行了规范化。我每次都得到不同的结果,我该如何修正我的结果?

我的代码:

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from scipy.linalg import pinv2

#import dataset
train = pd.read_excel('INRStrai.xlsx')
test = pd.read_excel('INRStes.xlsx')

#scaler data
scaler = MinMaxScaler()
X_train = scaler.fit_transform(train.values[:,1:])
y_train = scaler.fit_transform(train.values[:,:1])
X_test = scaler.fit_transform(test.values[:,1:])
y_test = scaler.fit_transform(test.values[:,:1])

#input size
input_size = X_train.shape[1]

#Number of neurons
hidden_size = 300

#weights & biases
input_weights = np.random.normal(size=[input_size,hidden_size])
biases = np.random.normal(size=[hidden_size])

#Activation Function
def relu(x):
   return np.maximum(x, 0, x)

#Calculations
def hidden_nodes(X):
    G = np.dot(X, input_weights)
    G = G + biases
    H = relu(G)
    return H

#Output weights 
output_weights = np.dot(pinv2(hidden_nodes(X_train)), y_train)

#Def prediction
def predict(X):
    out = hidden_nodes(X)
    out = np.dot(out, output_weights)
    return out

#PREDICTION
prediction = predict(X_test)
   

【问题讨论】:

    标签: python numpy scikit-learn random-seed


    【解决方案1】:

    您在此处显示的代码中随机性的唯一来源是您的权重和偏差的初始化:

    #weights & biases
    input_weights = np.random.normal(size=[input_size,hidden_size])
    biases = np.random.normal(size=[hidden_size])
    

    因此,为了使此代码可重现,您唯一应该做的就是在初始化权重和偏差之前显式设置 Numpy 随机种子:

    seed = 42 # can be any number, and the exact value does not matter
    np.random.seed(seed)
    #weights & biases
    input_weights = np.random.normal(size=[input_size,hidden_size])
    biases = np.random.normal(size=[hidden_size])
    

    与您的问题无关,但我们从不使用fit_transform(或包括fit在内的任何东西)来测试数据 - 只需使用transform反而;您还应该为功能X 和标签y 使用2 个不同的缩放器:

    #scale data
    scaler_X = MinMaxScaler()
    scaler_Y = MinMaxScaler()
    # fit_transform for training data:
    X_train = scaler_X.fit_transform(train.values[:,1:])
    y_train = scaler_Y.fit_transform(train.values[:,:1])
    # only transform for test (unseen) data:
    X_test = scaler_X.transform(test.values[:,1:])
    y_test = scaler_Y.transform(test.values[:,:1])
    

    【讨论】:

    • 为什么当我将种子随机数从 42 更改为任何其他数字时,结果会改变? @desertnaut
    • @softangle 这是预期的行为,因为每次使用不同的随机数 - 请参阅Random seed in Machine learning model comparison。如果结果相同,就不需要显式设置随机种子了,对吧?
    猜你喜欢
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2020-02-22
    • 2022-06-13
    • 2021-02-26
    相关资源
    最近更新 更多