2017-10-10 76 views
0

我使用下面的代碼。我想爲同樣的隨機種子獲得相同的結果。我使用相同的隨機種子(在這種情況下爲1)並獲得不同的結果。 下面是代碼:爲什麼隨機種子不會在Python中使結果保持不變

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_split(dataset2,test_size = 0.1)'不具有隨機種子集。 – ShreyasG

回答

1

您的代碼:

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

設置Python的random-class的隨機種子。

但是sklearn是完全基於numpy的的random class,如explained here

爲了測試和可複製性,它具有由用於在所使用的僞隨機數生成器的單個種子控制整個執行常常是很重要具有隨機組件的算法。 Scikit-learn不使用自己的全局隨機狀態;每當RandomState實例或整數隨機種子不作爲參數提供時,它依賴於numpy全局隨機狀態,可以使用numpy.random.seed設置它。例如,設置一個執行的numpy的全局隨機狀態,以42,一個可以執行在他或她的腳本如下:

import numpy as np

np.random.seed(42)

所以一般你應該做的:

np.random.seed(1) 

但是,這只是事實的一部分,因爲在使用所有sklearn組件時要小心,這通常不需要,明確地調用th時間與一些種子!

喜歡ShreyasG提到的,這也適用於train_test_split

相關問題