例如,如果我有这段代码:
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
)
正确的原因是什么?如果我使用随机搜索而不是网格搜索会怎样?
在这种情况下,设置
random_state
取决于您使用的特定算法,而不是 GridSearchCV
或 RandomizedSearchCV
类。
对于
KNeighborsClassifier
,添加random_state
实际上是不必要的,因为这个分类器是一种确定性算法,这意味着它不依赖随机性来进行预测。因此,它不会受到 random_state
参数的影响。结果:
对于
KNeighborsClassifier
: 您根本不需要在分类器或random_state
/GridSearchCV
中设置RandomizedSearchCV
。
对于随机算法:如果您使用的是涉及随机性的算法,例如决策树或随机森林,则可以在估计器中设置
random_state
(例如 RandomForestClassifier(random_state=42)
)。您不需要在 random_state
中设置 GridSearchCV
,因为它只会影响交叉验证过程,这是确定性的。
总结:
KNeighborsClassifier
: 不需要 random_state
。random_state
,而不是在 GridSearchCV
/RandomizedSearchCV
中。RandomizedSearchCV
: 如果搜索本身是随机的并且您想要可重复性,则可以在那里设置 random_state
。如上所述,对于
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)