我如何正确设置“random_state”以使我的结果始终相同?

问题描述 投票:0回答:2

例如,如果我有这段代码:

knn = KNeighborsClassifier()
grid_search_knn = GridSearchCV(
    estimator=knn,
    n_jobs=-1)

我必须这样设置吗:

knn = KNeighborsClassifier(random_state=42)

grid_search_knn = GridSearchCV(
    estimator=knn,
    n_jobs=-1
)

还是必须这样设置?

knn = KNeighborsClassifier(random_state=42)

grid_search_knn = GridSearchCV(
    estimator=knn,
    random_state=42,
    n_jobs=-1
)

正确的原因是什么?如果我使用随机搜索而不是网格搜索会怎样?

python machine-learning scikit-learn
2个回答
0
投票

在这种情况下,设置

random_state
取决于您使用的特定算法,而不是
GridSearchCV
RandomizedSearchCV
类。

对于

KNeighborsClassifier
,添加
random_state
实际上是不必要的,因为这个分类器是一种确定性算法,这意味着它不依赖随机性来进行预测。因此,它不会受到
random_state
参数的影响。结果:

  1. 对于

    KNeighborsClassifier
    您根本不需要在分类器或
    random_state
    /
    GridSearchCV
    中设置
    RandomizedSearchCV

  2. 对于随机算法:如果您使用的是涉及随机性的算法,例如决策树或随机森林,则可以在估计器中设置

    random_state
    (例如
    RandomForestClassifier(random_state=42)
    )。您不需要在
    random_state
    中设置
    GridSearchCV
    ,因为它只会影响交叉验证过程,这是确定性的。

总结:

  • 对于
    KNeighborsClassifier
    不需要
    random_state
  • 对于随机算法: 在估计器中设置
    random_state
    ,而不是在
    GridSearchCV
    /
    RandomizedSearchCV
    中。
  • 对于
    RandomizedSearchCV
    如果搜索本身是随机的并且您想要可重复性,则可以在那里设置
    random_state

0
投票

如上所述,对于

sklearn
,您可以为相关模型设置模型内的
random_state
参数。
GridSearchCV
还在交叉验证中使用了一些随机化,因此最好也修复模型和网格搜索中的种子:

grid_search_knn = GridSearchCV(
    estimator=KNeighborsClassifier(),
    cv=KFold(3, random_state=42),
    n_jobs=-1

)

grid_search_dt = GridSearchCV(
        estimator=DecisionTreeClassifier(random_state=42),
        cv=KFold(3, random_state=42),
        n_jobs=-1)

除此之外,如果您使用其他包来处理数据,您可能还想为它们设置种子:

import numpy as np
import random 

def set_random_seed(random_seed=42):
    """
    Set seed for hte random, numpy.random
    : param random_seed (int) : initial value for the random seed generators.
    """
    random.seed(random_seed)
    np.random.seed(random_seed)
    #torch.manual_seed(random_seed)


set_random_seed()

还有你的训练-测试分割:

Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=0.25, random_state=42)
© www.soinside.com 2019 - 2024. All rights reserved.