我使用以下代码。我希望使用相同的随机种子获得相同的结果。我使用相同的随机种子(在本例中为 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
你的代码:
import numpy as np
from random import seed
seed(1) ### <-----
设置 python 的随机种子随机类别 https://docs.python.org/3/library/random.html.
但sklearn是完全基于numpy的随机类别 https://docs.scipy.org/doc/numpy/reference/routines.random.html, as 在这里解释 http://scikit-learn.org/stable/faq.html#how-do-i-set-a-random-state-for-an-entire-execution:
为了测试和可复制性,让具有随机组件的算法中使用的伪随机数生成器的单个种子控制整个执行通常很重要。 Scikit-learn 不使用自己的全局随机状态;每当没有提供 RandomState 实例或整数随机种子作为参数时,它就依赖于 numpy 全局随机状态,可以使用 numpy.random.seed 设置。例如,要将执行的 numpy 全局随机状态设置为 42,可以在他或她的脚本中执行以下命令:
import numpy as np
np.random.seed(42)
所以一般来说你应该这样做:
np.random.seed(1)
但这只是事实的一部分,因为当小心使用所有 sklearn 组件时,通常不需要这样做,用一些种子显式调用它们!
Like ShreyasG提到过,这也适用于训练测试分割 http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)