为什么在Python中随机种子不能使结果保持恒定

3

我使用以下代码。我希望在相同的随机种子下获得相同的结果。但是,即使我使用相同的随机种子(在本例中为1),我仍然会得到不同的结果。

这是代码:

import pandas as pd
import numpy as np
from random import seed
# Load scikit's random forest classifier library
from sklearn.ensemble import RandomForestClassifier

from sklearn.model_selection import train_test_split
seed(1) ### <-----

file_path = 'https://archive.ics.uci.edu/ml/machine-learning-databases/undocumented/connectionist-bench/sonar/sonar.all-data'
dataset2 = pd.read_csv(file_path, header=None, sep=',')

from sklearn import preprocessing
le = preprocessing.LabelEncoder()

#Encoding
y = le.fit_transform(dataset2[60])
dataset2[60] = y
train, test = train_test_split(dataset2, test_size=0.1)
y = train[60] 
y_test = test[60] 
clf = RandomForestClassifier(n_jobs=100, random_state=0)
features = train.columns[0:59] 
clf.fit(train[features], y)

# Apply the Classifier we trained to the test data
y_pred = clf.predict(test[features])

# Decode 
y_test_label = le.inverse_transform(y_test)
y_pred_label = le.inverse_transform(y_pred)


from sklearn.metrics import accuracy_score
print (accuracy_score(y_test_label, y_pred_label))

# Two following results:
# 0.761904761905
# 0.90476190476

2
据我所见,代码行train, test = train_test_split(dataset2, test_size=0.1)没有设置随机种子。 - ShreyasG
1个回答

6

您的代码:

import numpy as np
from random import seed
seed(1) ### <-----

设置 Python 的 random-class 的随机种子。

但是,sklearn 完全基于 numpy 的 random class ,如此处所述

为了进行测试和可复制性,在具有随机化组件的算法中,控制整个执行过程由单个伪随机数生成器种子控制通常非常重要。Scikit-learn 不使用自己的全局随机状态;每当没有提供 RandomState 实例或整数随机种子作为参数时,它都依赖于 numpy 全局随机状态,可以使用 numpy.random.seed 进行设置。例如,要将执行的 numpy 全局随机状态设置为 42,可以在脚本中执行以下操作:

import numpy as np

np.random.seed(42)

因此,一般情况下应该这样做:

np.random.seed(1)

但这只是部分真相,因为如果对使用的所有sklearn组件小心谨慎地处理,并在调用它们时显式地带上种子,通常是不需要这个参数的!

正如 ShreyasG 所提到的,这也适用于 train_test_split


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接