为cross_val_score设置随机状态不起作用

时间:2019-10-05 00:16:48

标签: python scikit-learn

我正在尝试进行3倍10倍交叉验证。问题是我不断从三个不同的迭代中获得相同的结果,这告诉我褶皱没有以不同的方式分开。为什么会这样,以及我如何才能使它每次都是随机的(或至少基于i)?

from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
import statistics as stats
import random
import numpy as np

X, y = make_classification(n_samples=1000, n_features=4,
                           n_informative=2, n_redundant=0,
                           random_state=0, shuffle=False)
print(X)
print(y)


CVScores = []
for i in range(0, 3):
    np.random.seed(i)
    ada = AdaBoostClassifier(n_estimators=100, random_state=np.random.RandomState(i))
    ada.fit(X, y)
    CVScores.extend(list(cross_val_score(ada, X, y, cv=10, scoring="f1")))
print(CVScores)
mean = stats.mean(CVScores)
print(mean)

2 个答案:

答案 0 :(得分:0)

您已在函数中定义了random_state。定义的random_state是“足够随机”的,但是为了产生可重复的实验而严格地确定性。请参阅关于随机状态的wiki-page,并可能会深入研究random seeds的理论。

  

random_state:int,RandomState实例或无(默认值)确定   用于创建数据集的随机数。传递一个int   在多个函数调用之间可重现的输出。请参阅词汇表。

为避免这种情况,要么根本不设置它(默认值为None,要么将其设置为none:random_state=None

答案 1 :(得分:0)

有一个函数可以解决这个问题。

from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score, KFold
import statistics as stats
import random
import numpy as np

X, y = make_classification(n_samples=1000, n_features=4,
                           n_informative=2, n_redundant=0,
                           random_state=0, shuffle=False)
print(X)
print(y)


CVScores = []
for i in range(0, 3):
    kf = KFold(n_splits=10, shuffle=True, random_state=i)
    kf.get_n_splits(X)
    ada = AdaBoostClassifier(n_estimators=100)
    ada.fit(X, y)
    CVScores.extend(list(cross_val_score(ada, X, y, cv=kf, scoring="f1")))
print(CVScores)
mean = stats.mean(CVScores)
print(mean)