我正在尝试为使用scikit-learn的某些代码编写单元测试。但是,我的单元测试似乎是不确定的。
AFAIK,在我的代码中scikit-learn使用任何随机性的唯一地方是在其LogisticRegression
模型和train_test_split
中,因此我具有以下内容:
RANDOM_SEED = 5
self.lr = LogisticRegression(random_state=RANDOM_SEED)
X_train, X_test, y_train, test_labels = train_test_split(docs, labels, test_size=TEST_SET_PROPORTION, random_state=RANDOM_SEED)
但这似乎不起作用-即使当我通过固定的
docs
和固定的labels
时,固定验证集上的预测概率也因运行而异。我还尝试在代码顶部添加
numpy.random.seed(RANDOM_SEED)
调用,但这似乎也不起作用。我有什么想念的吗?有没有一种方法可以在一个地方将种子传递给scikit-learn,以便在scikit-learn的所有调用中都使用种子?
最佳答案
from sklearn import datasets, linear_model
iris = datasets.load_iris()
(X, y) = iris.data, iris.target
RANDOM_SEED = 5
lr = linear_model.LogisticRegression(random_state=RANDOM_SEED)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=RANDOM_SEED)
lr.fit(X_train, y_train)
lr.score(X_test, y_test)
现在已经制作了
0.93333333333333335
次。您的操作方式似乎还可以。另一种方法是set np.random.seed()
或将Sacred用于记录的随机性。使用random_state
是the docs describe:如果您的代码依赖于随机数生成器,则永远不要使用
numpy.random.random
或numpy.random.normal
之类的函数。这种方法可能导致单元测试中的可重复性问题。相反,应该使用numpy.random.RandomState
对象,该对象是根据传递给类或函数的random_state
参数构建的。